jstack和線程dump分析


jstack定義:

 

jstackJava虛擬機自帶的一種堆棧跟蹤工具。

 

基本介紹:

 

jstack用於生成java虛擬機當前時刻的線程快照。線程快照是當前java虛擬機內每一條線程正在執行的方法堆棧的集合,生成線程快照的主要目的是定位線程出現長時間停頓的原因,如線程間死鎖、死循環、請求外部資源導致的長時間等待等。

線程出現停頓的時候通過jstack來查看各個線程的調用堆棧,就可以知道沒有響應的線程到底在后台做什么事情,或者等待什么資源。

命令格式:

 

 

jstack [ option ] pid
基本參數:
-F 當’jstack [-l] pid’沒有相應的時候強制打印棧信息
-l 長列表. 打印關於鎖的附加信息,例如屬於java.util.concurrent的ownable synchronizers列表.
-m 打印java和native c/c++框架的所有棧信息. -h | -help打印幫助信息
pid 需要被打印配置信息的java進程id,可以用jps工具查詢

 

 

案例

 
C:\Users\Administrator>jstack  5516
2015-12-21 16:10:53
Full thread dump Java HotSpot(TM) 64-Bit Server VM (24.79-b02 mixed mode):

"DestroyJavaVM" prio=6 tid=0x000000000027d800 nid=0x1bb0 waiting on condition [0
x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Thread-1" prio=6 tid=0x000000000cb13800 nid=0x19ac waiting for monitor entry [0
x000000000d67f000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at thread.DeadLockDemo$2.run(DeadLockDemo.java:35)
        - waiting to lock <0x00000007d5a9be88> (a java.lang.String)
        - locked <0x00000007d5a9beb8> (a java.lang.String)
        at java.lang.Thread.run(Unknown Source)

"Thread-0" prio=6 tid=0x000000000cb0e800 nid=0x6bc waiting for monitor entry [0x
000000000d48f000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at thread.DeadLockDemo$1.run(DeadLockDemo.java:21)
        - waiting to lock <0x00000007d5a9beb8> (a java.lang.String)
        - locked <0x00000007d5a9be88> (a java.lang.String)
        at java.lang.Thread.run(Unknown Source)

 

這里運行了一段死鎖code,導致程序中的兩個線程都在等待對方釋放鎖,造成程序死鎖。

 

從這段代碼中可以明確的看出是 DeadLockDemo.class 中的第35行,和21行出現了阻塞,然后就是要優化這個函數了。

PS : 在實際運行中,往往一次 dump的信息,還不足以確認問題。建議產生三次 dump信息,如果每次 dump都指向同一個問題,我們才確定問題的典型性。 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM