gc日誌分析

經常使用JVM參數

分析gc日誌後,常常須要調整jvm內存相關參數,經常使用參數以下eclipse

參數 含義
-Xms 初始堆大小,默認爲物理內存的1/64(<1GB);默認(MinHeapFreeRatio參數能夠調整)空餘堆內存小於40%時,JVM就會增大堆直到-Xmx的最大限制
-Xmx 最大堆大小,默認(MaxHeapFreeRatio參數能夠調整)空餘堆內存大於70%時,JVM會減小堆直到 -Xms的最小限制
-Xmn 新生代的內存空間大小,注意:此處的大小是(eden+ 2 survivor space)。與jmap -heap中顯示的New gen是不一樣的。整個堆大小=新生代大小 + 老生代大小 + 永久代大小。 在保證堆大小不變的狀況下,增大新生代後,將會減少老生代大小。此值對系統性能影響較大,Sun官方推薦配置爲整個堆的3/8。
-XX:SurvivorRatio 新生代中Eden區域與Survivor區域的容量比值,默認值爲8。兩個Survivor區與一個Eden區的比值爲2:8,一個Survivor區佔整個年輕代的1/10。
-Xss 每一個線程的堆棧大小。JDK5.0之後每一個線程堆棧大小爲1M,之前每一個線程堆棧大小爲256K。應根據應用的線程所需內存大小進行適當調整。在相同物理內存下,減少這個值能生成更多的線程。可是操做系統對一個進程內的線程數仍是有限制的,不能無限生成,經驗值在3000~5000左右。通常小的應用, 若是棧不是很深, 應該是128k夠用的,大的應用建議使用256k。這個選項對性能影響比較大,須要嚴格的測試。和threadstacksize選項解釋很相似,官方文檔彷佛沒有解釋,在論壇中有這樣一句話:"-Xss is translated in a VM flag named ThreadStackSize」通常設置這個值就能夠了。
-XX:PermSize 設置永久代(perm gen)初始值。默認值爲物理內存的1/64。
-XX:MaxPermSize 設置持久代最大值。物理內存的1/4。

GC參數:

在eclipse根目錄下的eclipse.ini配置文件中添加如下參數:
-verbose:gc (開啓打印垃圾回收日誌)
-Xloggc:eclipse_gc.log (設置垃圾回收日誌打印的文件,文件名稱能夠自定義)
-XX:+PrintGCTimeStamps (打印垃圾回收時間信息時的時間格式)
-XX:+PrintGCDetails (打印垃圾回收詳情)
添加完以上參數後當啓動Eclipse後就能在Eclipse根目錄看到一個eclipse_gc.log的gc日誌文件jvm

idea 在vm options處加入-XX:+PrintGCDetails,可打印GC日誌。ide

名詞解釋:

full gc
full gc是對新生代,舊生代,以及持久代的統一回收,因爲是對整個空間的回收,所以比較慢,系統中應當儘可能減小full gc的次數。性能

以下幾種狀況下會發生full gc:測試

舊生代空間不足
持久代空間不足
CMS GC時出現了promotion failed和concurrent mode failure
統計獲得新生代minor gc時晉升到舊生代的平均大小小於舊生代剩餘空間
直接調用System.gc,能夠DisableExplicitGC來禁止
存在rmi調用時,默認會每分鐘執行一次System.gc,能夠經過-Dsun.rmi.dgc.server.gcInterval=3600000來設置大點的間隔。idea

minor gc
發生在young代的gc,比full gc速度要快開銷要小。spa

GC日誌分析

JVM的GC日誌的主要參數包括以下幾個:

參數 含義
-XX:+PrintGC 輸出GC日誌
-XX:+PrintGCDetails 輸出GC的詳細日誌
-XX:+PrintGCTimeStamps 輸出GC的時間戳(以基準時間的形式)
-XX:+PrintGCDateStamps 輸出GC的時間戳(以日期的形式,如 2013-05-04T21:53:59.234+0800)
-XX:+PrintHeapAtGC 在進行GC的先後打印出堆的信息
-Xloggc:…/logs/gc.log 日誌文件的輸出路徑

 好比以下的設置:操作系統

-XX:+PrintGCDetails -Xloggc:../logs/gc.log -XX:+PrintGCTimeStamps

打印出來的日誌以下:線程

0.756: [Full GC (System) 0.756: [CMS: 0K->1696K(204800K), 0.0347096 secs] 11488K->1696K(252608K), [CMS Perm : 10328K->10320K(131072K)], 0.0347949 secs] [Times: user=0.06 sys=0.00, real=0.05 secs]  
1.728: [GC 1.728: [ParNew: 38272K->2323K(47808K), 0.0092276 secs] 39968K->4019K(252608K), 0.0093169 secs] [Times: user=0.01 sys=0.00, real=0.00 secs]  
2.642: [GC 2.643: [ParNew: 40595K->3685K(47808K), 0.0075343 secs] 42291K->5381K(252608K), 0.0075972 secs] [Times: user=0.03 sys=0.00, real=0.02 secs]  
4.349: [GC 4.349: [ParNew: 41957K->5024K(47808K), 0.0106558 secs] 43653K->6720K(252608K), 0.0107390 secs] [Times: user=0.03 sys=0.00, real=0.02 secs]  
5.617: [GC 5.617: [ParNew: 43296K->7006K(47808K), 0.0136826 secs] 44992K->8702K(252608K), 0.0137904 secs] [Times: user=0.03 sys=0.00, real=0.02 secs]  
7.429: [GC 7.429: [ParNew: 45278K->6723K(47808K), 0.0251993 secs] 46974K->10551K(252608K), 0.0252421 secs]

取倒數第二條解釋各個字段日誌

5.617(時間戳): [GC(Young GC) 5.617(時間戳): [ParNew(使用ParNew做爲年輕代的垃
圾回收期): 43296K(年輕代垃圾回收前的大小)->7006K(年輕代垃圾回收之後的大小)
(47808K)(年輕代的總大小), 0.0136826 secs(回收時間)] 44992K(堆區垃圾回收前的大小)->8702K(堆區垃圾回收後的大小)(252608K)(堆區總大小), 0.0137904 secs(回收時間)] 
[Times: user=0.03(Young GC用戶耗時) sys=0.00(Young GC系統耗時), real=0.02 
secs(Young GC實際耗時)]
相關文章
相關標籤/搜索