当前位置:首页 > Web开发 > 正文

线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合

2024-03-31 Web开发

jstack是java虚拟机自带的一种仓库跟踪工具。

jstack用于生成java虚拟机当前时刻的线程快照。线程快照是当前java虚拟机内每一条线程正在执行的要领仓库的调集,生成线程快照的主要目的是定位线程呈现永劫间搁浅的原因,

如线程间死锁、死循环、请求外部资源导致的永劫间期待等。 线程呈现搁浅的时候通过jstack来检察各个线程的挪用仓库,就可以知道没有响应的线程到底在后台做什么工作,或者

期待什么资源。 如果java措施瓦解生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java措施是如何瓦解和在程

序何处产生问题。此外,jstack工具还可以从属到正在运行的java措施中,看到其时运行的java措施的java stack和native stack的信息, 如果此刻运行的java措施泛起hung

的状态,jstack长短常有用的。

jstack命令:

Usage: jstack [-l] <pid> (to connect to running process) jstack -F [-m] [-l] <pid> (to connect to a hung process) jstack [-m] [-l] <executable> <core> (to connect to a core file) jstack [-m] [-l] [[email protected]]<remote server IP or hostname> (to connect to a remote debug server) Options: -F to force a thread dump. Use when jstack <pid> does not respond (process is hung) -m to print both java and native frames (mixed mode) -l long listing. Prints additional information about locks -h or -help to print this help message

-F 当’jstack [-l] pid’没有相应的时候强制打印栈信息,如果直接jstack无响应时,用于强制jstack,一般情况不需要使用

-l 长列表. 打印关于锁的附加信息,例如属于java.util.concurrent的ownable synchronizers列表,会使得JVM搁浅得持久得多

(可能会差很多倍,好比普通的jstack可能几毫秒和一次GC没区别,加了-l 就是近一秒的时间),-l 建议不要用。一般情况不需要使用

-m 打印java和native c/c++ 框架的所有栈信息.可以打印JVM的仓库,显示上Native的栈帧,一般应用排查不需要使用

执行命令:

jstack -m 12905

Attaching to process ID 12905, please wait... Debugger attached successfully. Server compiler detected. JVM version is 24.71-b01 Deadlock Detection: No deadlocks found. ----------------- 12908 ----------------- 0x000000358d40b63c __pthread_cond_wait + 0xcc 0x00007fcad07875a5 Unsafe_Park + 0x125 0x00007fcacc4b17f8 * sun.misc.Unsafe.park(boolean, long) bci:0 (Interpreted frame) 0x00007fcacc4a5058 * java.util.concurrent.locks.LockSupport.park(java.lang.Object) bci:14 line:186 (Interpreted frame) 0x00007fcacc4a5058 * java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt() bci:1 line:834 (Interpreted frame) 0x00007fcacc4a5350 * java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedInterruptibly(int) bci:72 line:994 (Interpreted frame) 0x00007fcacc4a5058 * java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(int) bci:24 line:1303 (Interpreted frame)

线程状态

想要通过jstack命令来分析线程的情况的话,首先要知道线程都有哪些状态,下面这些状态是我们使用jstack命令检察线程仓库信息时可能会看到的线程的几种状态:

NEW,未启动的。不会呈此刻Dump中。 RUNNABLE,在虚拟机内执行的。 BLOCKED,受梗阻并期待监视器锁。 WATING,无限期期待另一个线程执行特定操纵。 TIMED_WATING,有时限的期待另一个线程的特定操纵。 TERMINATED,已退出的。

Monitor

在多线程的 JAVA措施中,实现线程之间的同步,就要说说 Monitor。 Monitor是 Java顶用以实现线程之间的互斥与协作的主要手段,它可以当作是东西或者 Class的锁。每一个东西都有,
也仅有一个 monitor。下 面这个图,描述了线程和 Monitor之间关系,,以 及线程的状态转换图:

技术图片

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/32512.html