垃圾收集器詳解及參數配置

垃圾收集器詳解及參數配置

垃圾蒐集器簡介

垃圾蒐集器大體分爲如下三類

  • 串行蒐集器(serial collector):它只有一條GC線程,且就像前面說的,它在運行的時候須要暫停用戶程序(stop the world)。
  • 並行蒐集器(parallel collector):它有多條GC線程,且它也須要暫停用戶程序(stop the world)。
  • 併發蒐集器(concurrent collector):它有一條或多條GC線程,且它須要在部分階段暫停用戶程序(stop the world),部分階段與用戶程序併發執行。

hotspot中的垃圾蒐集器

  • 串行蒐集器的實現:serial(用於新生代,採用複製算法)、serial old(用於年老代,採用標記/整理算法
  • 並行蒐集器的實現:ParNew(用於新生代,採用複製算法)、Parallel Scavenge(用於新生代,採用複製算法)、Parallel old(用於年老代,採用標記/整理算法
  • 併發蒐集器的實現:concurrent mark sweep[CMS](用於年老代,採用標記/清除算法

垃圾收集器詳解

JVM啓動的兩種模式

  • client模式:開發時默認啓動模式
  • server模式:使用-server強制開啓server模式,

二者的主要區別:html

  • server模式下作了大量的優化工做。
  • server模式下應用啓動較慢,但在長時間運行狀況下,運行速度會愈來愈快。
  • client模式啓動快,但不適合長時間運行。

蒐集器詳解

名稱 算法 內存區域 執行方式 執行過程 特色 適用場景 開啓參數
Serial Garbage Collector 複製算法 針對新生代設計 單線程、串行 當新生代內存不夠用時,先暫停所有用戶程序,而後開啓一條GC線程使用複製算法對垃圾進行回收,這一過程當中可能會有一些對象提高到年老代 因爲單線程運行,且整個GC階段都要暫停用戶程序,所以會形成應用程序停頓時間較長,但對於小規模的程序來講,卻很是適合。 平時的開發與調試程序使用,以及桌面應用交互程序。 -XX:+UseSerialGC(client模式默認值)
Serial Old Garbage Collector 標記/整理算法 針對年老代設計 單線程、串行 同Serial Garbage Collector 同Serial Garbage Collector 同Serial Garbage Collector -
ParNew Garbage Collector 複製算法 針對新生代設計 多線程、並行 開啓若干條GC線程使用複製算法並行進行垃圾回收,這一過程當中可能會有一些對象提高到年老代 有幾個處理器就會開幾個線程(不過線程數是可使用參數-XX:ParallelGCThreads= 控制的),所以只適合於多核多處理器的系統 在中到大型的堆上,且系統處理器至少多於一個的狀況。對於單個處理器來講,因爲並行執行的開銷(好比同步),ParNew的性能將會低於serial蒐集器。 -XX:+UseParNewGC
Parallel Scavenge Garbage Collector 複製算法 針對新生代設計 並行 優先知足最大停頓時間的目標,次之是吞吐量,最後纔是新生代區域的最小值。 更精確的控制GC停頓時間以及吞吐量 適用場景 控制最大的停頓時間(使用-XX:MaxGCPauseMillis= ),以及控制吞吐量(使用-XX:GCTimeRatio= )server模式下默認的新生代蒐集器
Parallel Old Garbage Collector 標記/整理算法 年老代設計 並行蒐集器 - 它是除了serial old之外惟一一個能夠與parallel scavenge搭配工做的年老代蒐集器 - -XX:-UseParallelOldGC
Concurrent Mark Sweep Garbage Collector 標記/清除算法 年老代 - - 應用程序與GC線程一塊兒工做 - -

組合的威力

三種經典的組合

serial & serial old

client模式下默認的垃圾收集器組合,可經過-XX:+UseSerialGC強制開啓。很是適合運行於客戶端PC的小型應用程序,或者桌面應用程序(好比swing編寫的用戶界面程序),以及咱們平時的開發、調試、測試等。算法

開發、調試、測試共同的特色:多線程

  • 一、因爲都是在PC上運行,所以配置通常不會過高,或者說處理器個數不會太多。
  • 二、上面幾種狀況的應用程序都不會運行過久。
  • 三、規模不會太大,也就是說,堆相對較小,蒐集起來也比較快,停頓時間會比較短。

Parallel Scavenge & Parallel Old

這個組合是server模式下的默認組合(JDK6或JDK6以後),使用-XX:+UseParallelGC參數強制開啓。併發

適用於一些須要長期運行且對吞吐量有必定要求的後臺程序。jvm

運行於後臺的程序都有如下特色:性能

  • 一、系統配置較高,一般狀況下至少四核(以目前的硬件水平爲準)。
  • 二、對吞吐量要求較高,或須要達到必定的量。
  • 三、應用程序運行時間較長。
  • 四、應用程序規模較大,通常是中到大型的堆。

ParNew & CMS(Serial Old做爲替補)

它則是對響應時間(response time)要求較高的應用程序的首選,使用參數-XX:+UseConcMarkSweepGC開啓。測試

新生代採用並行蒐集器優化

適用於一些須要長期運行且對相應時間有必定要求的後臺程序。線程

採用ParNew & CMS組合的後臺應用程序,通常都對相應時間有必定要求,最典型的就是咱們的WEB應用程序設計

垃圾蒐集器參數精解

垃圾蒐集器選擇參數

名稱 說明 備註
UseSerialGC 開啓此參數使用serial & serial old蒐集器(client模式默認值)。
UseParNewGC 開啓此參數使用ParNew & serial old蒐集器(不推薦)。
UseConcMarkSweepGC 開啓此參數使用ParNew & CMS(serial old爲替補)蒐集器。
UseParallelGC 開啓此參數使用parallel scavenge & parallel old蒐集器(server模式默認值)。
UseParallelOldGC 開啓此參數在年老代使用parallel old蒐集器(該參數在JDK1.5以後已無用)。

JVM各個內存區域大小相關參數

名稱 說明 備註
Xms 堆的初始值。默認爲物理內存的1/64,最大不超1G。
Xmx 堆的最大值。默認爲物理內存的1/4,最大不超1G。
Xmn 新生代的大小。
Xss 線程棧大小。
PermSize 永久代初始大小。默認爲物理內存的1/64,最大不超1G。
MaxPermSize 永久代最大值。默認爲物理內存的1/4,最大不超1G。
NewRatio 新生代與年老代的比例。好比爲3,則新生代佔堆的1/4,年老代佔3/4。
SurvivorRatio 新生代中調整eden區與survivor區的比例,默認爲8,即eden區爲80%的大小,兩個survivor分別爲10%的大小。

垃圾蒐集器性能通用參數

名稱 說明 備註
PretenureSizeThreshold 晉升年老代的對象大小。默認爲0,好比設爲10M,則超過10M的對象將不在eden區分配,而直接進入年老代。
MaxTenuringThreshold 晉升老年代的最大年齡。默認爲15,好比設爲10,則對象在10次普通GC後將會被放入年老代。
DisableExplicitGC 禁用System.gc()。

並行蒐集器參數

名稱 說明 備註
ParallelGCThreads 回收時開啓的線程數。默認與CPU個數相等。
GCTimeRatio 設置系統的吞吐量。好比設爲99,則GC時間比爲1/1+99=1%,也就是要求吞吐量爲99%。若沒法知足會縮小新生代大小。
MaxGCPauseMillis 設置垃圾回收的最大停頓時間。若沒法知足設置值,則會優先縮小新生代大小,仍沒法知足的話則會犧牲吞吐量。

併發蒐集器參數

名稱 說明 備註
CMSInitiatingOccupancyFraction 觸發CMS收集器的內存比例。好比60%的意思就是說,當內存達到60%,就會開始進行CMS併發收集。
UseCMSCompactAtFullCollection 在每一次CMS收集器清理垃圾後送一次內存整理。
CMSFullGCsBeforeCompaction 設置在幾回CMS垃圾收集後,觸發一次內存整理。

整理自:

相關文章
相關標籤/搜索