3.4、分代收集算法
分代收集算法,可以看成以上内容的延伸。它的实现思路是根据对象的生命周期的不同,将内存划分为几块,比如把堆空间划分为新生代和老年代,然后根据各块的特点采用最适当的收集算法。
在新生代中,存在大批对象死去、少量对象存活的特点,会采用**“复制算法”,只需要付出少量存活对象的复制成本就可以完成垃圾对象收集,效率高;在老年代中,存在对象存活率高、没有额外空间对它进行分配担保的特点,会采用“标记-清理”或者“标记-整理”**算法来进行回收。
可以用如下图来概括堆内存的空间布局:
4.4.4、阶段四:并发清除
并发清除阶段的工作主要是对那些被标记为可回收的对象进行清理,在一般情况下,并发清除阶段是使用的是**“标记-清除”**算法,因为这个过程不会牵扯到对象的地址变更,所以 CMS 在并发清除阶段是不需要停止用户线程的,对象回收效率非常高。
与此同时,正因为并发清除阶段用户线程也可以同时运行,所以在用户线程运行的过程中自然也会产生新的垃圾对象,这也就是导致 CMS 收集器会产生“浮动垃圾”的原因,此时也会产生很多的空间碎片,当空间碎片到达了一定程度时,此时 CMS 就会使用**“标记-整理”**算法来解决空间碎片的问题。
https://cloud.tencent.com/developer/article/2396998