天天看點

GC之垃圾收集器

JVM運作模式

  • Server (啟動慢,穩定後快)
  • Client

年輕代常見的垃圾收集器

Serial收集器(複制算法)

單線程收集,進行垃圾收集時,必須暫停所有的工作線程

簡單高效,Cilent模式下預設的年輕代收集器

ParNew收集器(複制算法)

多線程收集,其餘行為和Serial一樣

單核執行效率不如Serial,再多核下執行才有優勢

Parallel Scavenge收集器(複制算法)

吞吐量 = 運作使用者代碼時間/(運作使用者代碼時間+垃圾收集時間)

比起關注使用者線程停頓時間,更關注系統吞吐量

在多核下執行才有優勢,Server模式下預設的年輕代收集器

老年代常見的收集器

Serial Old收集器(标記-整理算法)

單線程收集,進行垃圾收集時,必須暫停所有的工作線程

簡單高效,Cilent模式下預設的老年代收集器

Parallel Old收集器(标記整理算法)JDK6之後提供

比起關注使用者線程停頓時間,更關注系統吞吐量

CMS收集器(标記-清除算法)

初始化标記:stop-the-world

并發标記:并發追溯标記,程式不會停頓

并發預處理:查找執行并發标記階段從年輕代晉升到老年代的對象

重新标記:暫停虛拟機,掃描CMS堆中的剩餘對象

并發清理:清理垃圾對象,程式不會停頓

并發重置:重置CMS收集器的資料結構

G1(Garbage First)收集器(複制+标記-整理算法)

并發和并行

分代收集

空間整合

可預測的停頓

将整個Java堆劃分為多個大小相等的Region

年輕代和老年代不在實體隔離

Epsilon GC 和ZGC處于研發階段(JDK11)