zoukankan      html  css  js  c++  java
  • lua学习笔记(十二)

    弱引用table

        lua使用自动内存管理机制,通过垃圾回收器来回收内存
        垃圾回收器只能回收它认为是垃圾的内容,而不能回收用户认为是垃圾的内容
        典型的例子栈,栈一般用一个数组和一个表示顶部的索引值表示
        如果弹出一个元素,那么仅是把栈顶索引减一,
        但这个元素还留在内存在被这栈数组引用着,所以垃圾回收器不知道它是垃圾
        全局变量和table里的内容会被垃圾回收器回收,只能手动置为nil
        因此需要一种与回收器可以协作的机制,这就是弱引用(weak reference)
        lua里用弱引用table(weak table)来实现这个机制
        3种弱引用table
            1.具有弱引用key的table
            2.具有弱引用value的table
            3.同时具有弱引用key和弱引用value的table
        无论是哪种类型的弱引用table,只要有一个key或value被回收了
        那么他们所在的整个条目都会从table中删除
        table的弱引用类型通过其元表中的__mode字段来决定,这个字段是一个字符串
           1.__mode字段中如果包含"k"则是key的弱引用
           2.__mode字段中如果包含"v"则是value的弱引用
           3.__mode字段中包含"k"和"v"则是key、value的弱引用
                a={}
                b={__mode="k"}
                setmetatable(a,b)    --table a的key就是弱引用
                key={}               --创建第一个key 
                a[key]=1
                key={}               --创建第二个key
                a[key]=2
                collectgarbage()     --强制进行一次垃圾收集 
                for k,v in pairs(a) do print(v) end
                --> 2
        第二次key={}会覆盖第一个key,这时再没有对第一个key的引用了,所以会回收
        第二个key由于还被变量key引用,所以不会回收
        lua只会回收用弱引用table中的对象
        如果key是number、boolean、string则不会回收,所以上例中用table来当key
        可以使用弱引用table来实现缓存等机制,热数据不会被回收,不用的数据自动释放
     
  • 相关阅读:
    .Net内存回收
    select rank() over
    Android中如何区分界面组件创建和销毁的类型
    Thread和Runnable的区别
    Intent对象若干数据项的含义总结
    libcurl用法
    Hadoop 使用Combiner提高Map/Reduce程序效率
    Struts2中的get、set方法作用:
    struts2 使用jsonplugin
    struts.custom.i18n.resources国际化详解(一)
  • 原文地址:https://www.cnblogs.com/lifesteven/p/4169417.html
Copyright © 2011-2022 走看看