垃圾收集器

首先需要說明一點的是,本章雖然介紹了幾種垃圾收集器,但並不是爲了說明哪個收集器好,哪個收集器不好的,因爲目前爲止還沒有哪個收集器可以完全取代其它的收集器的,如果有的話,HotSpot虛擬機也不會實現那麼多不同的收集器了。

1 Serial收集器

Serial是最基本、發展歷史最悠久的收集器,是一個單線程的收集器,不僅僅體現在它只會使用一個CPU或者一條線程去回收垃圾,而且當它在回收垃圾的時候,其它所有正在工作的線程必須暫停,直到它收集結束,也就是所謂的“Stop The World”。我們可以想想一下,當我們的程序每運行一段時間後,就會突然暫停5分鐘進行垃圾回收,然後再運行,再暫停…你可以想象一下是什麼樣的場景,不過也有人說是可以理解的,比如說:當你媽媽正在打掃房間垃圾的時候,肯定不會允許你亂扔垃圾的。serial收集器依然是虛擬機運行在Client模式下默認新生代垃圾收集器,它的優點是:由於它是單線程的,所以只需要專心的做垃圾回收這件事就可以了,簡單高效。
Serial收集器在新生代採用複製算法,老年代採用標記-整理算法。

2 ParNew收集器

ParNew收集器就是serial收集器的多線程版本,與Serial收集器對比,沒有太多的創新點,它是許多運行在Service模式下的虛擬機中首選的新生代收集器,其中一個與性能無關卻很重要的原因是,除了Serial收集器外,目前只有它可以和CMS收集器配合工作。在單線程的環境下,由於考慮到線程交互,ParNew收集器的不能百分之百的保證超越Serial收集器。

3 Parallel Scavenge收集器

Parallel Scavenge收集器是一個新生代收集器,也是採用複製算法,是一個並行的多線程收集器,它的特點是關注點與其它收集器不同,它主要是關注吞吐量(吞吐量=CPU運行用戶代碼時間/(CPU運行用戶代碼時間+垃圾回收時間)),有兩個重要的參數-XX:MaxGCPauseMillis最大停頓時間和-XX:GCTimeRatio設置吞吐量大小。
第一個參數是一個大於0的毫秒值,收集器會儘可能的在規定時間內完成垃圾回收,不過是以犧牲吞吐量和新生代空間的,所以不是越小越好,第二個參數是一個大於0小於100的證書,相當於吞吐量的倒數。
還有一個參數:-XX:+UseAdaptiveSizePolicy,這是一個開關參數,當打開之後,就不需要手動指定其它的一些細節問題,就是所謂的GC自適應調節策略,這也是Parallel Scavenge收集器與ParNew收集器的一個重要區別。

4 Serial Old收集器

Serial Old是Serial收集器的老年代版本,也是一個單線程的收集器,使用“標記-整理”算法。

5 Paraller Old收集器

Paraller Old是Paraller Scavenge收集器的老年代版本,使用多線程和“標記-整理”算法。

6 CMS收集器

CMS垃圾收集器是一種以獲取最短停頓時間爲目標的收集器,採用“標記-清除”算法。運行過程大致分爲4個過程:

  • 初始標記
  • 併發標記
  • 重新標記
  • 併發清除

優點:併發收集、低停頓。
缺點:對CPU資源非常敏感;無法處理浮動垃圾;會產生大量的內存碎片。

7 G1收集器

G1收集器是一款面向服務端應用的垃圾收集器,具有以下特點:

  • 並行和併發
  • 分代收集
  • 空間整合
  • 可預測的停頓

G1收集器在工作時,是將java堆劃分爲多個大小相等的獨立區域(Region),大致可分爲以下幾個步驟:

  • 初始標記
  • 併發標記
  • 最終標記
  • 篩選回收
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章