
image.png
jstack一般用來查看指定線程(比如CPU較高、內(nèi)存占用較高)的堆棧、查看死鎖的原因。
打印對指定進程的堆棧信息:
jstack 進程號
(只截取了開頭和結(jié)尾):

image.png

image.png
查找指定線程的堆棧(比如CPU消耗最高的線程):
1.top查找出哪個進程消耗的cpu高。執(zhí)行top命令,默認是進程視圖,其中PID是進程號
21125 co_ad2 18 0 1817m 776m 9712 S 3.3 4.9 12:03.24 java
5284 co_ad 21 0 3028m 2.5g 9432 S 1.0 16.3 6629:44 ja
這里我們分析21125這個java進程
2.top中shift+h 或“H”查找出哪個線程消耗的cpu高
先輸入top,然后再按shift+h 或“H”,此時打開的是線程視圖,pid為線程號
21233 co_ad2 15 0 1807m 630m 9492 S 1.3 4.0 0:05.12 java
20503 co_ad2_s 15 0 1360m 560m 9176 S 0.3 3.6 0:46.72 java
這里我們分析21233這個線程,并且注意的是,這個線程是屬于21125這個進程的。
3.使用jstack命令輸出這一時刻的線程棧,保存到文件,命名為jstack.log。注意:輸出線程棧和保存top命令快照盡量同時進行。
由于jstack.log文件記錄的線程ID是16進制,需要將top命令展示的線程號轉(zhuǎn)換為16進制。
4. jstack查找這個線程的信息
jstack [進程]|grep -A 10 [線程的16進制]
即: jstack 21125|grep -A 10 52f1
-A 10表示查找到所在行的后10行。21233用計算器轉(zhuǎn)換為16進制52f1,注意字母是小寫。
結(jié)果:
"http-8081-11" daemon prio=10 tid=0x00002aab049a1800 nid=0x52f1 in Object.wait() [0x0000000042c75000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:485)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.await(JIoEndpoint.java:416)
在結(jié)果中查找52f1,可看到當前線程在做什么。