对于任何垃圾收集机制(gc),不可避免的一个问题是循环引用,即:
a引用b,b引用c,c引用a
因为自动收集机制大部分是通过引用计数来完成的,简单的引用机制在上述情况下会歇菜,因为a,b,c都被引用了所以简单的引用机制是不会将他们回收的。
那么lua的gc能不能处理循环引用呢?我们来做一个测试:
--启动gc回收并打印回收结果函数 function memColl() print("now collect") collectgarbage("collect") local c1 = collectgarbage("count") print("after collect , mem used is %d", c1) end --开始分配前 collectgarbage("collect") local c1 = collectgarbage("count") print("before new, mem used is %d", c1) --开始分配 local t = nil for i = 1, 1000000, 1 do --t通过t.v与t.v.tRef构成循环引用 t = {} t.v = {} t.v.tRef = t end local c2 = collectgarbage("count") print("after new, mem used is %d", c2) --多次回收 memColl() memColl() memColl() memColl()启动运行查看结果:
可以看到,内存是被回收了的,也就是说lua的gc是能处理循环引用的。
弱引用和循环引用不是一回事,lua中的弱引用有如下好处(摘录自他人的博客):
“