jstack:Java进程中线程的堆栈信息跟踪工具

功能简介

jstack常用来打印Java进程/core文件/远程调试端口的Java线程堆栈跟踪信息,包含当前虚拟机中所有线程正在执行的方法堆栈信息的集合。

主要用来定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待。

命令格式

 jstack [ options ] pid                                      //Java进程
jstack [ options ] executable core //core文件
jstack [ options ] [ server-id@ ] remote-hostname-or-IP //远程调试端口

其中options选项可有

选项 作用
-F 当正常输出的请求不被响应时,强制输出线程堆栈
-l 除了堆栈外,显示关于锁的附加信息
-m 如果调用到本地方法的话,可以显示C/C++的堆栈信息

其他说明

1、When the specified process is running on a 64-bit Java Virtual Machine, you might need to specify the -J-d64 option, for example: jstack -J-d64 -m pid.

2、In mixed mode stack trace, the -m option does not work with the remote debug server.

3、In Windows Systems where the dbgeng.dll file is not present, Debugging Tools For Windows must be installed so these tools work.

输出格式

jstack的输出是该进程下的所有线程的堆栈集合,下面是一个线程的堆栈快照信息:

 "pool-1-thread-3" # prio= os_prio= tid=0x00007fc99412f000 nid=0x9bc in Object.wait() [0x00007fc97c2f2000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x00000000d7017420> (a com.liang.java.thinkinginjava.concurency.waxomatic.Car)
at java.lang.Object.wait(Object.java:)
at com.liang.java.thinkinginjava.concurency.waxomatic.Car.waitForBuffing(WaxOMatic.java:)
- locked <0x00000000d7017420> (a com.liang.java.thinkinginjava.concurency.waxomatic.Car)
at com.liang.java.thinkinginjava.concurency.waxomatic.WaxOn.run(WaxOMatic.java:)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:)
at java.lang.Thread.run(Thread.java:) Locked ownable synchronizers:
- <0x00000000d729cdb0> (a java.util.concurrent.ThreadPoolExecutor$Worker)

其中 "pool-1-thread-3" 是线程名称

prio= 是该线程JVM中的优先级

os_prio= 是该线程在OS中的优先级

tid=0x00007fc99412f000 是JVM内的thread id (Java-level thread ID)

nid=0x9bc 是Native thread ID,本地操作系统相关的线程id

This ID is highly platform dependent. It's the nid in jstack thread dumps.

  • On Windows, it's simply the OS-level thread ID within a process.

  • On Linux, it's the pid of the thread (which in turn is a light-weight process).

  • On Solaris, it's the thread as returned by thr_self().

  • On Mac OS X, it is said to be the native pthread_t value.

线程状态

在jstack输出的第二行为线程的状态,在JVM中线程状态使用枚举 java.lang.Thread.State 来表示,State的定义如下:

 /**
* A thread can be in only one state at a given point in time.
* These states are virtual machine states which do not reflect any operating system thread states.
*/
public enum State {
/**
* A thread that has not yet started is in this state.
*/
NEW, /**
* A thread executing in the Java virtual machine is in this state.
*/
RUNNABLE, /**
* A thread that is blocked waiting for a monitor lock is in this state.
*/
BLOCKED, /**
* A thread that is waiting indefinitely for another thread to perform a particular action is in this state.
*/
WAITING, /**
* A thread that is waiting for another thread to perform an action for up to a specified waiting time is in this state.
*/
TIMED_WAITING, /**
* A thread that has exited is in this state.
*/
TERMINATED;
}

这个状态是指的JVM中的状态,与任何操作系统的线程状态都没有任何关系。

其中RUNNABLE表示:线程在JVM中是可以执行的了,但是他可能还在等待着某些操作系统资源,如:cpu

其中BLOCKED表示:表示线程在等待或被notify后等待重新进入synchronized代码块/方法

其中WAITING表示:表示调用了Object.wait()/Thread.join()/LockSupport.park()方法,等待被另一个线程唤醒。例如一个线程调用了Object.wait(),在等待另一个线程调用Object.notify()/Object.notifyAll();一个线程调用了Thread.join(),在等待另一线程到达terinate状态

其中TIMED_WAITING表示:表示线程调用了Object.sleep(long)/Object.wait(long)/Thread.join(long)/LockSupport.parkNanos()/LockSupport.parkUntil()等,等待一段时间后就会自动结束的方法;

也就是说BLOCKED在等待锁,WAITING在等待被其他线程,TIMED_WAITING是带闹钟的WAITING

下面献上网上找到的一个高清状态转换图:

样例

java线程的获得:使用jps -l,或者使用top命令查看使用cpu/memory最多的进程id,或者ps -aux | grep java

进程id的获得:top -Hp pid,找到改线程下的最繁忙的进程id(十进制要转换成16进制:printf "%x\n" tid)

jstack -l pid | grep tid

关于各种线程状态下的例子,网上实在是太多了,一搜一大把!

参考

https://gist.github.com/rednaxelafx/843622

https://segmentfault.com/a/1190000008506752

jstack简介的更多相关文章

  1. JVM性能调优监控工具

    命令:jps.jstat.jmap.jhat.jstack 简介:(1) jmap -dump:format=b,file=eclipse.bin 10481  生成堆转储快照eclipse.bin ...

  2. Java自带的性能监测工具用法简介——jstack、jconsole、jinfo、jmap、jdb、jsta、jvisualvm

    JDK内置工具使用 一.javah命令(C Header and Stub File Generator) 二.jps命令(Java Virtual Machine Process Status To ...

  3. JDK中jps、jinfo、jstat、jstack、jmap、jconsole等命令简介

    JDK提供了几个很实用的工具,如下: jinfo:观察运行中的java程序的运行环境参数:参数包括Java System属性和JVM命令行参数,java class path等信息.命令格式:jinf ...

  4. HDFS简介【全面讲解】

    http://www.cnblogs.com/chinacloud/archive/2010/12/03/1895369.html [一]HDFS简介HDFS的基本概念1.1.数据块(block)HD ...

  5. Jconsole: JAVA 监视和管理控制台简介

    Jconsole: JAVA 监视和管理控制台简介 JDK中除了提供大量的命令行之外,还提供两个功能强大的可视化工具:JConsole和VisualVM. 之前对java的调试一直停留在 右键-> ...

  6. jstack

    简介 jstack用于打印出给定的java进程ID的Java堆栈信息,一般用于检查应用的线程问题,死锁问题 常用命令 jstack 输出 $ jstack 11376 2014-01-21 20:36 ...

  7. Java 问题定位工具 ——jstack

    简介 jstack 主要用于生成虚拟机当前时刻的「线程快照」.线程快照是当前 Java 虚拟机每一条线程正在执行的方法堆栈的集合. 生成线程快照的主要目的是用于定位线程出现长时间停顿的原因,如线程间死 ...

  8. Java 内存监控命令简介(零)

    一.Java性能监控与调优命令.工具简介 1.jps :查看当前运行的Java程序端口号,包括运行jps的程序端口号. 2.jinfo :查看Java进程的运行时信息. 3.jmap + MAT :通 ...

  9. tomcat -> 简介&部署

    Tomcat 简介 Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache.Sun和其他一些公司及个人共同开 ...

随机推荐

  1. iOS音频篇:使用AVPlayer播放网络音乐

    http://www.cocoachina.com/ios/20160324/15767.html 引言 假如你现在打算做一个类似百度音乐.豆瓣电台的在线音乐类APP,你会怎样做? 首先了解一下音频播 ...

  2. 源码:自己用Python写的iOS项目自动打包脚本

    http://www.cocoachina.com/ios/20160307/15501.html 什么?又要测试包! 做iOS开发几年了,每天除了码代码,改Bug之外,最让我烦恼的莫过于测试的妹子跑 ...

  3. Leetcode700.Search in a Binary Search Tree二叉搜索树中的搜索

    给定二叉搜索树(BST)的根节点和一个值. 你需要在BST中找到节点值等于给定值的节点. 返回以该节点为根的子树. 如果节点不存在,则返回 NULL. class Solution { public: ...

  4. openssl生成证书 - CSDN博客

    大家都可以生成公钥.私钥对,无法确认公钥对到底是谁的. 如果能够确定公钥到底是谁的,就不会有这个问题了.例如,如果收到“黑客”冒充“服务器”发过来的公钥,经过某种检查,如果能够发现这个公钥不是“服务器 ...

  5. 《2019上半年DDoS攻击态势报告》发布:应用层攻击形势依然严峻,海量移动设备成新一代肉鸡

    2019年上半年,阿里云安全团队平均每天帮助用户防御2500余次DDoS攻击,与2018年持平.目前阿里云承载着中国40%网站流量,为全球上百万客户提供基础安全防御.可以说,阿里云上的DDoS攻防态势 ...

  6. 如何用SPSS分析学业情绪量表数据

    如何用SPSS分析学业情绪量表数据 1.数据检验.由于问卷.量表的题目是主观判断和选择,因而难免有些人不认真填,所以,筛选出有效.高质量的数据非常关键.通常需要作如下检查:(1)是否有人回答互相矛盾, ...

  7. Android书架实现

    转自http://blog.csdn.net/wangkuifeng0118/article/details/7944215 书架效果: 下面先看一下书架的实现原理吧! 首先看一下layout下的布局 ...

  8. Effective C++: 06继承与面向对象设计

    32:确定你的public继承塑模出is-a关系 以C++进行面向对象编程,最重要的一个规则是:public继承表示的是"is-a"(是一种)的关系. 如果令class D以pub ...

  9. django2.0基础

    一.安装与项目的创建 1.安装 pip install django 2.查看版本 python -m django --version 3.创建项目 django-admin startprojec ...

  10. BKDRHash算法的初步了解

    字符串hash最高效的算法,  搜了一下,  原理是: 字符串的字符集只有128个字符,所以把一个字符串当成128或更高进制的数字来看,当然是唯一的 这里unsigned不需要考虑溢出的问题,  不过 ...