JAVA垃圾收集器之概說
1、垃圾收集器的組合
JAVA垃圾收集器一共有7個,減去還沒有正式大規模使用的G1,還有6個,其中新生代3個,老生代3個。
因為垃圾收集器都是一組一組的工作,這6個收集器一共構成了5中使用模式。
參數 |
描述 |
-XX:+UseSerialGC |
Jvm運行在Client模式下的預設值,開啟此開關後,使用Serial + Serial Old的收集器組合進行記憶體回收 |
-XX:+UseParNewGC |
開啟此開關後,使用ParNew + Serial Old的收集器進行記憶體回收 |
-XX:+UseConcMarkSweepGC |
使用ParNew + CMS + Serial Old的收集器組合進行記憶體回收,Serial Old作為CMS出現“Concurrent Mode Failure”失敗後的後備收集器使用。 |
-XX:+UseParallelGC |
Jvm運行在Server模式下的預設值,開啟此開關後,使用Parallel Scavenge + Serial Old的收集器組合進行回收 |
-XX:+UseParallelOldGC |
使用Parallel Scavenge + Parallel Old的收集器組合進行回收 |
我自己閱讀周志明先生的著作《深入理解JAVA虛擬機器》,其中3.4章節(55頁)有一張垃圾收集器的圖。其中新生代的serial收集器和老生代的CMS收集器,並沒有直接的調用方法,因此參考這塊的內容,我重新畫了一張圖,以便讓自己理解。
2、垃圾收集器組合關係圖例
常用的6個垃圾收集器,由這五個方法進行調度和使用。
3、部分JVM參數
一些其他的JAVA虛擬機器的參數,以便需要的時候查閱。
-XX:SurvivorRatio |
新生代中Eden地區與Survivor地區的容量比值,預設為8,代表Eden:Subrvivor = 8:1 |
-XX:PretenureSizeThreshold |
直接晉陞到老年代對象的大小,設定這個參數後,大於這個參數的對象將直接在老年代分配 |
-XX:MaxTenuringThreshold |
晉陞到老年代的對象年齡,每次Minor GC之後,年齡就加1,當超過這個參數的值時進入老年代 |
-XX:UseAdaptiveSizePolicy |
動態調整java堆中各個地區的大小以及進入老年代的年齡 |
-XX:+HandlePromotionFailure |
是否允許新生代收集擔保,進行一次minor gc後, 另一塊Survivor空間不足時,將直接會在老年代中保留 |
-XX:ParallelGCThreads |
設定並行GC進行記憶體回收的線程數 |
-XX:GCTimeRatio |
GC時間佔總時間的比列,預設值為99,即允許1%的GC時間,僅在使用Parallel Scavenge 收集器時有效 |
-XX:MaxGCPauseMillis |
設定GC的最大停頓時間,在Parallel Scavenge 收集器下有效 |
-XX:CMSInitiatingOccupancyFraction |
設定CMS收集器在老年代空間被使用多少後出發垃圾收集,預設值為68%,僅在CMS收集器時有效,-XX:CMSInitiatingOccupancyFraction=70 |
-XX:+UseCMSCompactAtFullCollection |
由於CMS收集器會產生片段,此參數設定在垃圾收集器後是否需要一次記憶體磁碟重組過程,僅在CMS收集器時有效 |
-XX:+CMSFullGCBeforeCompaction |
設定CMS收集器在進行若干次垃圾收集後再進行一次記憶體磁碟重組過程,通常與UseCMSCompactAtFullCollection參數一起使用 |
-XX:+UseFastAccessorMethods |
原始類型最佳化 |
-XX:+DisableExplicitGC |
是否關閉手動System.gc |
-XX:+CMSParallelRemarkEnabled |
降低標記停頓 |
-XX:LargePageSizeInBytes |
記憶體頁的大小不可設定過大,會影響Perm的大小,-XX:LargePageSizeInBytes=128m |
4、JDK GC組合方式的一些特性
|
新生代GC方式 |
老年代和持久代GC方式 |
-XX:+UseSerialGC |
Serial 串列GC |
Serial Old 串列GC |
-XX:+UseParallelGC |
Parallel Scavenge 並行回收GC |
Serial Old 串列GC |
-XX:+UseConcMarkSweepGC |
ParNew 並行GC |
CMS 並發GC 當出現“Concurrent Mode Failure”時 採用Serial Old 串列GC |
-XX:+UseParNewGC |
ParNew 並行GC |
Serial Old 串列GC |
-XX:+UseParallelOldGC |
Parallel Scavenge 並行回收GC |
Parallel Old 並行GC |
-XX:+UseConcMarkSweepGC -XX:+UseParNewGC |
Serial 串列GC |
CMS 並發GC 當出現“Concurrent Mode Failure”時 採用Serial Old 串列GC |