JVM垃圾收集器總結

HotSpot 虛擬機在 JDK 1.7 之後提供了7款垃圾收集器,分別是:

1.Serial收集器
2.ParNew收集器
3.Parallel Scavenge收集器.
4.Serial Old收集器
5.Parallel Old收集器
6.CMS收集器
7.G1收集器

其中Serial、ParNew和Parallel Scavenge是新生代垃圾收集器,而Serial Old、Parallel Old和CMS是老年代垃圾收集器,
G1收集器進行收集的範圍是整個java堆,包括新生代和老年代。

各個垃圾收集器的搭配情況如下:
在這裏插入圖片描述
下面對各個垃圾收集器進行總結:

1.Serial收集器

在JDK1.3之前是新生代手機的唯一選擇,這個收集器是一個單線程的收集器,但它的單線程的意義並不僅僅說明它只會使用一個CPU或一條手機線程去完成垃圾收集工作,更重要的是在它進行垃圾收集時,必須暫停其他所有的工作線程,直到它收集結束。
這個收集器是虛擬機運行在Client模式下的默認新生代收集器,它也有優於其他收集器的地方:簡單而高效,由於沒有線程交互的開銷,專心做垃圾收集自然可以獲得最高的單線程收集效率。

2.ParNew收集器

ParNew收集器其實就是Serial收集器的多線程版本,是許多運行在Server模式下的虛擬機中首選的新生代收集器,其中一個與性能無關但很重要的原因是,除了Serial收集器之外,目前只有它能與CMS收集器配合工作。
補充:ParNew收集器除了多線程外,其餘的行爲、特點和Serial收集器一樣。單線程下不如Serial,多線程下的話對系統資源的利用更有效。

3.Parallel Scavenge收集器

Parallel Scavenge收集器是一個並行的多線程的收集器,使用複製算法,看上去和ParNew一樣,但Parallel Scavenge收集器的目標是達到一個可控制的吞吐量。所謂吞吐量就是CPU用於運行用戶代碼的時間與CPU總消耗時間的比值,即吞吐量=運行用戶代碼時間/(運行用戶代碼時間+垃圾收集時間),虛擬機總共運行了100分鐘,其中垃圾收集花掉1分鐘,那吞吐量就是99%。
停頓時間短適合需要與用戶交互的程序,良好的響應速度能提升用戶體驗,而高吞吐量適合後臺運算。
由於與吞吐量關係密切,Parallel Scavenge收集器也經常被稱爲"吞吐量優先"收集器。而且自適應調節策略也是Parallel Scavenge收集器與ParNew收集器的一個重要區別。

Serial Old收集器

Serial Old是Serial收集器的老年代版本,它同樣是一個單線程收集器,使用"標記-整理"算法。這個收集器的主要意義也是在於給Client模式下的虛擬機使用。

5.Parallel Old收集器

在注重吞吐量以及CPU資源敏感的場合,都可以優先考慮Parallel Scavenge加Parallel Old收集器的組合。

6.CMS收集器

CMS收集器是一種以獲取最短回收停頓時間爲目標的收集器。

7.G1收集器

G1收集器的特點如下:
1.並行與併發:G1能充分利用多CPU、多核環境下的硬件優勢,使用多個CPU(CPU或者CPU核心)來縮短Stop-The-World停頓的時間,部分其他收集器原本需要停頓Java線程執行的GC動作,G1收集器仍然可以通過併發的方式讓Java程序繼續執行。
2.分代收集:G1可以不需要其他收集器配合就能獨立管理整個GC堆,並且還能獲得更好的收集效果。
3.空間整合:G1從整體來看是基於"標記-整理"算法實現的收集器,從局部上來看是基於"複製"算法實現的,能提供規整的可用內存。這種特性有利於程序長時間運行,分配大對象時不會因爲無法找到連續內存空間而提前觸發下一次GC。
4.可預測的停頓:這是G1相對於CMS的另一大優勢。
“CMS仍然是我現在的選擇,但是隨着Oracle對G1的持續改進,我相信G1會是最終的勝利者。如果你現在採用的收集器沒有出現問題,那就沒有任何理由去選擇G1,如果你的應用追求低停頓,那G1現在已經可以作爲一個可嘗試的選擇,如果你的應用追求吞吐量,那G1並不會爲你帶來什麼特別的好處”

---------------------------------------------------------- 分割線 ----------------------------------------------------------

cms和g1的區別:
一、使用範圍不一樣
CMS收集器是老年代的收集器,可以配合新生代的Serial和ParNew收集器一起使用。
G1收集器收集範圍是老年代和新生代,不需要結合其他收集器使用。
二、Stop The World的時間
CMS收集器以最小的停頓時間爲目標的收集器。
G1收集器可預測垃圾回收的停頓時間(建立可預測的停頓時間模型)
三、垃圾碎片
CMS收集器是使用“標記-清除”算法進行的垃圾回收,容易產生內存碎片。
G1收集器使用的是“標記-整理”算法,進行了空間整合,降低了內存空間碎片。
四、垃圾回收的過程不一樣
CMS:初始標記 --> 併發標記 --> 重新標記 --> 併發清除
G1: 初始標記 --> 併發標記 --> 最終標記 --> 篩選回收

對第三點的補充:有人會好奇爲什麼標記清理算法會產生內存碎片!但是CMS仍採用這種算法呢?因爲CMS作爲第一款實現用戶線程和收集線程併發執行的收集器,當時的設計理念是減少停頓時間,最好是能併發執行;但是問題來了,如要用戶線程也在執行,那麼就不能輕易的改變堆中對象的內存地址,不然會導致用戶線程無法定位引用對象,從而無法正常運行,而標記整理算法和複製算法都會移動存活的對象,這就與上面的策略不符,因此CMS採用的是標記清理算法。CMS失敗後使用備案Serial Old收集器。

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