Java內存泄露監控工具:JVM監控工具介紹


本文將對JVM監控工具jstack, jconsole, jinfo, jmap, jdb, jstat進行詳細的介紹,具體內容請看下文

Sun JDK監控和故障處理工具
名稱
主要作用
jps
JVM Process Status Tool,顯示指定系統內所有的 HotSpot虛擬進程
jstat
JVM Statistcs Monitoring Tool,用於手機HotSpot虛擬機各方面的運行數據
jinfo
Configuration Info for java,實時查看和調整虛擬機各項參數信息
jmap
Memory Map for Java,生成轉儲快照(一般稱為headdump或dump文件)
jhat
JVM Heap Analysis Tool,與jmap搭配使用,分析jmap生成的轉儲快照
jstack
Stack Trace for Java,生成虛擬機當前時刻的線程快照(一般稱為threddump或javacore文件)

 

1.jps:虛擬機進程狀況工具
可以列出正在運行的虛擬機進程,並顯示虛擬機執行主類(Main Class, main()函數所在的類)的名稱,以及這些進程的本地虛擬機的唯一ID。
jps可以通過RMI協議查詢開啟了RMI服務的遠程虛擬機進程狀態,hostid為RMI注冊表中注冊的主機名。默認端口為1099。(前提是遠程服務器提供jstatd服務)
 
jps命令格式:
jps [-q] [-mlvV] [<hostid>]
options :   
-q            只輸出LVMID,省略主類的名稱
-m            輸出虛擬機京城啟動時傳遞給主類main()函數的參數
-l            輸出主類的全名,如果京城執行的是Jar包,輸出Jar路徑
-v            輸出虛擬機進程啟動時JVM參數
 
jps -l
 

 
2.jstat:虛擬機統計信息監視工具
用於監視虛擬機各種運行狀態信息的命令行工具。它可以顯示本地或遠程虛擬機進程中的類裝載、內存、垃圾收集、JIT編譯等運行數據,在沒有GUI圖形界面,只提供了純文本控制台環境的服務器上,它將是運行期定位虛擬機性能問題的首選工具。
 
jstat命令行格式為:
jstat [ options vmid [interval [s|ms] [count ] ] ] jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]] 對於命令格式中的VMID與LVMID需要特別說明一下:如果是本地虛擬機進程,VMID與LVMID是一致的,如果是遠程虛擬機進程,那VMID的格式應當是:
[protocl:] [//]lvmid[@hostname[:port]/servername]
 
參數interval和count代表查詢間隔和次數,如果省略這兩個參數,說明只查詢一次。架設需要每50ms查詢一次進程1366垃圾收集的狀況,一共查詢2次,那命令應當是:
 
jstat -gc 1366 50 2
 
 
選項option代表這用戶希望查詢的虛擬機信息,主要分為3類:類裝載、垃圾收集、和運行期編譯狀況,具體選項及作用請參考描述。
options:          
-class                     監視類裝載、卸載數量、總空間及類裝載耗費的時間
-gc                        監視java堆狀況,包括Eden區、2個survivor區、老年代、永久代等的容量、已用空間、GC時間合計等信息
-gccapacity                監視內容與-gc基本相同,但輸出主要關注java堆各個區域使用到的最大和最小空間
-gcutil                    監視內容與-gc基本內容,但輸出主要關注已使用空間占總空間的百分比
-gccause                   與-gcutil功能一樣,但是會額外輸出導致上一次GC產生的原因
-gcnew                     監視新生代GC的狀況
-gcnewcapacity             監視內容與-gcnew 基本相同,輸出主要關注使用到的最大和最小空間
-gcold                     監視老年代GC的狀況
-gcoldcapacity             監視內容與-gcold基本相同,輸出主要關注使用到的最大和最小空間
-gcpermcapaciyt            輸出永久帶使用到的最大和最小空間
-complier                  輸出JIT編譯器編譯過的方法、耗時等信息
-printcompilation          輸出已被JIT編譯的方法
 
jstat監視選項忒多,囿於篇幅限制無法一一詳述。僅此淺析-gcutil結果。
 
jstat -gcutil 1366
 
 
E,表示Eden,新生代Eden區使用了21.53%的空間
S0、S1,表示兩個Survivor區Survivor0、Survivor1里S0使用了74.81%的空間,S1為空的
O,表示Old,老年代使用了82.78%
P,表示Permanent,永生代使用了85.78%
YGC,表示Young GC次數,新生代做了42次垃圾收集
YGCT,表示Young GC總耗時,新生代垃圾收集總耗時為0.970秒
FGC,表示Full GC次數,全內存域做了4次垃圾收集
FGCT,表示Full GC總耗時,全內存域垃圾收集總耗時為2.113秒
GCT,表示所有GC總耗時,所有內存域垃圾收集總耗時為3.083秒
 
使用jstat工具在純文本狀態下監視虛擬機狀態的變化,確實不如VisualVM、Jprofile等可視化監視工具以圖表展現形式直觀,但jstat以其較小的資源占用率博得眾多服務器管理員、性能測試人員的青睞。

 
3、jinfo:java配置信息工具
用於實時查看和調整虛擬機各項參數。使用jps命令的-v參數可以查看虛擬機啟動時顯示指定的參數列表,但如果想知道未被顯式指定的參數,就只能利用jinfo的-flag選項進行查詢了。
當然JDK1.6或以上版本的話,使用java -XX:+PrintFlagsFinal查看參數默認值也是極好的。
 
jinfo命令格式:
jinfo [option] <pid>
 
where <option> is one of:
-flag <name>         to print the value of the named VM flag
-flag [+|-]<name>    to enable or disable the named VM flag
-flag <name>=<value> to set the named VM flag to the given value
 
下面我們來展示下查詢CMSInitiatingOccupancyFraction參數:
jinfo -flag CMSInitiatingOccupancyFraction 1366
 

 
4、jmap:java內存快照工具
用於生成堆轉儲快照。
如果不適用jmap命令,想要獲取Java堆轉儲快照還有一些比較“暴力”的手段,譬如:
-XX:+HeapDumpOnOutOfMemoryError參數,可以讓虛擬機在OOM異常出現之后自動生成dump文件
-XX:+HeapDumpOnCtrlBreak參數則可使用[Ctrl]+[Break]鍵讓虛擬機生成dump文件
當然如果在linux系統下通過kill -3命令發送進程退出信號“恐嚇”一下虛擬機,也能拿到dump文件
 
jmap的作用並不僅僅是為了獲取dump文件,它還可以查詢finalize執行隊列,java堆和永久代的詳細信息,如空間使用率、當前用的是哪種GC收集器等。
 
jmap命令格式:
jmap [option] <pid>
 
options:           
-dump                生成java堆轉儲快照
-finalizerinfo       顯示在F-Queue中等待Finalizer線程執行finalize方法的對象
-heap                顯示java堆詳細信息,如使用哪種回收器、參數配置、分代狀況等
-histo               顯示堆中對象統計信息,包括類、實例數量和合計容量
-permstat            以ClassLoader為統計口徑顯示永久代內存狀態
-F                   當虛擬機進程對-dump選項沒有響應時,可使用這個選項生成dump快照
 

 
5、jhat:虛擬機堆轉儲快照分析工具
與jmap搭配使用,分析jmap生成的堆轉儲快照。jhat內置了一個微型http/html服務器,生成dump文件的分析結果,可以在瀏覽器中查看。
jhat的功能並不是很強大,並且在服務器上直接分析dump文件過分的消耗了硬件資源。在此推薦利用VisualVM、Eclipse Memory Analyzer、IBM HeapAnalyzer等工具。
 
jhat 命令格式:
jhat [-stack <bool>] [-refs <bool>] [-port <port>] [-baseline <file>] [-debug <int>] [-version] [-h|-help] <file>

6、jstack:java堆棧跟蹤工具
用於生成虛擬機當前時刻的線程快照。線程快照就是當前虛擬機內每一條線程正在執行的方法堆棧計划。
生成線程快照的主要目的是定位線程出現長時間停頓的原因,如線程間死鎖、死循環、請求外部資源導致的長時間等待等都是導致線程長時間停頓的常見原因。線程出現停頓的時候通過jstack來查看各個線程的調用堆棧,就可以知道沒有響應的線程到底在后台做些什么事情,或者等待着什么資源。
 
jstack命令格式:
jstack [option]<pid>
 
options:
-F                    當正常輸出的請求不被響應時,強制輸出線程堆棧
-l                      打印除堆棧以外關於鎖的附加信息
-m                    如果調用到本地方法的話,可以顯示C/C++的堆棧
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM