cocos2dx 内存管理机制
垃圾回收(GC)
在内存中不在使用的或者没有指针再指向的内存空间称为“垃圾”,将这些垃圾收集起来再次利用的机制称为垃圾回收机制。垃圾占用的内存需要及时地释放,否则就会引起「内存泄露」。有些语言需要程序员来手动释放内存、回收垃圾,有些语言有垃圾回收机制(GC)。本文就来讨论GC实现的三种基本方式。目前比较常用的几种垃圾回收机制为 计数引用、标记清除法、子节点复制法。还有一些基于这些机制的扩展算法。
-
计数引用
计数引用是指,针对每一个对象,保存每一个对象的引用计数,该对象的引用增加,则该对象的引用计数也增加,该对象的引用减少则该对象的引用计数也减少,如果该对象的引用计数为0,则对象就变为“垃圾”,则该回收该对象。
优点:最大优势就是容易实现,二是成本开销小。三是中断时间小。基本上引用计数0的对象会被立即回收,释放内存,不像其他的机制因为无法预测对象的声明周期,需要特定的时间,所以垃圾存在的时间长,另一方面正式因为垃圾回收可以穿插在程序的运行中,避免一些程序的中断。缺点:一、这种回收垃圾的机制,无法对循环引用的无用对象进行回收。二、计数引用不适合在并行中使用,多个线程同时操作计数引用,会引起数值不一样的问题导致内存错误。所以计数引用必须是独占方式。如果引用操作频繁,那么加锁等并发控制机制的开销也是相当大的。
-
标记清除法(mark & sweep)
顾名思义,就是标记和清除两个步骤。当堆中的有效内存空间被耗尽的时候,会停止整个程序,然后进行标记、清除两个步骤。
标记:遍历所有的GC Roots,然后将GC Roots可达的对象标记为存活的对象。
清除:将遍历堆中的所有对象,将没有标记的对象全部清除。
需要对对象进行两次扫描,第一次从根root开始扫描,被根引用了的对象标记为不是垃圾,不是垃圾的对象引用的