Java問題排查常見指令:jps、jstack
JVM內存分析工具 jps、jstack、jstat、jmap、jhat 的使用 - 謝端陽 - 博客園
(99+ 封私信 / 81 條消息) JVM性能調優監控工具jps、jstack、jmap、jhat、jstat使用詳解 - 知乎
1、簡介
在JAVA應用的開發和運維過程中,時常需要監控JVM的運行狀態,常用的監控工具有:jps、jstat、jmap、jstack、jinfo。
2、jps
說明
jps由jdk1.5以上提供,用于查看當前用戶下的java進程的pid及基本信息。
用法
jps 參數 hostid
如果hostid不指定,默認為當前服務器
參數
-q:極簡輸出,只輸出pid
-m:輸出傳入main方法的參數
-l:輸出完整的main類或jar名(如果是本地jar包,就從根目錄開始,例如/data/apps/test.jar;如果是子類,就從最開始的父類開始,例如sun.tools.jps.jps)
-v:輸出傳入JVM的參數
例子
-m:輸入main方法、指令的參數
-l:輸出全名
root@ubuntu:/# jps -m -l 2458 org.artifactory.standalone.main.Main /usr/local/artifactory-2.2.5/etc/jetty.xml 29920 com.sun.tools.hat.Main -port 9998 /tmp/dump.dat 3149 org.apache.catalina.startup.Bootstrap start
3、jstack
學習自:Java程序員必備:jstack命令解析jstack是JVM自帶的Java堆棧跟蹤工具,它用于打印出給定的java進程I - 掘金
1)說明
jstack用于查看某個Java進程內的線程堆棧信息。
根據堆棧信息可以定位到具體代碼,因此它在JVM性能調優中用的非常多。
2)用法
jstack 參數 pid
3)參數
-l:打印出額外的鎖的信息,在死鎖發生時可以用jstack -l pid來觀察鎖的持有情況
-m:不僅會輸出Java堆棧信息,還會輸出C/C++堆棧信息(本地方法)
4)線程狀態
由于jstack跟線程狀態息息相關,所以需要先對線程狀態有所了解。

Java的6種線程池狀態:
New:創建后尚未啟動的線程,不會出現在dump中;
RUNNABLE:包含RUNNING、READY。線程調用start()方法付時會進入該狀態,代表一種在JVM中執行的狀態。
WAITING:無限等待另一個線程的特定操作
TIMED_WAITING:有限等待另一個線程的特定操作
BLOCKED:阻塞,在線程進入同步區域時,線程將處于這種狀態,在等待monitor鎖
TERMINATED:終止,線程結束執行。
Dump文件的線程狀態(只有3種):
RUNNABLE:執行中
BLOCKED:阻塞
WAITING:線程正在等待
例子
從某個Java進程中找到最耗費CPU的Java線程并定位堆棧信息:
①找出Java進程的PID:jps
jps -l
21340 /data/apps/service.jar
②找出該進程中最耗CPU的線程:top
top -Hp 21340

默認排序是按照%CPU這一列由高到低排的,從上文中可以直觀看出pid為21350的Java線程占用了最高的CPU資源:
printf "%x\n" 21350
得到21742的十六進制值為5366。
③輸出進程堆棧信息:jstack
輸出進程堆棧信息,并根據之前查到的線程21742的十六進制值5366進行專門抓取:
jstack 21340 | grep 5366

④輸出堆棧信息到文件
這一項非必須,只是問題恢復后的分析可能需要場景還原,因此記錄當時的堆棧狀態通常很有必要。
jstack -l pid > /tmp/log.txt
之后就可以根據括號中的內容排查CPU占用最高的是哪個Java類的哪個方法了,比如上文就是JstackCPUCase.java的24行的JstackCPUCase$Task.run()方法。
有時也可以隔段時間再執行一次jstack命令,將兩次的dump結果進行對比。
如果出現鎖等待情況,會在輸出結果中顯示為parking to wait for <0x000000000d6eb8300>這樣的內容。

浙公網安備 33010602011771號