老生代内存是用于保存生命周期较长或常驻内存的对象,占用的内存较多。Chrome V8和Node.js的老生代内存空间都很大,因此它们的垃圾回收机制采用了Mark-Sweep和Mark-Compact的结合体,
主要采用Mark-Sweep。当老生代空间不足以分配从新生代晋升过来的对象时,才使用Mark-Compact。 1. Mark-Sweep(标记清除) - 标记:在标记阶段需要遍历老生代堆中的所有对象,并标记那些活着的对象,然后进入清除阶段。 - 清除:在清除阶段,Chrome V8只清除没有被标记的对象。由于标记清除只清除死亡对象,而死亡对象在老生代中占用的比例通常较小,因此其效率还是比较高的。
可以想象你在一筐苹果中挑出两三个烂苹果,还是很快的,至少比从一筐苹果中挑出半筐烂苹果要快得多。 2. Mark-Compact(标记整理) 在标记清除时,容易产生内存碎片的问题。所以Mark-Compact在标记清除的基础上进行修改,在清除的时候让它们变得紧缩。
这相当于在清除的时候,让活着的剩余对象尽可能往内存区域的前面靠,直到内存区域前排全部排满,而后部区域是空的。标记整理的过程涉及内存区域的紧缩,所以其效率其实比标记清除要低。不过其优势是不会产生内存碎片。 3. 惰性清理 在标记时,哪些对象是死的,哪些对象是活的,Chrome V8已经掌握了。但是清理释放是需要开销的,所以Chrome V8并不急着去清理,而是延迟进行。垃圾回收器可以根据自身需要来清理死掉的对象。
标签:标记,对象,清除,Mark,内存,老生 From: https://www.cnblogs.com/angdh/p/17771844.html