劍指Offer(GC)——老年代垃圾收集器

垃圾收集器之間的聯繫,本文主要講解一下老年代收集器。
在這裏插入圖片描述

Serial Old收集器(-XX:+UseSerialOldGC,標記-整理算法)

是Serial GC老年代版本,也是單線程的進行垃圾收集的時候必須暫停所有的工作線程,同樣是簡單高效,是Client模式下老年代的默認垃圾收集器。
在這裏插入圖片描述

Parallel Old收集器(-XX:+UseParallelOldGC,標記-整理算法)

是在JDK6之後出現的垃圾收集器,此之前只有Serial Old收集器,相對Serial Old收集器是多線程的並且以吞吐量爲優先原則。
在這裏插入圖片描述

CMS收集器(-XX:+UseConcMarkSweepGC,標記-清除算法)

此垃圾收集器幾乎能和用戶線程同時工作。

標記-清除分爲如下步驟:

  • 初始標記:stop-the-world
  • 併發標記:併發追溯標記,程序不會停頓;
  • 併發預清理:查找執行併發標記階段從年輕代晉升到老年代的對象;
  • 重新標記:暫停虛擬機,掃描CMS堆中的剩餘對象
  • 併發清理:清理垃圾對象,程序不會停頓;
  • 併發重置:重置CMS收集器的數據結構。
    在這裏插入圖片描述
    開始標記時候根據快照時候垃圾進行一遍清除,同時會產生新的垃圾,進行下一次和用戶線程的併發刷新,缺點是採用標記-清除算法,會產生內存碎片,存在OOM風險。

G1收集器(-XX:+UseG1GC,複製+標記-整理算法)

此垃圾收集器適用於新生代和老年代,和其他老年代垃圾收集器相比有如下的特點:

  • 併發和並行:使用多個CPU來減少stop-the-world停止時間,多線程是併發執行的;
  • 分代收集:使用不同方式去處理,新創建出來的對象產生垃圾和已存在一段時間的對象產生的垃圾;
  • 空間整合:通過標記整理解決內存碎片的問題;
  • 可預測的停頓:使用戶指定在GC上消耗的時間,不超過設定的時間。

使用此垃圾收集器之後整個Java堆內存被劃分成多個大小相等的Region,新生代和老年代不是物理隔離的。
在這裏插入圖片描述
不需要一個連續的內存空間決定哪個是新生代哪個是老年代。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章