GC之7大垃圾收集器详解(上)
GC之7大垃圾收集器詳解
目錄
1. GC之7大垃圾收集器概述
垃圾收集器具體實現GC算法并實現內存回收。不同廠商,不同版本的虛擬機實現差別很大,HotSpot中包含的收集器如下圖所示:
部分參數說明,下面會見到。
小擴展:Server/Client模式分別是什么意思
2. GC之Serial收集器
串行收集器:Serial收集器,一個單線程收集器,在進行垃圾收集時候,必須暫停其他所有的工作線程直到它收集結束
串行收集器是最古老,最穩定以及效率高的收集器,只使用一個線程去回收但其在進行垃圾收集過程中可能會產生較長的停頓(Stop-The-world狀態)。雖然在收集垃圾過程中需要暫停所有其他的工作線程,但是它簡單高效,對于限定單個CPU環境來說,沒有線程交互的開銷可以獲得最高的單線程垃圾收集效率,因此Serial垃圾收集器依然是Java虛擬機運行在Client模式下默認的新生代垃圾收集器。
對應JVM參數是:-XX:+UseSerialGC
開啟后會使用:Serial(young區用)+SerialOld(Old區用)的收集器組合(參考圖一)
表示:新生代、老年代都會使用串行回收收集器,新生代使用復制算法,老年代使用標記-整理算法
3. GC之ParNew收集器
ParNew(并行)收集器:使用多線程進行垃圾回收,在垃圾收集時,會Stop-the-World暫停其他所有的工作線程直到它收集結束。
ParNew收集器其實就是Seria收集器新生代的并行多線程版本,最常見的應用場景是配合老年代的CMS GC工作,其余的行為和Serial收集器完全一樣,ParNew垃圾收集器在垃圾收集過程中同樣也要暫停所有其他的工作線程。它是很多Java虛擬機運行在Server模式下新生代的默認垃圾收集器。
常用對應JVM參數:-XX:+UseParNewGC,啟用ParNew收集器,只影響新生代的收集,不影響老年代
開啟上述參數后,會使用:ParNew(Young區用)+SerialOld的收集器組合,新生代使用復制算法,老年代采用標記-整理算法
但是,ParNew+Tenured這樣的搭配,java8已經不再推薦:
-XX:ParallelGCThreads 限制線程數量,默認開啟和CPU數目相同的線程數。
4. GC之Parallel收集器
Parallel Scavenge收集器類似ParNew也是一個新生代垃圾收集器,使用復制算法,也是一個并行的多線程的垃圾收集器,俗稱吞吐量優先收集器。一句話:串行收集器在新生代和老年代的并行化
它重點關注的是:可控制的吞吐量〈Thoughput=運行用戶代碼時間/(運行用戶代碼時間+垃圾收集時間),也即比如程序運行100分鐘,垃圾收集時間1分鐘,吞吐量就是99%)。高吞吐量意味著高效利用CPU的時間,它多用于在后臺運算而不需要太多交互的任務。
自適應調節策略也是ParallelScavenge收集器與ParNew收集器的一個重要區別。(自適應調節策略:虛擬機會根據當前系統的運行情況收集性能監控信息,動態調整這些參數以提供最合適的停頓時間(-XX:MaxGCPauseMillis)或最大的吞吐量。
常用JVM參數:-XX:+UseParaIIeIGC或-XX:+UseParaIIeIOldGC(可互相激活)使用ParallelScanvenge收集器開啟該參數后:新生代使用復制算法,老年代使用標記·整理算法
補充:
-XX:ParaIIeIGCThreads=數字N,表示啟動多少個GC線程
cpu>8,N=5/8
cpu<8,N=實際個數
5. GC之ParallelOld收集器
ParallelOld收集器是ParaScavenge的老年代版本,使用多線程的標記-整理算法,Parallel Old收集器在JDKI.6才開始提供。
在JDK1.6之前,新生代使用ParallelScavenge收集器只能搭配年老代的SerialOld收集器,只能保證新生代的吞吐量優先,無法保證整體的吞吐量。
ParallelOld正是為了在年老代同樣提供吞吐量優先的垃圾收集器,如果系統對吞吐量要求比較高,JDK1.8后可以優先考慮新生代ParallelScavenge和年老代Parallel Old收集器的搭配策略。在JDK1.8及后(Parallel Scavenge+Parallel Old)
JVM常用參數:
-XX:+UseParallelOldGC使用ParallelOld收集器,設置該參數后,新生代Parallel+老年代ParallelOld
6. GC之CMS收集器
GC之CMS收集器和目錄下的內容,篇幅限制,放在另一篇博客具體講:GC之7大垃圾收集器詳解(下)
總結
以上是生活随笔為你收集整理的GC之7大垃圾收集器详解(上)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JVM之垃圾收集器回收种类
- 下一篇: GC之7大垃圾收集器详解(下)