1. 程式人生 > >JVM系列:三、效能監控及工具

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,和Linuxps命令類似,查詢的是虛擬機器的程序。可以顯示執行主類、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編譯等執行資料。

對於本地虛擬機器,VMIDLVMID是一樣的。如果是遠端的則VMID變成遠端的格式。

intervalcount表示查詢間隔和次數

> jstat -gc 6632 250 20

250毫秒查詢一次垃圾收集,共20

jstat工具主要選項

-class

監視類裝載、解除安裝數量、總空間及類裝載所耗費的時間

-gc

監視Java堆狀況,Eden區、2survivor區、老年代、永久代等

-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>

jhatjmap配合使用。來分析jmap生成的轉儲快照檔案,內建了一個微型的HTTP伺服器,供使用者在瀏覽器來訪問分析介面。

除了這個,還有VisualVMEclipse Memory AnalyzerIBM HeapAnalyzer等都能更專業的分析heap檔案。

jstack [ option ] vmid

Java堆疊跟蹤工具。用於生成虛擬機器當前時刻的執行緒快照(threaddump檔案)。

jstack工具主要選項

-F

正常輸出請求不響應時,強制輸出執行緒堆疊

-l

除堆疊外,顯示關於鎖的附加資訊

-m

呼叫本地方法的話,可以顯示C/C++堆疊


視覺化工具

JDK預設提供了兩個視覺化工具:JconsoleVisualVMJconsoleJDK1.5提供的虛擬機器監控工具,1.6後又推出了更強大的VisualVM。其中VisualVM除了能提供基本的監控功能外,最強大的是它的外掛機制,基於它能擴充套件各種各樣的外掛用於監控除錯。

附JVM常用引數

引數

說明

備註

-Xms

最小堆容量,新生代舊生代的初始化容量

預設實體記憶體1/64(新生代+舊生代)-Xms512m

-Xmx

最大堆容量,包括新生代和舊生代

預設實體記憶體1/4(新生代+舊生代)-Xmx1024m

-Xmn

新生代容量,包括EdenS1S0

新生代增大對導致舊生代減小,對系統會有較大影響。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

堆中新生代對比例(EdenSurvivor的倍數,如值為5,即Eden5/7S1S0各佔1/7

-XX:+DisableExplicitGC

關閉System.gc()

-XX:MaxTenuringThreshold

垃圾最大年齡

在新生代中,EdenS0S1之間存活的週期(複製的次數),預設15

-XX:PretenureSizeThreshold

物件大於這個值則直接分配到老年代(對SerialParNew有效)

-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

相關日誌輸出到檔案