JDK中自帶的JVM分析工具( 二 )

4、jstack命令jstack:輸出指定進程當前時刻在JVM中的線程信息,為了清楚的展示其效果 , 在服務啟動時創建線程死鎖 , 然后通過該命令就會把發生死鎖的線程打印出來 , 通過輸出可以發現兩條互相等待的線程信息;
$ jstack 1281Found one Java-level deadlock:============================="test-thread-02":waiting for ownable synchronizer 0x00000007b00a35d0, (a java.util.concurrent.locks.ReentrantLock$NonfairSync),which is held by "test-thread-01""test-thread-01":waiting for ownable synchronizer 0x00000007b00a35a0, (a java.util.concurrent.locks.ReentrantLock$NonfairSync),which is held by "test-thread-02"Java stack information for the threads listed above:==================================================="test-thread-02":at sun.misc.Unsafe.park(Native Method)- parking to wait for<0x00000007b00a35d0> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)"test-thread-01":at sun.misc.Unsafe.park(Native Method)- parking to wait for<0x00000007b00a35a0> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)Found 1 deadlock.5、jmap命令jmap:可以輸出指定進程的內存中對象映射信息,或者堆的關鍵信息、內存的使用統計、GC算法、配置、類的實例信息及內存占用等 , 該命令在解決JVM問題時也經常使用;
$ jmap 1281$ jmap -heap 1281Heap Configuration:MinHeapFreeRatio= 0MaxHeapFreeRatio= 100MaxHeapSize= 536870912 (512.0MB)Heap Usage:PS Young GenerationEden Space:From Space:To Space:PS Old Generation$ jmap -histo:live 1281 num#instances#bytesclass name----------------------------------------------1311:132com.explore.facade.FacadeApp$$EnhancerBySpringCGLIB$$313d9e3四、可視化工具1、jconsoleJava內置的JVM性能監控工具,在熟悉上述的命令行工具之后,對于該可視化工具的使用不會太陌生 , 在命令中可以查看到的默認參數或者應用自定義配置,在該工具中也可以找到,并且以圖形化的方式呈現;
$ jconsole# 通過該命令會喚起jconsole界面

JDK中自帶的JVM分析工具

文章插圖
這里選擇線程一欄,可以直觀的看到線程數量的變化曲線,也可以在下方查看某個線程的具體信息,并且可以通過檢測死鎖功能 , 發現在服務中創建的test-thread-01和test-thread-02兩條線程;
JDK中自帶的JVM分析工具

文章插圖
2、visualvmVisualVM作為解決JVM問題的常用工具,集成的功能豐富且強大,此處通過Idea插件的方式啟動FacadeApp微服務,在進程主頁可以看到自定義的配置,線程一欄因為檢測到死鎖直接給到異常提示;
JDK中自帶的JVM分析工具

文章插圖
在監視一欄可以通過【堆dump】查看詳細的信息 , 可以查看類的實例數和大小 , 并且完成了結果排序和占用統計;此處信息在定位和解決JVM問題時非常重要;
JDK中自帶的JVM分析工具

文章插圖
對于JVM的監控工具來說,其能力與常用的命令行語法差異很小,并且這些命令在jdk中tools.jar包也可以找到其對應的類,對于一些更高級的監控平臺來說 , 例如Kuboard、Skywalking等 , 也對這些底層能力做了集成,其原理應該也是大同小異 。
五、參考源碼編程文檔:https://gitee.com/cicadasmile/butte-java-note應用倉庫:https://gitee.com/cicadasmile/butte-flyer-parent【JDK中自帶的JVM分析工具】

推薦閱讀