【GC Algorithm】标记-缩并算法
(文章参考21TO)
【概述】
标记-缩并算法是为了解决内存碎片问题而产生的一种算法。它的整个过程可以描述为:标记所有的存活对象;通过重新调整存活对象位置来缩并对象图;更新指向被移动了位置的对象的指针。
【难点】
如何选择所使用的压缩算法,如果压缩算法选择不好,将会导致极大的程序性能问题,如导致Cache命中率低等。
一般来说,根据压缩后对象的位置不同,压缩算法可以分为以下三种:
1. 任意:移动对象时不考虑它们原来的次序,也不考虑它们之间是否有互相引用的关系。
2. 线性:尽可能的将原来的对象和它所指向的对象放在相邻位置上,这样可以达到更好的空间局部性。
3. 滑动:将对象“滑动”到堆的一端,把存活对象之间的自由单元“挤出去”,从而维持了分配时的原始次序。
【个人评价】
本人觉得,这个算法的其实是Mark-sweep的改进版,改进的位置就是使用了一种压缩算法,目的就是为了减少内存碎片的问题,实际上在非语言级的GC算法中,我觉得压缩算法其实没有太大的关系,尤其是在面向对象的语言(前提:1.不是语言级GC;2.在面向对象这种语言中)。对于c++而言,设计出来的垃圾回收机制,重点应该落在回收方法,使得不会出现野指针、内存泄露等情况出现,而创建、回收的实现通常会使用语言自带的机制,如new、delete、malloc等等,内存碎片很多情况下不会出现,即使出现了,也是概率上很少而不会导致性能问题。