JVM系列:三、效能監控及工具
Sun JDK自帶監控和故障處理工具 |
|
jps |
顯示Hotspot虛擬機器繼承 |
jstat |
收集Hotspot虛擬機器的執行資料 |
jinfo |
顯示虛擬機器配置資訊 |
jmap |
生成虛擬機器的記憶體轉儲快照(heapdump檔案) |
jhat |
用於分析heapdump檔案,建立HTTP server用於瀏覽器訪問。 |
jstack |
顯示虛擬機器的執行緒快照 |
在JDK1.5中需要手動來設定“-Dcom.sun.management.jmxremote”開啟JMX管理功能,部分工具是基於JMX的。在JDK1.6後該功能預設是開啟的。
jps [options] [hostid]
jps,和Linux的ps命令類似,查詢的是虛擬機器的程序。可以顯示執行主類、LVMID(本地虛擬機器唯一ID)等。LVMID和系統的PID是一致的。
如 >jps -l
6632 sun.tools.jps.Jps
6640 org.jetbrains.idea.maven.server.RemoteMavenServer
jps工具主要選項 |
|
-q |
只輸出LVMID,省略主類名稱 |
-m |
輸出虛擬機器程序啟動時傳遞給main()函式的引數 |
-l |
輸出主類全名,如果是jar輸出jar路徑 |
-v |
輸出虛擬機器程序啟動時JVM引數 |
jstat [ option vmid [interval [s|ms] [count] ] ]
jstat用於監視虛擬機器各種執行狀態資訊。可以顯示類裝載、記憶體、垃圾收集、JIT編譯等執行資料。
對於本地虛擬機器,VMID和LVMID是一樣的。如果是遠端的則VMID變成遠端的格式。
interval和count表示查詢間隔和次數
如> jstat -gc 6632 250 20
每250毫秒查詢一次垃圾收集,共20次
jstat工具主要選項 |
|
-class |
監視類裝載、解除安裝數量、總空間及類裝載所耗費的時間 |
-gc |
監視Java堆狀況,Eden區、2個survivor區、老年代、永久代等 |
-gccapacity |
和-gc類似,主要關注各區域最大最小空間 |
-gcutil |
和-gc類似,主要關注已使用空間的百分比 |
-gccause |
和-gcutil一樣,會輸出上一次gc的原因 |
-gcnew |
監視新生代GC狀況 |
-gcnewcapacity |
和-gcnew類似,主要關注最大最小空間 |
-gcold |
監視老年代GC狀況 |
-gcoldcapacity |
同上 |
-gcpermcapacity |
永久代的最大最小空間 |
-compiler |
輸出JIT編譯器編譯過的方法,耗時等資訊 |
-printcompilation |
輸出已被JIT編譯的方法 |
jinfo [ option ] pid
jinfo能實時檢視和調整虛擬機器的各項引數。
如> jinfo -flag CMSInitiatingOccupancyFraction 6632
jmap [ option ] vmid
jmap用於生成轉儲快照(heapdump)、查詢堆和永久代詳細資訊等。
jmap工具主要選項 |
|
-dump |
生成heap檔案。-dump:[live,]format-b,file=<filename> 其中live說明只dump出存活的物件 |
-finalizerinfo |
顯示F-Queue中等待Finalizer執行緒執行finalize方法的物件(Linux/Solaris有效) |
-heap |
顯示堆詳細資訊(Linux/Solaris有效) |
-histo |
顯示堆中物件統計資訊,包括類、例項數量和合計容量 |
-permstat |
顯示永久代記憶體狀態(Linux/Solaris有效) |
-F |
-dump沒有響應時,可使用這個選項強制生成dump檔案。(Linux/Solaris有效) |
如> jmap -dump:format=b,file=dumpfile.log 6632
jhat <heapdumpfile>
jhat和jmap配合使用。來分析jmap生成的轉儲快照檔案,內建了一個微型的HTTP伺服器,供使用者在瀏覽器來訪問分析介面。
除了這個,還有VisualVM、Eclipse Memory Analyzer、IBM HeapAnalyzer等都能更專業的分析heap檔案。
jstack [ option ] vmid
Java堆疊跟蹤工具。用於生成虛擬機器當前時刻的執行緒快照(threaddump檔案)。
jstack工具主要選項 |
|
-F |
正常輸出請求不響應時,強制輸出執行緒堆疊 |
-l |
除堆疊外,顯示關於鎖的附加資訊 |
-m |
呼叫本地方法的話,可以顯示C/C++堆疊 |
視覺化工具
JDK預設提供了兩個視覺化工具:Jconsole和VisualVM。Jconsole是JDK1.5提供的虛擬機器監控工具,1.6後又推出了更強大的VisualVM。其中VisualVM除了能提供基本的監控功能外,最強大的是它的外掛機制,基於它能擴充套件各種各樣的外掛用於監控除錯。
附JVM常用引數
引數 |
說明 |
備註 |
-Xms |
最小堆容量,新生代舊生代的初始化容量 |
預設實體記憶體1/64(新生代+舊生代)-Xms512m |
-Xmx |
最大堆容量,包括新生代和舊生代 |
預設實體記憶體1/4(新生代+舊生代)-Xmx1024m |
-Xmn |
新生代容量,包括Eden,S1,S0 |
新生代增大對導致舊生代減小,對系統會有較大影響。Sun推薦比例是新生代為整個堆的3/8 |
-XX:NewSize |
新生代容量 |
For 1.3/1.4 |
-XX:MaxNewSize |
新生代最大容量 |
For 1.3/1.4 |
-XX:PermSize |
持久代的初始值 |
預設實體記憶體1/64(-XX:PermSize=256m) |
-XX:MaxPermSize |
持久代最大值 |
預設實體記憶體1/4() |
-Xss |
每個執行緒的堆疊大小 |
JDK5.0以後預設為1M |
-XX:SurvivorRatio |
堆中新生代對比例(Eden對Survivor的倍數,如值為5,即Eden佔5/7,S1和S0各佔1/7) |
|
-XX:+DisableExplicitGC |
關閉System.gc() |
|
-XX:MaxTenuringThreshold |
垃圾最大年齡 |
在新生代中,Eden、S0、S1之間存活的週期(複製的次數),預設15 |
-XX:PretenureSizeThreshold |
物件大於這個值則直接分配到老年代(對Serial和ParNew有效) |
|
-XX:+UseParallelGC |
||
-XX:+UseParNewGC |
新生代使用ParNew進行收集(並行) |
可與CMS收集同時使用 JDK5.0以上會根據系統配置自行設定 |
-XX:ParallelGCThreads |
並行收集的執行緒數 |
最好與處理器數相等 |
-XX:+UseParallelOldGC |
舊生代使用Parallel進行收集(並行收集) |
|
-XX:GCTimeRatio |
垃圾回收時間佔程式執行時間的百分比 |
1(1+n) |
-XX:+UseConcMarkSweepGC |
使用CMS收集 |
|
-XX:+PrintGC |
每次GC時列印日誌 |
|
-XX:+PrintGCDetails |
列印詳細日誌 |
|
-XX:+PrintGCTimeStamps |
列印時間戳 |
|
-XX:+PrintGC:PrintGCTimeStamps |
||
-XX:+PrintGCApplicationStoppedTime |
打印出垃圾回收期間程式暫停的時間 |
|
-Xloggc:filename |
相關日誌輸出到檔案 |