目前有許多分析JVM程式的工具,首先就是jdk本身提供的基本分析工具如jmap、jconsole、VisualVM等,此外還有一些第三方工具如基于eclipse的MAT。分析工具對于JVM程式優化有着舉足輕重的作用。
jdk提供的工具
以下内容參考周志明老師著述:《深入了解Java虛拟機》第二版。
首先來看下基于文本的JVM相關工具:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnLyUDN1UzM0ETMyIDOwkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
其實作在已經有許多更好的工具作為替代,但在linux的指令行控制界面下還是會比較多的用到上述工具。
如下對幾個個人認為重要的工具進行展開copy
1 Jps
可能在linux下開發時用的比較多就是jps了,其對應有如下參數:
2 Jstat
其可以監控JVM運作時狀态資訊,比如說GC情況,詳細參數用法如下:
案例:在此假設每個1000毫秒查詢已使用空間占用百分比,一共查詢20次:
jstat -gcutil 12444 1000 20
3 Jmap
用于生成堆轉儲快照檔案的工具,主要用法如下:
jmap [option] vmid
如在此生成sts(pid=12444)的運作dump檔案并将其存放在E:\jmap檔案夾下 :
jmap -dump:format=b,file=E:\jmap\eclipse.bin 12444
4 Jstack
可用于定位線程長時間停頓問題,如死鎖、外部資源請求、死循環等。通過jstack檢視各個線程堆棧調用情況即可知道線程在背景的工作情況,以此進行問題定位。詳細用法參數如下:
除了上述幾個基于文本的分析工具外,jdk還提供了兩個可視化工具:jconsole、VisualVM。
兩款工具皆作為jdk的正式成員。
5 jconsole
先來看看jconsole,直接在控制台敲入jconsole pid或打開jconsole進行遠端連接配接JVM程序即可監控對應程序的狀态資訊,包括JVM記憶體使用情況、GC相關資訊、線程執行個體等。
根據大佬純潔的微笑部落格:jvm系列(七):jvm調優-工具篇
如果監控遠端服務需要在tomcat啟動腳本中添加如下代碼:
-Dcom.sun.management.jmxremote.port=6969
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
堆記憶體監控
線程監控:如下可以很清楚的檢視線程運作狀态及其他相關資訊。當檢測到死鎖時會自動在左欄顯示。
6 VisualVM
在自己本機JAVA_HOME/bin(Java8)目錄下找到jvisualvm.exe直接點選運作既可以選擇對相應程序進行監控,如下:
對heapdump檔案進行分析:
基本資訊監控
以上關于jdk基本工具的操作這位大佬的文章寫的還是挺詳細的:JVM分析工具概述
第三方分析工具
除了上述jdk提供的工具外,業界前輩們還開發出了許多功能強大、可視化更加友好的JVM監控分析工具。
比如MAT(Memory Analyzer Tool):一款基于eclipse的插件工具,簡單易用且友好的可視化界面。可利用jmap工具生成堆轉儲快照檔案,而後将檔案直接拖入eclipse項目目錄下點選即可進行分析(在已安裝MAT的情況下)。