Java--定位問題工具

jps (JVM process status)可以查看Java虛擬機進程執行情況,-l顯示具體的啓動類,-m顯示具體的入參。-v顯示啓動配置的jvm參數

jps -l

在這裏插入圖片描述

jstats(JVM statistic Monitoring tool):查看虛擬機上各項運行狀態信息。
查看虛擬機號爲5640的gc情況。

jstat -gc 5640

在這裏插入圖片描述

jinfo:查看和調整虛擬機的各項參數

jinfo -flag

如查看是否使用了UseSerial垃圾回收器

jinfo -flag UseSerialGC 5640

在這裏插入圖片描述
使用的減號,那麼沒用用UseSerial收集器。

jmap(JVM Memory Map For Java):生成堆內存快照,

jmap -dump:format=b,file=jmapDumpFile 3137

也可以在出現內存溢出後自動生成dump文件。

jhat(JVM Heap Analysis Tool)分析jmap生成的堆內存快照。

jhat jmapDumpFile

顯示Server is ready後在瀏覽器中輸入http://192.168.209.101:7000查看結果
一幫查詢堆內存中總容量最大的對象。
在這裏插入圖片描述

jstack:生成線程執行的棧信息,定位線程出現長時間停頓的原因

jstack -l 3137

定位線上CPU使用率過高的問題。
模擬該場景,在main函數中寫個死循環,使用top命令得到該進程id。
在這裏插入圖片描述
使用jps -l查詢得到是那個項目
在這裏插入圖片描述
如下命令得到佔用的線程

ps -mp 2050 -o THREAD,tid,time

time爲佔用的時間,tid爲線程id
在這裏插入圖片描述
-m顯示所有的線程
-p pid進程使用cpu的時間
-o 使用用戶自定義的格式。
佔用的線程爲2051,需要轉換爲16進制。

printf "%x\n" 2051

如果出現16進制數爲字母,需要轉爲小寫。

如下命令得到具體那個線程

jstack 2050 |grep 803 -A60

整體流程爲:
1topid\color{#FF0000}{1 通過top得到佔用過高的進程id}
2psmpid\color{#FF0000}{2 通過ps -mp得到佔用過高的線程id}
3jstackidgrepid\color{#FF0000}{3 通過jstack 進程id得到線程快照,從快照中grep那個線程id,即可得到具體是那個線程執行的那個代碼塊}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章