文章目錄
概述
因爲爲java語言提供支持的虛擬機有很多,不同虛擬機提供的垃圾收集器差別很大。這裏討論的收集器基於JDK1.7 Update14之後的HotSpot虛擬機。這個虛擬機包含的所有垃圾收集器如下圖
參數解析
XX:+UseSerialGC
使用串行回收器進行回收,這個參數會使新生代
和老年代
都使用串行回收器
,新生代
使用複製算法
,老年代
使用標記-整理算法
。Serial收集器
是最基本、歷史最悠久的收集器,它是一個單線程收集器。一旦回收器開始運行時,整個系統都要停止
。Client
模式下默認開啓,其他模式默認關閉。
-XX:+UseParNewGC
Parallel
是並行
的意思,ParNew
收集器是Serial
收集器的多線程版本
,使用這個參數後會在新生代進行並行回收,老年代仍舊使用串行回收
。新生代S區任然使用複製算法
。操作系統是多核CPU上效果明顯,單核CPU建議使用串行回收器。打印GC
詳情時ParNew
標識着使用了ParNewGC
回收器。默認關閉。
[GC[ParNew: 78656K->8703K(78656K), 0.0180555 secs] 81048K->17429K(253440K), 0.0187828 secs] [Times: user=0.03 sys=0.00, real=0.02 secs]
-XX:+UseParallelGC
代表新生代
使用Parallel收集器
,老年代使用串行收集器
。Parallel Scavenge
收集器在各個方面都很類似ParNew
收集器,它的目的是達到一個可以控制的吞吐量
。吞吐量爲CPU
用於運行用戶代碼的時間與CPU
總消耗時間的比值,即吞吐量=運行用戶代碼時間/(運行用戶代碼時間+垃圾收集時間)
,虛擬機運行100分鐘
,垃圾收集花費1分鐘
,那吞吐量就99%
。Server
模式默認開啓,其他模式默認關閉。
Parallel Scavenge
提供了兩個參數用於控制吞吐量
-XX:MaxGCPauseMillis
:參數用於設置最大停頓時間
,它的參數運行值是一個大於0的毫秒數,收集器將盡力保證垃圾回收時間不超過設定值,系統運行的需要回收的垃圾總量是固定的,縮短停頓時間的同時會增大回收頻度。-XX:GCTimeRatio
:參數用戶控制垃圾回收時間佔比
,它運行的參數值是0-100
的整數,如果參數設置爲19,代表最大GC時間佔總時間的5%(1/(1+19))。
Parallel
收集器還提供了自適應的調節策略-XX:UseAdaptiveSizePolicy
,即JVM會根據實際運行情況動態調整新生代大小、新生代和s區比例、晉升老年代對象大小等細節參數
。
-XX:+UseParallelOldGC
新生代
和老年代
都使用並行收集器
。打印出的GC
會帶PSYoungGen
、ParOldGen
關鍵字。
[Full GC [PSYoungGen: 4032K->0K(145920K)] [ParOldGen: 164500K->138362K(246272K)] 168532K->138362K(392192K) [PSPermGen: 67896K->67879K(136192K)], 1.006
-XX:+UseConcMarkSweepGC
Concurrent Mark Sweep
併發標記清除,即使用CMS收集器
。它是和應用程序線程一起執行,相對於Stop The World
來說虛擬機停頓時間較少
。停頓減少,吞吐量會降低。它使用的是 標記清除算法
,運作過程爲四個步驟,分別是 初始標記—併發標識—重新標記—併發清除
。它是老年代的收集算法,新生代
使用ParNew
收集算法。默認關閉
CMS收集器
的缺點是對服務器CPU資源較爲敏感
,在併發標記時會降低吞吐量
。它使用的標記清除算法
也會產生大量空間碎片,空間碎片的存在會加大Full GC
的頻率,雖然老年代還有足夠的內存,但是因爲內存空間不連續,不得不進行Full GC
。
-XX:+ UseCMSCompactAtFullCollection
Full GC
後,進行一次整理,整理過程是獨佔的,會引起停頓時間變長
。僅在使用CMS收集器時生效
。
-XX:ParallelCMSThreads
設置並行GC
時進行內存回收的線程數量
-XX:PreternureSizeThreshold
直接晉升老年代的對象大小,設置了這個參數後,大於這個參數的對象直接在老年代進行分配。
-XX:MaxTenuringThreshold
晉升老年代的對象年齡,對象在每一次Minor GC
後年齡增加一歲,超過這個值後進入到老年代。默認值爲15
。
-XX:NativeMemoryTracking=detail
使用命令jcmd pid VM.native_memory detail
,配合查看JVM相關情況