Lua5.2采用垃圾回收机制对所有的lua对象(GCObject)进行管理。Lua虚拟机会定期运行GC,释放掉已经不再被被引用到的lua对象。
基本的垃圾回收算法被称为"mark-and-sweep"算法。算法本身其实很简单。
首先,系统管理着所有已经创建了的对象。每个对象都有对其他对象的引用。root集合代表着已知的系统级别的对象引用。我们从root集合出发,就可以访问到系统引用到的所有对象。而没有被访问到的对象就是垃圾对象,需要被销毁。
我们可以将所有对象分成三个状态:
当前所有对象都是White状态; 将root集合引用到的对象从White设置成Gray,并放到Gray集合中; while(Gray集合不为空) { 从Gray集合中移除一个对象O,并将O设置成Black状态; for(O中每一个引用到的对象O1) { if(O1在White状态) { 将O1从White设置成Gray,并放到到Gray集合中; } } } for(任意一个对象O){ if(O在White状态) 销毁对象O; else 将O设置成White状态; }
首先标识所有的root对象:
当前所有对象都是White状态; 将root集合引用到的对象从White设置成Gray,并放到Gray集合中;
遍历访问所有的gray对象。如果超出了本次计算量上限,退出等待下一次遍历:
<p>while(Gray集合不为空,并且没有超过本次计算量的上限)</p>{ 从Gray集合中移除一个对象O,并将O设置成Black状态; for(O中每一个引用到的对象O1) { if(O1在White状态) { 将O1从White设置成Gray,并放到到Gray集合中; } } }
for(任意一个对象O){ if(O在White状态) 销毁对象O; else 将O设置成White状态; }