性能測試排查定位問題,分析調優過程中,會遇到要分析gc日誌,人肉分析gc日誌有時比較困難,相關圖形化或命令行工具可以有效地幫助輔助分析。 Gc日誌參數 通過在tomcat啟動腳本中添加相關參數生成gc日誌 -verbose.gc開關可顯示GC的操作內容。打開它,可以顯示最忙和最空閑收集行為發生的時間 ...
性能測試排查定位問題,分析調優過程中,會遇到要分析gc日誌,人肉分析gc日誌有時比較困難,相關圖形化或命令行工具可以有效地幫助輔助分析。
Gc日誌參數
通過在tomcat啟動腳本中添加相關參數生成gc日誌
-verbose.gc開關可顯示GC的操作內容。打開它,可以顯示最忙和最空閑收集行為發生的時間、收集前後的記憶體大小、收集需要的時間等。
打開-xx:+ printGCdetails開關,可以詳細瞭解GC中的變化。
打開-XX: + PrintGCTimeStamps開關,可以瞭解這些垃圾收集發生的時間,自JVM啟動以後以秒計量。
最後,通過-xx: + PrintHeapAtGC開關瞭解堆的更詳細的信息。
為了瞭解新域的情況,可以通過-XX:=PrintTenuringDistribution開關瞭解獲得使用期的對象權。
-Xloggc:$CATALINA_BASE/logs/gc.log gc日誌產生的路徑
XX:+PrintGCApplicationStoppedTime // 輸出GC造成應用暫停的時間
-XX:+PrintGCDateStamps // GC發生的時間信息
Gc日誌
日誌中顯示了gc發生的時間,young區回收情況,整體回收情況,fullGC情況,回收所消耗時間等
常用JVM參數
分析gc日誌後,經常需要調整jvm記憶體相關參數,常用參數如下
-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日誌分析工具
(1)GCHisto
http://Java.net/projects/gchisto
直接點擊gchisto.jar就可以運行,點add載入gc.log
統計了總共gc次數,youngGC次數,FullGC次數,次數的百分比,GC消耗的時間,百分比,平均消耗時間,消耗時間最小最大值等
統計的圖形化表示
YoungGC,FullGC不同消耗時間上次數的分佈圖,勾選可以顯示youngGC或fullGC單獨的分佈情況
整個時間過程詳細的gc情況,可以對整個過程進行剖析
(2)GCLogViewer
http://code.google.com/p/gclogviewer/
點擊run.bat運行
整個過程gc情況的趨勢圖,還顯示了gc類型,吞吐量,平均gc頻率,記憶體變化趨勢等
Tools里還能比較不同gc日誌
(3)HPjmeter
獲取地址 http://www.hp.com/go/java
參考文檔 http://www.javaperformancetuning.com/tools/hpjtune/index.shtml
工具很強大,但只能打開由以下參數生成的GC log, -verbose:gc -Xloggc:gc.log,添加其他參數生成的gc.log無法打開。
(4)GCViewer
http://www.tagtraum.com/gcviewer.html
這個工具用的挺多的,但只能在JDK1.5以下的版本中運行,1.6以後沒有對應。
(5)garbagecat
http://code.google.com/a/eclipselabs.org/p/garbagecat/wiki/Documentation
其它監控方法
Jvisualvm動態分析jvm記憶體情況和gc情況,插件:visualGC
jvisualvm還可以heapdump出對應hprof文件(預設存放路徑:監控的伺服器 /tmp下),利用相關工具,比如HPjmeter可以對其進行分析
grep Full gc.log粗略觀察FullGC發生頻率
jstat –gcutil [pid] [intervel] [count]
jmap -histo pid可以觀測對象的個數和占用空間
jmap -heap pid可以觀測jvm配置參數,堆記憶體各區使用情況
jprofiler,jmap dump出來用MAT分析
如果要分析的dump文件很大的話,就需要很多記憶體,很容易crash。
所以在啟動時,我們應該加上一些參數: Java –Xms512M –Xmx1024M –Xss8M