簡述一下JAVA中JVM使用的常見垃圾收集方法和技術。
垃圾標記方法
- 引用計數
- 可達性分析
垃圾收集方法
- 標記-清除
標記對象後統一回收,存在回收效率和內存碎片的問題。 - 標記-複製
將存活對象統一移動到另一部分內存空間裏去,問題是內存可用率降低。 - 標記-整理
移動存活對象向空間的某一端然後釋放邊界外空間,問題是計算負擔較大。
垃圾收集器
- Serial :早期新生代垃圾收集器,簡單高效內存消耗小但是存在停頓時間長的問題。
- ParNew :Serial收集器的多線程版本
- Parallel Scavenge : 基於標記-清除的多線程新生代收集器。相比於ParNew增加了吞吐量控制(即保證垃圾收集時間與用戶代碼執行時間等於某個比例)。
- Parallel Old :Parallel Scavenge的老年代版本,基於標記-整理。
- CMS :通過初始標記、併發標記、重新標記、併發清除四個步驟降低停頓時間,其中併發標記和併發清除不需要停頓用戶線程,重新標記是用來修正併發標記期間多線程導致的標記對象變動。
- G1(Garabge First) : 將java堆劃分成多個大小相等的Region,通過優先級列表以實現最高效回收。相比CMS,G1更接近“標記-整理”算法。
- Shenandoah :支持併發標記、併發回收、併發引用更新,具有比G1更好的性能。
- ZGC :使用染色體指針(Colored Pointer)極大降低了停頓時間,但也因此導致ZGC管理的內存不能超過4TB,但由於其出色的性能使得ZGC是未來的首選收集器之一。
我的微信鏈接 ,歡迎關注交流 JVM技術點速記 | 垃圾收集與內存分配