当前位置: 首页 > 后端技术 > Java

Java的jstack命令详解

时间:2023-04-01 19:45:48 Java

jstack命令介绍jstack(JavaVirtualMachineStackTrace)是JDK提供的一个命令行工具,可以生成Java虚拟机当前时刻的线程快照信息。线程快照一般称为threaddump或javacore文件,它是当前Java虚拟机中每个线程正在执行的Java线程、虚拟机内部线程以及可选的native方法栈帧的集合。对于每个方法堆栈帧,都会显示完整的类名、方法名、字节码索引(BCI)和行号。生成的线程快照可以用来定位线程长时间停顿的原因,例如:线程间死锁、死循环、请求外部资源长时间停顿等。jstack命令参数命令语法:jstack[options]pid命令参数说明:option:jstack命令的可选参数。如果不指定该参数,jstack命令会显示当前时刻Java虚拟机的线程快照信息,如下图:pid:要打印其配置信息的Java虚拟机的进程ID.要获取正在运行的Java虚拟机进程的列表,请使用ps命令(在Linux系统上)或tasklist命令(在Windows系统上),或者如果Java虚拟机进程未在单独的docker实例中运行,则使用jps命令。选项有哪些参数?让我们来看看。-F参数如果Java虚拟机进程因进程挂起而没有响应,可以使用-F参数(仅限OracleSolaris和Linux操作系统)强制显示线程快照信息。例如:-l参数如果使用-l参数,jstack命令除了显示方法栈帧外,还会显示锁的附加信息,比如属于java.util.concurrent的可拥有同步器列表。例如:-m参数如果使用了-m参数,则jstack命令会显示混合栈帧信息,除了Java方法栈帧外,还有本地方法栈帧。本机方法堆栈框架是用C或C++编写的虚拟机代码或JNI/本机代码。例如:显示结果中,带星号前缀的帧为Java方法栈帧,不带星号前缀的帧为本地方法栈帧。例如:-h和-help显示jstack命令的帮助信息。最后,虽然jstack命令已经推出了很长时间,使用也比较频繁,但它仍然是一个“实验性和不受支持”(ExperimentalandUnsupported)的工具。以后可能会转化为普通版,也可能会在某个JDK版本中消失得无影无踪。所以,用它,珍惜它。不过我们也可以通过Thread.getAllStackTracesgetAll()方法获取Java虚拟机中所有线程的StackTraceElement对象,进而获取所有线程栈帧信息。最后,谢谢你这么帅,给我点赞和关注。