java 堆栈信息_每天学习一个命令:jstack 打印 Java 进程堆栈信息
Jstack 用于打印出給定的 java 進程 ID 或 core file 或遠程調試服務的 Java 堆棧信息。
這里需要注意的是 Java 8 引入了 Java Mission Control,Java Flight Recorder,和 jcmd 等工具來幫助診斷 JVM 和 Java 應用相關的問題。推薦使用最新的工具以及 jcmd 來進行診斷。
Prints Java thread stack traces for a Java process, core file, or remote debug server. This command is experimental and unsupported.
jstack 命令能夠:
Troubleshoot with jstack Utility
Force a Stack Dump
Stack Trace from a Core Dump
Mixed Stack
如果 java 程序崩潰生成 core 文件,jstack 工具可以用來獲得 core 文件的 java stack 和 native stack 的信息,從而可以輕松地知道 java 程序是如何崩潰和在程序何處發生問題。另外,jstack 工具還可以附屬到正在運行的 java 程序中,看到當時運行的 java 程序的 java stack 和 native stack 的信息,如果運行的 java 程序呈現 hung 的狀態,jstack 是非常有用的。
thread dump 就是將當前時刻正在運行的 JVM 的線程拷貝一份,可以用來分析程序執行情況。
用法
打印某個進程的堆棧信息
jstack [PID]
jstack -l [PID]
jstack -m [PID]
jstack -F [PID]
關于如何找到 PID,有很多方法,使用 jps -v 或者 ps -aux 或者 htop 等等方法都可以。
說明:
-l 選項會打印額外的信息,比如說鎖信息, locks such as a list of owned java.util.concurrent ownable synchronizers,可以查看 AbstractOwnableSynchronizer
-F Force a Stack Dump
分析 jstack 輸出
在執行 jstack -l [PID] > /tmp/output.txt 之后可以對 /tmp/output.txt 進行分析
jstack 輸出開頭是當前 dump 的時間和 JVM 基本信息(包括版本等):
2018-05-24 14:41:06
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.101-b13 mixed mode):
Threads class SMR info:
_java_thread_list=0x00007f3cd4005870, length=30, elements={
0x00007f3d14011800, 0x00007f3d142dd800, 0x00007f3d142e1800, 0x00007f3d142f4000,
0x00007f3d142f6000, 0x00007f3d142f8000, 0x00007f3d142fa000, 0x00007f3d14333800,
0x00007f3d14340000, 0x00007f3d14bc6800, 0x00007f3c900a1000, 0x00007f3c90255000,
0x00007f3c9025e800, 0x00007f3c90264000, 0x00007f3d14bdf800, 0x00007f3c64008800,
0x00007f3c6400b000, 0x00007f3d14c1e800, 0x00007f3c54025800, 0x00007f3c54027000,
0x00007f3c54042800, 0x00007f3c54044800, 0x00007f3c24005800, 0x00007f3c0c008800,
0x00007f3c0c00a000, 0x00007f3c0c00b800, 0x00007f3c48027000, 0x00007f3c48010000,
0x00007f3c48011000, 0x00007f3cd4004800
}
接下來就是程序的線程信息(非 VM 線程,非 GC 線程):
"main" #1 prio=5 os_prio=0 cpu=1071286.79ms elapsed=509136.64s tid=0x00007f3d14011800 nid=0xad5 runnable [0x00007f3d1993a000]
java.lang.Thread.State: RUNNABLE
at org.eclipse.swt.internal.gtk.OS.Call(Native Method)
at org.eclipse.swt.widgets.Display.sleep(Display.java:5570)
at smartgit.Wx.d(SourceFile:305)
at com.syntevo.smartgit.n.a(SourceFile:398)
at com.syntevo.smartgit.n.a(SourceFile:247)
"Reference Handler" #2 daemon prio=10 os_prio=0 cpu=94.43ms elapsed=509136.51s tid=0x00007f3d142dd800 nid=0xadc waiting on condition [0x00007f3cf10f4000]
java.lang.Thread.State: RUNNABLE
at java.lang.ref.Reference.waitForReferencePendingList(java.base@11.0.3/Native Method)
at java.lang.ref.Reference.processPendingReferences(java.base@11.0.3/Reference.java:241)
at java.lang.ref.Reference$ReferenceHandler.run(java.base@11.0.3/Reference.java:213)
Locked ownable synchronizers:
- None
線程信息又可以劃分成幾個部分。
Section
Example
解釋
線程名字
main 和 Reference Handler
可讀的線程名字,這個名字可以通過 Thread 方法 setName 設定
線程 ID
#1
每一個 Thread 對象的唯一 ID,這個 ID 是自動生成的,從 1 開始,通過 getId 方法獲得
是否守護線程
daemon
這個標簽用來標記線程是否是守護線程,如果是會有標記,如果不是這沒有
優先級
prio=10
Java 線程的優先級,可以通過 setPriority 方法設置
OS 線程的優先級
os_prio
CPU 時間
cpu=94.43ms
線程獲得 CPU 的時間
elapsed
elapsed=509136.51s
線程啟動后經過的 wall clock time
Address
tid
Java 線程的地址,這個地址表示的是 JNI native Thread Object 的指針地址
OS 線程 ID
nid
The unique ID of the OS thread to which the Java Thread is mapped.
線程狀態
wating on condition
線程當前狀態 線程狀態下面就是線程的堆棧信息
Locked Ownable Synchronizer
線程的運行狀態:
New: 線程對象創建,不可執行
Runnable: 調用 thread.start() 進入 runnable,獲得 CPU 時間即可執行
Running: 執行
Waiting: thread.join()或調用鎖對象 wait() 進入該狀態,當前線程會保持該狀態直到其他線程發送通知到該對象
Timed_Waiting:執行 Thread.sleep(long)、thread.join(long) 或 obj.wait(long) 等就會進該狀態,與 Waiting 的區別在于 Timed_Waiting 的等待有時間限制;
Blocked: 等待鎖,進入同步方法,同步代碼塊,如果沒有獲取到鎖會進入該狀態。該線程嘗試進入一個被其他線程占用的 synchronized 塊,當前線程直到鎖被釋放之前一直都是 blocked 狀態
Dead:執行結束,或者拋出了未捕獲的異常之后
Deadlock: 死鎖
Waiting on condition:等待某個資源或條件發生來喚醒自己
Waiting on monitor entry:在等待獲取鎖
terminated 線程已經結束 run() 并且通知其他線程 joining
以上內容來自 Oracle
通過 jstack 信息可以分析線程死鎖,或者系統瓶頸,但是這篇文章比較粗淺,只介紹了大概,等以后熟悉了補上。
reference
總結
以上是生活随笔為你收集整理的java 堆栈信息_每天学习一个命令:jstack 打印 Java 进程堆栈信息的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux可以用dos命令是什么意思,L
- 下一篇: java date 实例_Java Da