深入JVM虛擬機之JVM有哪些常見的垃圾回收器?各自的特點是什麼?

Java發展至今,已經推出了好幾代垃圾收集器,包括SerialParNewParallelCMSG1以及Java11中最新的ZGC,每一代GC都對前一代存在的問題做出了很大的改善。

新生代使用的垃圾收集器主要有:

1.Serial收集器
 
2.ParNew收集器
 
3.Parallel scavenge收集器
 

Serial收集器:

1.單線程收集器在單核CPU架構下,JDK3之前新生代的回收器的唯一選擇

2.它與應用線程的執行是串行的,也就是說,執行應用線程的時候,不會執行GC,執行GC的時候,不能執行應用線程

 
 
 
 

ParNew收集器

1.就是serial回收器的多線程版本,有很多的代碼都是和serial收集器公用的

2.在進行回收的過程中仍然會暫停用戶線程(STW),然後利用多核CPU的能力,採用多線程方式進行垃圾回收

 
 

Parallel scavenge收集器

自適應調節策略:
 

老年代:

老年代使用的垃圾收集器主要有:

1.Seria-old收集器

2.Parallel Old收集器

3.CMS收集器

Seria-old收集器

1.serial收集器的老年代版本,同樣還是使用單線程進行垃圾回收
2.它存在的主要意義是JVM運行在client模式下配合新生代的serial收集器一起使用
3.它還可以作爲CMS垃圾回收器的後備垃圾回收器
 
 
 

Parallel Old收集器

1.這個回收器是Parallel scavenge的老年代版本,經常和Parallel scavenge一起使用在對內存比較敏感和對吞吐量比較高的場合下使用
2.使用多線程和“標記-整理”算法這個收集器是在JDK6中才開始提供
 

CMS收集器

1.CMSHotSpotJDK5推出的第一款真正意義上的併發(Concurrent)收集器,第一次實現了讓垃圾收集線程與用戶線程(基本上)同時工作

2.CMSConcurrent Mark Sweep)收集器是一種以獲取最短回收停頓時間爲目標的收集器

3.目前很大一部分的Java應用都集中在互聯網站或B/S系統的服務端上,這類應用尤其重視服務的響應速度,希望系統停頓時間最短,以給用戶帶來較好的體驗

 
CMS收集器具體的過程
1.初始標記:只標記根節點直接關聯的引用對象,需要暫停用戶線程(時間短)
2.併發標記:標記其他引用對象,可以跟用戶線程併發同時執行
3.重新標記:暫停用戶線程,對併發標記期間新增加的引用關係變化再次標記(時間短)
4.併發清除:跟用戶線程併發進行
 
 
 
 
CMS主要的有點提供了一個併發的能力,對用戶程序打擾較小。但是,也有一些顯而易見的缺點:

1.跟用戶線程競爭資源

2.在併發清除垃圾階段,由於用戶線程還在執行,要預留一定的空間給用戶線程進行使用,所以收集器一定不能在老年代已經佔用100%的情況下再進行垃圾收集(沒內存空間了)

3.因爲這個垃圾回收器是使用的標記-清除算法,所以會產生大量的內存碎片

CMS收集器的缺點的人工干預:

1.使用-XX:CMSInitiatingOccupancyFraction來指定老年代到達多少的時候觸發垃圾回收,JDK6之後默認爲92,就是在老年代的空間已經佔用92%的時候,就會觸發一次垃圾回收
 
2.這個值如果設置的太高就會出現併發清理的時候,用戶線程併發執行沒有足夠的空間分配對象而造成內存分配失敗的情況發生
 
 
3.如果發生分配失敗,則會出現Concurrent Model Failure,那麼老年代收集器就會自動轉換使用serialOld收集器進行回收,從而導致用戶線程的停頓時間變長,所以這個值設置的合理很重要
 
 

新一代垃圾回收器:G1(非常厲害)

1.空間整合:G1收集器採用標記-整理算法,不會產生內存空間碎片

2.它將整個Java堆劃分爲多個大小相等的獨立區域(Region),雖然還保留有新生代和老年代的概念,但新生代和老年代不再是物理隔閡了,它們都是一部分可以不連續Region的集合。紅色爲巨大的對象創建區域的。

 

默認垃圾回收器 

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