1、介绍

jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息,如果是在64位机器上,需要指定选项"-J-d64",Windows的jstack使用方式只支持以下的这种方式:

jstack [-l] pid

如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。另外,jstack工具还可以附属到正在运行的java程序中,看到当时运行的java程序的java stack和native stack的信息, 如果现在运行的java程序呈现hung的状态,jstack是非常有用的。

2、命令格式

jstack [ option ] pid
jstack [ option ] executable core
jstack [ option ] [server-id@]remote-hostname-or-IP

3、常用参数说明

1)、options:

executable Java executable from which the core dump was produced.

(可能是产生core dump的java可执行程序)

core 将被打印信息的core dump文件

remote-hostname-or-IP 远程debug服务的主机名或ip

server-id 唯一id,假如一台主机上多个远程debug服务

2)、基本参数:

-F当’jstack [-l] pid’没有相应的时候强制打印栈信息

-l长列表. 打印关于锁的附加信息,例如属于java.util.concurrent的ownable synchronizers列表.

-m打印java和native c/c++框架的所有栈信息.

-h | -help打印帮助信息

pid 需要被打印配置信息的java进程id,可以用jps查询.

4、jstack分析线程死锁

线程死锁的代码如下。

  1. public class ThreadDeadLockDemo {
  2. public static void main(String[] args) {
  3. final Object obj_1 = new Object(), obj_2 = new Object();
  4. Thread first = new Thread("first"){
  5. @Override
  6. public void run() {
  7. synchronized (obj_1) {
  8. try {
  9. Thread.sleep(3000);
  10. } catch (InterruptedException e) {}
  11. synchronized (obj_2) {
  12. System.out.println("first thread done.");
  13. }
  14. }
  15. }
  16. };
  17. Thread second = new Thread("second"){
  18. @Override
  19. public void run() {
  20. synchronized (obj_2) {
  21. try {
  22. Thread.sleep(3000);
  23. } catch (InterruptedException e) {}
  24. synchronized (obj_1) {
  25. System.out.println("seconde thread done.");
  26. }
  27. }
  28. }
  29. };
  30. first.start();
  31. second.start();
  32. }
  33. }
执行程序,会引起线程死锁。
调用 jstack命令,查看当前进程的线程状态,打印信息如下。可以发现进程已经发生了死锁,first线程等待second线程释放资源,同时,second线程也在等待first线程释放资源。
Full thread dump Java HotSpot(TM) 64-Bit Server VM (20.45-b01 mixed mode):

"Attach Listener" daemon prio=10 tid=0x00007f87d0001000 nid=0x7c1 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"DestroyJavaVM" prio=10 tid=0x00007f87fc005800 nid=0x793 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"second" prio=10 tid=0x00007f87fc0aa800 nid=0x7a1 waiting for monitor entry [0x00007f87fa5c1000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at ThreadDeadLockDemo$2.run(ThreadDeadLockDemo.java:10)
        - waiting to lock <0x00000007d7036b40> (a java.lang.Object)
        - locked <0x00000007d7036b50> (a java.lang.Object)

"first" prio=10 tid=0x00007f87fc0a8800 nid=0x7a0 waiting for monitor entry [0x00007f87fa6c2000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at ThreadDeadLockDemo$1.run(ThreadDeadLockDemo.java:10)
        - waiting to lock <0x00000007d7036b50> (a java.lang.Object)
        - locked <0x00000007d7036b40> (a java.lang.Object)

"Low Memory Detector" daemon prio=10 tid=0x00007f87fc08f800 nid=0x79e runnable [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"C2 CompilerThread1" daemon prio=10 tid=0x00007f87fc08d800 nid=0x79d waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"C2 CompilerThread0" daemon prio=10 tid=0x00007f87fc08a800 nid=0x79c waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Signal Dispatcher" daemon prio=10 tid=0x00007f87fc088800 nid=0x79b runnable [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Finalizer" daemon prio=10 tid=0x00007f87fc06c000 nid=0x79a in Object.wait() [0x00007f87facc8000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x00000007d7001300> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:118)
        - locked <0x00000007d7001300> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:134)
        at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:171)

"Reference Handler" daemon prio=10 tid=0x00007f87fc06a000 nid=0x799 in Object.wait() [0x00007f87fadc9000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x00000007d70011d8> (a java.lang.ref.Reference$Lock)
        at java.lang.Object.wait(Object.java:485)
        at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:116)
        - locked <0x00000007d70011d8> (a java.lang.ref.Reference$Lock)

"VM Thread" prio=10 tid=0x00007f87fc063800 nid=0x798 runnable

"GC task thread#0 (ParallelGC)" prio=10 tid=0x00007f87fc019000 nid=0x794 runnable

"GC task thread#1 (ParallelGC)" prio=10 tid=0x00007f87fc01a800 nid=0x795 runnable

"GC task thread#2 (ParallelGC)" prio=10 tid=0x00007f87fc01c800 nid=0x796 runnable

"GC task thread#3 (ParallelGC)" prio=10 tid=0x00007f87fc01e800 nid=0x797 runnable

"VM Periodic Task Thread" prio=10 tid=0x00007f87fc09a800 nid=0x79f waiting on condition

JNI global references: 882

Found one Java-level deadlock:
=============================
"second":
  waiting to lock monitor 0x00007f87dc005f10 (object 0x00000007d7036b40, a java.lang.Object),
  which is held by "first"
"first":
  waiting to lock monitor 0x00007f87dc004b60 (object 0x00000007d7036b50, a java.lang.Object),
  which is held by "second"

Java stack information for the threads listed above:
===================================================
"second":
        at ThreadDeadLockDemo$2.run(ThreadDeadLockDemo.java:10)
        - waiting to lock <0x00000007d7036b40> (a java.lang.Object)
        - locked <0x00000007d7036b50> (a java.lang.Object)
"first":
        at ThreadDeadLockDemo$1.run(ThreadDeadLockDemo.java:10)
        - waiting to lock <0x00000007d7036b50> (a java.lang.Object)
        - locked <0x00000007d7036b40> (a java.lang.Object)

Found 1 deadlock.

"Attach Listener" daemon prio=10 tid=0x00007f87d0001000 nid=0x7c1 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"DestroyJavaVM" prio=10 tid=0x00007f87fc005800 nid=0x793 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"second" prio=10 tid=0x00007f87fc0aa800 nid=0x7a1 waiting for monitor entry [0x00007f87fa5c1000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at ThreadDeadLockDemo$2.run(ThreadDeadLockDemo.java:10)
        - waiting to lock <0x00000007d7036b40> (a java.lang.Object)
        - locked <0x00000007d7036b50> (a java.lang.Object)

"first" prio=10 tid=0x00007f87fc0a8800 nid=0x7a0 waiting for monitor entry [0x00007f87fa6c2000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at ThreadDeadLockDemo$1.run(ThreadDeadLockDemo.java:10)
        - waiting to lock <0x00000007d7036b50> (a java.lang.Object)
        - locked <0x00000007d7036b40> (a java.lang.Object)

"Low Memory Detector" daemon prio=10 tid=0x00007f87fc08f800 nid=0x79e runnable [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"C2 CompilerThread1" daemon prio=10 tid=0x00007f87fc08d800 nid=0x79d waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"C2 CompilerThread0" daemon prio=10 tid=0x00007f87fc08a800 nid=0x79c waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Signal Dispatcher" daemon prio=10 tid=0x00007f87fc088800 nid=0x79b runnable [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Finalizer" daemon prio=10 tid=0x00007f87fc06c000 nid=0x79a in Object.wait() [0x00007f87facc8000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x00000007d7001300> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:118)
        - locked <0x00000007d7001300> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:134)
        at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:171)

"Reference Handler" daemon prio=10 tid=0x00007f87fc06a000 nid=0x799 in Object.wait() [0x00007f87fadc9000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x00000007d70011d8> (a java.lang.ref.Reference$Lock)
        at java.lang.Object.wait(Object.java:485)
        at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:116)
        - locked <0x00000007d70011d8> (a java.lang.ref.Reference$Lock)

"VM Thread" prio=10 tid=0x00007f87fc063800 nid=0x798 runnable

"GC task thread#0 (ParallelGC)" prio=10 tid=0x00007f87fc019000 nid=0x794 runnable

"GC task thread#1 (ParallelGC)" prio=10 tid=0x00007f87fc01a800 nid=0x795 runnable

"GC task thread#2 (ParallelGC)" prio=10 tid=0x00007f87fc01c800 nid=0x796 runnable

"GC task thread#3 (ParallelGC)" prio=10 tid=0x00007f87fc01e800 nid=0x797 runnable

"VM Periodic Task Thread" prio=10 tid=0x00007f87fc09a800 nid=0x79f waiting on condition

JNI global references: 882

Found one Java-level deadlock:
=============================
"second":
  waiting to lock monitor 0x00007f87dc005f10 (object 0x00000007d7036b40, a java.lang.Object),
  which is held by "first"
"first":
  waiting to lock monitor 0x00007f87dc004b60 (object 0x00000007d7036b50, a java.lang.Object),
  which is held by "second"

Java stack information for the threads listed above:
===================================================
"second":
        at ThreadDeadLockDemo$2.run(ThreadDeadLockDemo.java:10)
        - waiting to lock <0x00000007d7036b40> (a java.lang.Object)
        - locked <0x00000007d7036b50> (a java.lang.Object)
"first":
        at ThreadDeadLockDemo$1.run(ThreadDeadLockDemo.java:10)
        - waiting to lock <0x00000007d7036b50> (a java.lang.Object)
        - locked <0x00000007d7036b40> (a java.lang.Object)

Found 1 deadlock.

jstack命令 详解相关推荐

  1. linux中jstack命令详解,Linux jstack命令详解

    jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息. 如果是在64位机器上,需要指定选项"-J-d64",Windows的jstack ...

  2. Java jstack 命令详解

    Java 中 jstack 命令可以用来查看运行的 Java 进程下,多线程的运行情况,我们用一个死锁的例子来看: 比如下面这段死锁的代码: public class DeadLock {privat ...

  3. jstack 命令详解

    一.jstack 命令参数 二.jstack解决问题 1.死循环导致cpu飙高 死循环的例子:https://blog.csdn.net/goldenfish1919/article/details/ ...

  4. jstack命令详解(linux jstack命令详解)

    几种常见的操作tomcat的linux命令 重启tomcat ps x 查看pid kill -9 pid 杀死进程 /app/tomcat/bin/startup.sh 启动tomcat 追踪日志 ...

  5. jstack命令详解

    jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息,如果是在64位机器上,需要指定选项"-J-d64",Windows的jstack使 ...

  6. linux 使用jstack_Linux jstack命令详解

    jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息. 如果是在64位机器上,需要指定选项"-J-d64",Windows的jstack ...

  7. java jstack使用_jstack命令详解

    jstack命令可以用来查看运行的Java进程下,多线程的运行情况,语句如"[root@admin ~]# jstack 43616 Full thread dump Java HotSpo ...

  8. docker常用命令详解

    docker常用命令详解 本文只记录docker命令在大部分情境下的使用,如果想了解每一个选项的细节,请参考官方文档,这里只作为自己以后的备忘记录下来. 根据自己的理解,总的来说分为以下几种: Doc ...

  9. oracle home 命令,$ORACLE_HOMEbin目录下所有命令的使用方法及命令详解

    求$ORACLE_HOME/bin目录下所有命令的使用方法及命令详解 如题. $ORACLE_HOME/bin目录下有很多命令,那我们平时用到的也不是太多,即使用到的那部分可能用法也不是完全能掌握,所 ...

最新文章

  1. golang OOP面向对象
  2. android行高,android – GridView的行高
  3. java 共享软件 保护_【Java并发.3】对象的共享
  4. [NLP] TextCNN模型原理和实现
  5. 明晚直播丨基于IB网络的Oracle Extend RAC最佳实践
  6. flutter 一直loading_开源 | FLUI : Flutter 的组件扩展集
  7. 百度Apollo无人驾驶路测更进一步 李彦宏感慨:终于可以不用安全员了
  8. N - 嘤嘤嘤 (并查集+枚举)
  9. spock做post请求get请求,在springboot环境下使用gradle构建工具的demo,IDEA的开发工具
  10. laravel 图片
  11. Flex4.0判断摄像头是否被占用
  12. pclzip.lib.php,LimeSurvey
  13. 新版 中国地图 地图 高清全彩矢量大图 CDR 2021年整理制作
  14. struts1的配置文件详解
  15. TypeError: __init__() got an unexpected keyword argument ‘rate‘
  16. Liferay 6.2 改造系列之三:删除Docbar中的添加内容功能
  17. termux安装以及基本配置
  18. Java进阶(四)多态
  19. *2-2 OJ 1163 导弹拦截之测试版
  20. 【java神操作】java竟然还可以能执行Javascript代码!!

热门文章

  1. Anaconda使用教程(一)——下载、安装及环境配置
  2. 《Hexo: 从零开始编写自己的主题》1. Hexo概述以及Hexo工作原理
  3. U盘启动盘装系统Win10教程
  4. Java 实现回文数
  5. 完整版:交换机工作过程和原理
  6. 算法小讲堂之哈希表|散列表|考研笔记
  7. 自定义 ZuulFilter抛出异常
  8. 代码格式规范化, 代码风格统一
  9. 递归:由浅入深,深入了解递归
  10. C语言中exit(0)和_exit(0)