Java線程之Dump


什么是線程dump

Java Thread dump記錄了線程在jvm中的執行信息,可以看成是線程活動的日志。Java線程轉儲文件有助於分析應用程序和死鎖情況中的瓶頸。

如何獲取線程轉儲文件

在這里,我們將學習為java程序生成線程轉儲的多種方法,這些指令對於linux操作系統是有效的,但是在windows中,這些步驟可能有些不同。

1.使用VisualVM Profiler

右鍵選擇線程Dump便會自動生成線程轉儲文件,當然你也可以連接遠程機器對其進行監控和分析
在這里插入圖片描述

2.jstack

jdk自帶的工具jstack通過它我們也可以生成應用程序的線程轉儲文件,只需要兩步即可完成:

1>找到應用程序的進程ID  
ps -eaf | grep java
2> 輸出線程轉儲信息到文件或控制台
jstack PID >> mydumps.tdump
jstack PID  

3.kill -3 PID

該方法與其它生成線程轉儲文件的方法略有不同,當kill命令發出時,線程存儲文件將在該應用程序的外部生成,如果java程序是一個Tomcat服務器,帶有系統輸出文件catalina.out,那么將在此文件中生成線程轉儲

4.jcmd

jdk8中介紹了jcmd工具,在jdk8及以上環境下,可以使用此命令生成線程轉儲文件
命令是:

jcmd PID Thread.print

線程轉儲文件說明

"Attach Listener" #44 daemon prio=9 os_prio=0 tid=0x00007f88b0001800 nid=0xa89 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"ajp-nio-8009-AsyncTimeout" #42 daemon prio=5 os_prio=0 tid=0x00007f88dc49c000 nid=0xa7e waiting on condition [0x00007f88c8470000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
        at java.lang.Thread.sleep(Native Method)
        at org.apache.coyote.AbstractProtocol$AsyncTimeout.run(AbstractProtocol.java:1211)
        at java.lang.Thread.run(Thread.java:748)

"ajp-nio-8009-Acceptor-0" #41 daemon prio=5 os_prio=0 tid=0x00007f88dc3b8800 nid=0xa7d runnable [0x00007f88c8571000]
   java.lang.Thread.State: RUNNABLE
        at sun.nio.ch.ServerSocketChannelImpl.accept0(Native Method)
        at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:422)
        at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:250)
        - locked <0x00000000f5f08d48> (a java.lang.Object)
        at org.apache.tomcat.util.net.NioEndpoint$Acceptor.run(NioEndpoint.java:453)
        at java.lang.Thread.run(Thread.java:748)

"ajp-nio-8009-ClientPoller-0" #40 daemon prio=5 os_prio=0 tid=0x00007f88dc3b6800 nid=0xa7c runnable [0x00007f88c8672000]
   java.lang.Thread.State: RUNNABLE
        at sun.nio.ch.EPollArrayWrapper.epollWait(Native Method)
        at sun.nio.ch.EPollArrayWrapper.poll(EPollArrayWrapper.java:269)
        at sun.nio.ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:93)
        at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:86)
        - locked <0x00000000f0e02b08> (a sun.nio.ch.Util$3)
        - locked <0x00000000f0e02af8> (a java.util.Collections$UnmodifiableSet)
        - locked <0x00000000f0e029e0> (a sun.nio.ch.EPollSelectorImpl)
        at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:97)
        at org.apache.tomcat.util.net.NioEndpoint$Poller.run(NioEndpoint.java:785)
        at java.lang.Thread.run(Thread.java:748)

線程轉儲是所有線程的列表,每個條目顯示關於線程的信息,其中包括按照執行的順序進行跟蹤的信息。線程轉儲文件中的信息包含以下幾個部分:

1、線程名字
2、線程優先級
3、線程ID
4、線程狀態:顯示當前線程狀態,例如:RUNNABLE, WAITING, 5、BLOCKED,在分析死鎖的同時,查找他們試圖獲取鎖的阻塞線程和資源
6、堆棧信息:在這里如果線程在等待任何鎖,我們可以看到線程獲得的鎖的地方

翻譯自:https://www.journaldev.com/1053/java-thread-dump-visualvm-jstack-kill-3-jcmd


免責聲明!

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



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