Stack Trace for Java,用於生成虛擬機當前的線程快照信息,包含每一條線程的堆棧信息。該命令一般用於定位線程停頓緣由,當出現線程停頓時,可經過stack查看每一個線程的堆棧信息,進而分析停頓緣由。 java
命令格式:
jstack [ option ] pid apache
經常使用參數: tomcat
-l | 除堆棧外,顯示鎖的附加信息 |
-F | 當請求不被響應時,強制輸出線程堆棧 |
-m | 混合模式,打印java和本地C++調用的堆棧信息 |
1.top查找出哪一個進程消耗的cpu高。執行top命令,默認是進程視圖,其中PID是進程號
co_ad2 18 0 1817m 776m 9712 S 3.3 4.9 12:03.24 java
co_ad 21 0 3028m 2.5g 9432 S 1.0 16.3 6629:44 ja.net
這裏咱們分析21125這個java進程
2.top中shift+h 或「H」查找出哪一個線程消耗的cpu高
先輸入top,而後再按shift+h 或「H」,此時打開的是線程視圖,pid爲線程號
co_ad2 15 0 1807m 630m 9492 S 1.3 4.0 0:05.12 java
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命令展現的線程號轉換爲16進制。get
4. jstack查找這個線程的信息
jstack [進程]|grep -A 10 [線程的16進制]
即: jstack 21125|grep -A 10 52f1 虛擬機
-A 10表示查找到所在行的後10行。21233用計算器轉換爲16進制52f1,注意字母是小寫。
結果:
"http-8081-11" daemon prio=10 tid=0x00002aab049a1800 nid=0x52bb 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) it
在結果中查找52f1,可看到當前線程在作什麼。io