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,
Lua5.4 分代gc 的理解
最新推荐文章于 2025-05-25 19:45:11 发布