The NoteBook of EricKong

            BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
            611 Posts :: 1 Stories :: 190 Comments :: 0 Trackbacks

          性能測試排查定位問題,分析調(diào)優(yōu)過程中,會遇到要分析gc日志,人肉分析gc日志有時比較困難,相關(guān)圖形化或命令行工具可以有效地幫助輔助分析。

          Gc日志參數(shù)

          通過在tomcat啟動腳本中添加相關(guān)參數(shù)生成gc日志

          -verbose.gc開關(guān)可顯示GC的操作內(nèi)容。打開它,可以顯示最忙和最空閑收集行為發(fā)生的時間、收集前后的內(nèi)存大小、收集需要的時間等。

          打開-xx:+ printGCdetails開關(guān),可以詳細了解GC中的變化。

          打開-XX: + PrintGCTimeStamps開關(guān),可以了解這些垃圾收集發(fā)生的時間,自JVM啟動以后以秒計量。

          最后,通過-xx: + PrintHeapAtGC開關(guān)了解堆的更詳細的信息。

          為了了解新域的情況,可以通過-XX:=PrintTenuringDistribution開關(guān)了解獲得使用期的對象權(quán)。

          -Xloggc:$CATALINA_BASE/logs/gc.log gc日志產(chǎn)生的路徑

          XX:+PrintGCApplicationStoppedTime // 輸出GC造成應(yīng)用暫停的時間

          -XX:+PrintGCDateStamps // GC發(fā)生的時間信息

           

          Gc日志


          日志中顯示了gc發(fā)生的時間,young區(qū)回收情況,整體回收情況,fullGC情況,回收所消耗時間等

           

          常用JVM參數(shù)

          分析gc日志后,經(jīng)常需要調(diào)整jvm內(nèi)存相關(guān)參數(shù),常用參數(shù)如下

          -Xms初始堆大小,默認(rèn)為物理內(nèi)存的1/64(<1GB);默認(rèn)(MinHeapFreeRatio參數(shù)可以調(diào)整)空余堆內(nèi)存小于40%時,JVM就會增大堆直到-Xmx的最大限制

          -Xmx:最大堆大小,默認(rèn)(MaxHeapFreeRatio參數(shù)可以調(diào)整)空余堆內(nèi)存大于70%時,JVM會減少堆直到 -Xms的最小限制

          -Xmn新生代的內(nèi)存空間大小,注意:此處的大小是(eden+ 2 survivor space)。與jmap -heap中顯示的New gen是不同的。整個堆大小=新生代大小 + 老生代大小 + 永久代大小。 
          在保證堆大小不變的情況下,增大新生代后,將會減小老生代大小。此值對系統(tǒng)性能影響較大,Sun官方推薦配置為整個堆的3/8。

          -XX:SurvivorRatio新生代中Eden區(qū)域與Survivor區(qū)域的容量比值,默認(rèn)值為8。兩個Survivor區(qū)與一個Eden區(qū)的比值為2:8,一個Survivor區(qū)占整個年輕代的1/10。

          -Xss每個線程的堆棧大小。JDK5.0以后每個線程堆棧大小為1M,以前每個線程堆棧大小為256K。應(yīng)根據(jù)應(yīng)用的線程所需內(nèi)存大小進行適當(dāng)調(diào)整。在相同物理內(nèi)存下,減小這個值能生成更多的線程。但是操作系統(tǒng)對一個進程內(nèi)的線程數(shù)還是有限制的,不能無限生成,經(jīng)驗值在3000~5000左右。一般小的應(yīng)用, 如果棧不是很深, 應(yīng)該是128k夠用的,大的應(yīng)用建議使用256k。這個選項對性能影響比較大,需要嚴(yán)格的測試。和threadstacksize選項解釋很類似,官方文檔似乎沒有解釋,在論壇中有這樣一句話:"-Xss is translated in a VM flag named ThreadStackSize”一般設(shè)置這個值就可以了。

          -XX:PermSize設(shè)置永久代(perm gen)初始值。默認(rèn)值為物理內(nèi)存的1/64。

          -XX:MaxPermSize設(shè)置持久代最大值。物理內(nèi)存的1/4。

           

          Gc日志分析工具

          (1)GCHisto

          http://java.net/projects/gchisto

           

          直接點擊gchisto.jar就可以運行,點add載入gc.log

          統(tǒng)計了總共gc次數(shù),youngGC次數(shù),F(xiàn)ullGC次數(shù),次數(shù)的百分比,GC消耗的時間,百分比,平均消耗時間,消耗時間最小最大值等

           


          統(tǒng)計的圖形化表示

           

          YoungGC,FullGC不同消耗時間上次數(shù)的分布圖,勾選可以顯示youngGC或fullGC單獨的分布情況

           

          整個時間過程詳細的gc情況,可以對整個過程進行剖析

           

           

          (2)GCLogViewer

           

          http://code.google.com/p/gclogviewer/

           

          點擊run.bat運行

           

          整個過程gc情況的趨勢圖,還顯示了gc類型,吞吐量,平均gc頻率,內(nèi)存變化趨勢等

          Tools里還能比較不同gc日志


           


          (3)HPjmeter

           

          獲取地址 http://www.hp.com/go/java
          參考文檔 http://www.javaperformancetuning.com/tools/hpjtune/index.shtml

           

          工具很強大,但只能打開由以下參數(shù)生成的GC log, -verbose:gc -Xloggc:gc.log,添加其他參數(shù)生成的gc.log無法打開。

           

          (4)GCViewer

          http://www.tagtraum.com/gcviewer.html

          這個工具用的挺多的,但只能在JDK1.5以下的版本中運行,1.6以后沒有對應(yīng)。

          (5)garbagecat

          http://code.google.com/a/eclipselabs.org/p/garbagecat/wiki/Documentation

           

           

          其它監(jiān)控方法

          Jvisualvm動態(tài)分析jvm內(nèi)存情況和gc情況,插件:visualGC

            

          jvisualvm還可以heapdump出對應(yīng)hprof文件(默認(rèn)存放路徑:監(jiān)控的服務(wù)器 /tmp下),利用相關(guān)工具,比如HPjmeter可以對其進行分析

          grep Full gc.log粗略觀察FullGC發(fā)生頻率

          jstat –gcutil [pid] [intervel] [count]

          jmap -histo pid可以觀測對象的個數(shù)和占用空間
          jmap -heap pid可以觀測jvm配置參數(shù),堆內(nèi)存各區(qū)使用情況

          jprofiler,jmap dump出來用MAT分析

           

          如果要分析的dump文件很大的話,就需要很多內(nèi)存,很容易crash。

          所以在啟動時,我們應(yīng)該加上一些參數(shù): Java –Xms512M –Xmx1024M –Xss8M 

          posted on 2014-03-05 16:58 Eric_jiang 閱讀(5905) 評論(0)  編輯  收藏 所屬分類: Java
          主站蜘蛛池模板: 敦煌市| 禹州市| 茶陵县| 梨树县| 锡林郭勒盟| 绥江县| 齐齐哈尔市| 嘉禾县| 博客| 喀喇沁旗| 博爱县| 桂阳县| 丽江市| 修文县| 莫力| 富裕县| 乌恰县| 深水埗区| 石林| 于田县| 西充县| 抚松县| 芮城县| 永泰县| 内丘县| 建水县| 遂平县| 泰州市| 云龙县| 同江市| 阿拉尔市| 余庆县| 五常市| 荣成市| 汽车| 大丰市| 永城市| 丹巴县| 石嘴山市| 普陀区| 阜宁县|