Lua5.4 分代gc 的理解

本文介绍了Lua5.4中的分代垃圾收集(GC)机制,对比了GC与引用计数(RC)的区别,强调了GC在处理短期对象上的优势。文章详细阐述了分代GC的必要性,以及Lua5.4与5.2在分代GC上的差异,指出5.4版中对象需要活过两轮GC才能成为老年代,以减少临时变量的干扰。分代GC的主要目标是降低全量扫描的成本,通过区分新生代和老年代对象进行局部GC,提高效率。文章还讨论了GC的触发条件、GC状态的变化及其配合过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.为什么使用的是 GC 而不是 RC?
  可以这样说,GC (garbage collection) 把 RC (reference counting) 中那些短期对象的销毁代价转嫁到了一次性的标记清除过程。这把逻辑处理和资源管理正交分解了。这种被分解的问题,会随着硬件的进步更容易提高性能(比如多核的发展)。但是,在较小规模的软件或独立模块中,这个优势并不会太明显。反而 GC 本身远高于 RC 的复杂性,会成为其软肋。
  参考云风的博客: https://blog.codingnow.com/2008/06/gc.html
2.为什么要使用分代gc?
  根据局部性原理(计算机能发展到现在阶段,最主要的就是依赖局部性原理,例如虚拟内存),一个对象在某个时间点被访问了,那么接下来的一段时间内会重复的访问该对象。
  那么如果使用Lua5.2中的四色标记法,每次都会将此轮gc中未被使用的对象回收掉,但是这些对象可能是在上一轮存活过的,那么极可能在接下来的一段时间还会多次访问到(即使这次没访问),那么就不应该那么快的回收掉,从而下次还需要申请内存来创建。
3.Lua5.2已经有第一版本的分代gc了,它Lua5.4的分代有何不同?
  最主要的区别在于,Lua5.2版本的gc的老年代对象的判定是存活过一轮即可成为老年代,从而导致大量的临时变量都成为了老年代而不会在下一次局部gc的时候回收掉,这样的话内存增长跟分步gc没什么区别,所以会比较频繁得切换回分步gc进行全量的gc;而在Lua5.4中,只有当一个对象成功得活过两轮gc才会被标记未老年代,这样有效得避免了临时变量的干扰。
4.分代GC主要的目的是实现什么作用?
  最主要的功能是,避免每次都进行全量扫描,只对新生代的对象进行扫描,这样可以降低扫描成本从而减少GC成本。
5.开启分代GC模式:
  在初始化完lvm时,显示调用 lua_gc(L, LUA_GCGEN, 0,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值