美文网首页
Lua垃圾回收机制和弱引用table

Lua垃圾回收机制和弱引用table

作者: 凉拌姨妈好吃 | 来源:发表于2018-06-28 16:54 被阅读0次

1. 前言

Lua采用了自动内存管理,我们不需要删除对象,Lua会自动地删除那些已经成为垃圾的对象、
最重要的就是!当我们在纠结c++在回收时的环形引用问题时,Lua早就走在了前面,它没有环形引用问题,当要用到环形结构时,也能被正常回收。
垃圾回收器只会回收它认为是垃圾的东西,所以当我们使用栈的时候就会出现一个问题:我们以为我们不再使用的对象被回收了,但是其实它还没有被回收。原因如下:栈通常是由一个数组和一个表示顶部的索引来实现的,这个数组的的有效部分总是向顶部扩展,当我们弹出一个数据时,只是将顶部索引递减,而那个数据仍留在数组中,那么这对于Lua来说就不是垃圾。同理,那些全局变量,虽然不再使用了,但是仍然不是垃圾,需要用户手动将它们赋值为nil,Lua才会释放它们。

2. 弱引用table

当我们数组中引用了一个对象,那么这个对象就无法被回收。为了解决这个问题,Lua引入了弱引用table。

2.1 什么是弱引用

弱引用就是会被垃圾回收器忽视的对象引用,如果一个对象的引用都是弱引用,那么这个对象就可以被回收了

2.2 弱引用table的种类

正常情况下,table的key和value都是强引用的。
所以提出了三种弱引用table

  • 具有弱引用key的table
  • 具有弱引用value的table
  • 同时具有两种弱引用的table
2.3 弱引用table的实现

它往往是通过元表中的__mode字段来决定的。
如果这个字段的值包含字母"k",是弱引用key
如果这个字段的值包含字母"v",是弱引用value


弱引用table的实现

Lua只会回收弱引用table中的对象,数字和布尔值以及字符串是不可回收的。

2.4 弱引用table在对象属性中的实现方式

当我们不想将对象属性存储在table中,想保持属性的私有性,我们可以将对象作为key,属性作为key的value,又因为key为对象,此时就会出现该对象无法回收的情况,所以这时候弱引用table有用处啦

3. 垃圾回收器

我先简述一下垃圾回收器的流程,后面的源码分析留到下一个博文再来讲
Lua的垃圾回收周期共分为四个阶段:标记、整理、清扫、收尾
在标记阶段,Lua会首先将根集合中的对象标记为活跃,然后将任何程序可以通过根节点访问到的对象也标记为活跃。
在整理阶段,Lua会遍历所有的userdata,找出未被标记且有gc元方法的userdata,将它们标记为活跃,并放入单独的列表中。再根据所有的弱引用table删除其未被标记的key和value。
在清扫阶段,Lua遍历所有对象,如果当前对象未被标记,就收集它,否则清除它的标记。
在收尾阶段,根据上面生成的userdata列表来调用终结函数

相关文章

  • Lua垃圾回收机制和弱引用table

    1. 前言 Lua采用了自动内存管理,我们不需要删除对象,Lua会自动地删除那些已经成为垃圾的对象、最重要的就是!...

  • Lua内存泄露检查

    lua中支持垃圾回收机制的对象有五种:string,table,function,full userdata,th...

  • lua弱引用 使用注意

    lua的弱引用 使用 lua弱引用一般是通过table来实现的 如:locala={} setmetatable(...

  • android面试点

    java相关: 1.垃圾回收机制 2.软引用、弱引用、强引用 3.反射 4.线程同...

  • java 弱引用

    强引用:不仅能引用到对象,而且告诉垃圾回收器不能回收; 软引用:引用到对象,内存不足时垃圾回收器可以回收; 弱引用...

  • Chrome-垃圾回收

    垃圾回收机制 在Chrome存在垃圾回收机制,用于回收内存。 引用计数 引用计数就是跟踪记录每个值被引用的次数,当...

  • python面试题(五)

    1、简述python引用计数机制(联想到垃圾回收机制)python垃圾回收主要以引用计数为主,标记-清除和分代清除...

  • Python 垃圾回收学习

    垃圾回收机制一般有两个阶段:垃圾检测和垃圾回收。Python GC 主要使用引用计数来跟踪和垃圾回收。在引用计数的...

  • lua-弱表

    弱表是是具有弱引用的表,如果只有弱引用,垃圾收集器会回收这些对象。弱表可以有弱键或者弱值,如果具有弱键,垃圾回收器...

  • 引用类型

    参考博客:参考博客 类型: 强引用: 垃圾回收器不会回收 软饮用: 垃圾回收器在内存不够用的时候回收, 弱引用: ...

网友评论

      本文标题:Lua垃圾回收机制和弱引用table

      本文链接:https://www.haomeiwen.com/subject/xblgyftx.html