3.4、分代收集算法
分代收集算法,可以看成以上內容的延伸。它的實現思路是根據對象的生命周期的不同,將內存劃分為幾塊,比如把堆空間劃分為新生代和老年代,然后根據各塊的特點采用最適當的收集算法。
在新生代中,存在大批對象死去、少量對象存活的特點,會采用**“復制算法”,只需要付出少量存活對象的復制成本就可以完成垃圾對象收集,效率高;在老年代中,存在對象存活率高、沒有額外空間對它進行分配擔保的特點,會采用“標記-清理”或者“標記-整理”**算法來進行回收。
可以用如下圖來概括堆內存的空間布局:
4.4.4、階段四:并發清除
并發清除階段的工作主要是對那些被標記為可回收的對象進行清理,在一般情況下,并發清除階段是使用的是**“標記-清除”**算法,因為這個過程不會牽扯到對象的地址變更,所以 CMS 在并發清除階段是不需要停止用戶線程的,對象回收效率非常高。
與此同時,正因為并發清除階段用戶線程也可以同時運行,所以在用戶線程運行的過程中自然也會產生新的垃圾對象,這也就是導致 CMS 收集器會產生“浮動垃圾”的原因,此時也會產生很多的空間碎片,當空間碎片到達了一定程度時,此時 CMS 就會使用**“標記-整理”**算法來解決空間碎片的問題。
https://cloud.tencent.com/developer/article/2396998