GC垃圾回收器詳解

概述

因爲爲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會帶PSYoungGenParOldGen關鍵字。

[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相關情況

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章