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 进程堆栈信息相关推荐

  1. linux查看某个nas盘io,每天学习一个命令:pidstat 查看进程消耗资源

    pidstat 是 sysstat 工具包含的一个命令,主要用于监控 Linux Kernel 管理的进程资源占用情况,包括 CPU,IO,内存,线程等等. The pidstat command i ...

  2. 运行单个源文件_使用一个命令执行单个Java源文件

    运行单个源文件 JDK增强提案 ( JEP ) 草案于2017年末创建,名为" 启动单文件源代码程序 "(其相关的JDK问题为JDK-8192920 ). 顾名思义,该JEP草案旨 ...

  3. java编程学习方法_在线学习Java编程的最佳方法

    java编程学习方法 1.简介 Java是使用最广泛的编程语言之一. 根据Github的最新报告 ,Java被列为仅次于JavaScript的第二大最常用的编程语言. 掌握Java的人有很多话题. 好 ...

  4. 使用一个命令执行单个Java源文件

    JDK增强提案 ( JEP ) 草案于2017年末创建,名为" 启动单文件源代码程序 "(其相关的JDK问题为JDK-8192920 ). 顾名思义,该JEP草案旨在"增 ...

  5. java项目_值得学习和练手的Java企业级开源项目,强烈推荐!

    热门文章推荐:100本纸质书籍免费包邮!22款高颜值的终端工具,点燃了小姐姐对编程的热爱! 一条 SQL 引发的事故,同时小姐姐直接被开除!! 11月全国程序员平均工资新鲜出炉,内附封面图! 文末有彩 ...

  6. 学JAVA的为什么_为什么学习Java的人越来越多

    学习Java的发展前景广阔且发展方向多样性,不仅可以成为高级技术开发人才,还可以向管理岗发展,成为项目经理.通过分析企业对求职者的招聘技能,我们可以发现基础知识占据较大比重.为什么转行学习java开发 ...

  7. eps提取高程点在哪里_只需一个命令,就能提取CAD图纸所有高程点坐标,感觉学费白交了...

    原标题:只需一个命令,就能提取CAD图纸所有高程点坐标,感觉学费白交了 作为乙方设计师,经常会碰到一些甲方爸爸临时扔一个图纸过来,我们这个时候就要对图纸里提取有效数据信息才能进行下一步工作,拿到CAD ...

  8. 命令 结构_只需一个命令!从你的U盘里读出更多内容

    U盘是我们最常使用的一种USB设备,本文使用DOSUSB做驱动,试图以读取扇区的方式读取你的U盘. 温馨提示 本文涉及的协议可能会比较多. 了解你的U盘 首先我们用程序usbview.exe去看一下你 ...

  9. mybatis 不同格式日期比较大小_怎样创建一个命令函数来获得不同国家和应用程序所要求的大多数日期格式...

    今天领导让我导出17年至19年的XX消费记录.还要按月汇总...我也醉了.查了各种资料都是说用convert(),再用 left截断.后来终于在生产库里边找到了format_date()函数.真不错, ...

最新文章

  1. Javascript实现边框闪动
  2. 【Opencv实战】趣味应用 | 用OpenCV自动给图片添加虚拟特效---平淡的生活需要技术的点缀~
  3. ios 添加block 类别_iOS 关于Block代码块的详解
  4. idea设置scanner = new Scanner(System.in);的实时模板
  5. boost::iterator_archetypes用法的测试程序
  6. java oca_OCA第4部分中的Java难题
  7. 前端学习(2892):如何异步请求封装
  8. 前端学习(1797):前端调试之html/css介绍
  9. 智能指针的释放_堆栈里的悄悄话——智能指针
  10. 【持久化框架】Mybatis与Hibernate的详细对比
  11. 【转】计算机键盘功能键作用
  12. linux meta 18.0.1 系统安装nodejs
  13. 解决pip pandas 安装提示time out
  14. C# 检测USB是否插入
  15. Ansible自动化采集数据并生成巡检报告
  16. idou老师教你学Istio12 : Istio 实现流量镜像
  17. 《海豚湾》网友评论转载
  18. maven lastUpdated 文件清理脚本
  19. unity gizmo绘制圆形帮助调试
  20. OPEN.V.xx.N

热门文章

  1. 阿里云飞天洛神2.0:高性能网络软硬一体化技术实践
  2. 天弘基金交易数据清算从8小时缩至1.5小时 解决余额宝算力难题
  3. Flink 零基础实战教程:如何计算实时热门商品
  4. 阿里专家杜万:Java响应式编程,一文全面解读
  5. 深度学习目标检测系列:faster RCNN实现|附python源码
  6. 关于SDN的未来,Linux基金会专访阿里云网络大神
  7. AliOS Things 组件系统(uCube)
  8. 最新!MongoDB 重磅发布 MongoDB 5.0 和无服务器 Atlas
  9. 那天我去逛街,发现连大编程语言都摆起地摊了……
  10. 行,Python终于跌神坛了!程序员:活该!你敢来评论吗...