JVM探秘:jstack查看Java线程状态
本系列笔记主要基于《深入理解Java虚拟机:JVM高级特性与最佳实践 第2版》,是这本书的读书笔记。
jstack命令可以打印Java进程的各个线程堆栈跟踪信息,可以用来查看Java中各个线程的执行情况,可以用来定位和解决死循环和死锁导致的CPU飙高的问题。
所有的JDK工具都可以在Oracle官网的 Java Tools Reference 文档中找到使用说明,这是主要参考,包括命令格式、参数内容、输出信息等等。
jstack命令格式:
jstack [-l] <pid>
jstack -F [-m] [-l] <pid>
jstack [-m] [-l] <executable> <core>
jstack [-m] [-l] [server_id@]<remote server IP or hostname>
jstack帮助信息:

jstack输出内容格式
先使用jps命令查询Java进程,输出pid。
jps -l
然后使用jstack加上pid,输出内容到txt文件中。
jstack 42859 > 42859.txt
然后在XShell中可以使用sz命令下载txt文件,也可以在Linux中直接打开。
jstack输出的内容举例如下:
"ajp-nio-8009-Acceptor-0" #180 daemon prio=5 os_prio=0 tid=0x00007f279865a000 nid=0xa825 runnable [0x00007f265e0c8000]
java.lang.Thread.State: RUNNABLE
at sun.nio.ch.ServerSocketChannelImpl.accept0(Native Method)
at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:422)
at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:250)
- locked <0x00000006c0234640> (a java.lang.Object)
at org.apache.tomcat.util.net.NioEndpoint$Acceptor.run(NioEndpoint.java:692)
at java.lang.Thread.run(Thread.java:745)
- "ajp-nio-8009-Acceptor-0":线程名
- "#180":线程编号
- "daemon":后台守护线程
- "prio=5":优先级
- "os_prio=0":操作系统优先级
- "tid=0x00007f279865a000":线程id
- "nid=0xa825":比较关键,操作系统映射的线程id(十六进制), 转成十进制后,对应Linux下
ps -mp pid -o THREAD,tid,time命令打印出来的线程tid - "0x00007f265e0c8000":线程栈的起始地址
- "RUNNABLE":一种线程状态
Java线程状态
Java线程的状态分为六种,Oracle官网介绍:Thread States for a Thread Dump
- NEW:新建,线程创建后还未启动,还没调用start方法。
- RUNNABLE:运行,处于可运行状态,正在运行或准备运行。
- BLOCKED:阻塞,线程挂起,等待获取锁。
- WAITING:无限期等待,线程无限期地等待另一个线程执行特定操作。
- TIMED_WAITING:有限期等待,线程正在等待另一个线程执行最多指定等待时间的操作。
- TERMINATED:线程终止状态。
Java线程状态图示:

首先,当new了一个线程对象时,就是NEW状态,例如Thread thread = new Thread();
当线程调用了start()方法后,进入RUNNABLE状态,RUNNABLE中又分为Ready和Running,当获取到CPU时间片的时候是Running,当等待获取CPU时间片的时候是Ready。
RUNNABLE状态时,当线程调用了sleep(time)、wait(time)等方法后,进入TIMED_WAITING状态,time时间到期后变为RUNNABLE状态,或者调用notify、notifyAll方法后变为BLOCKED状态。
RUNNABLE状态时,当线程调用了sleep()、wait()等方法后,进入WAITING状态,在调用了notify、notifyAll方法后变为BLOCKED状态。
RUNNABLE状态时,当等待获取锁时,进入BLOCKED状态,当获取到锁之后,再恢复到RUNNABLE状态。
JVM探秘:jstack查看Java线程状态的更多相关文章
- 面试官:都说阻塞 I/O 模型将会使线程休眠,为什么 Java 线程状态却是 RUNNABLE?
摘要: 原创出处 https://studyidea.cn 「公众号:程序通事 」欢迎关注和转载,保留摘要,谢谢! 使用 Java 阻塞 I/O 模型读取数据,将会导致线程阻塞,线程将会进入休眠,从而 ...
- Java线程状态及切换
Java线程状态及切换 一.什么是Java线程状态 在Java程序中,用于描述Java线程的六种状态: 新建(NEW):当前线程,刚刚新建出来,尚未启动. 运行(RUNNABLE):当前线程,处于竞争 ...
- Java线程状态Jstack线程状态BLOCKED/TIMED_WAITING/WAITING解释
一.线程5种状态 新建状态(New) 新创建了一个线程对象. 就绪状态(Runnable) 线程对象创建后,其他线程调用了该对象的start()方法.该状态的线程位于可运行线程池中,变得可运行,等待获 ...
- linux查看Java线程
一.查看Java进程pid的方式 1. ps命令 ps -ef | grep java 2. jvm自带的 jps 工具 3. 当然还有其他命令也可以显示 netstat ,top 二.查看Java线 ...
- Java线程状态、线程start方法源码、多线程、Java线程池、如何停止一个线程
下面将依次介绍: 1. 线程状态.Java线程状态和线程池状态 2. start方法源码 3. 什么是线程池? 4. 线程池的工作原理和使用线程池的好处 5. ThreadPoolExecutor中的 ...
- 从源码看java线程状态
关于java线程状态,网上查资料很混乱,有的说5种状态,有的说6种状态,初学者搞不清楚这个线程状态到底是怎么样的,今天我讲一下如何看源码去解决这个疑惑. 直接上代码: public class Thr ...
- 浅谈 Java线程状态转换及控制
线程的状态(系统层面) 一个线程被创建后就进入了线程的生命周期.在线程的生命周期中,共包括新建(New).就绪(Runnable).运行(Running).阻塞(Blocked)和死亡(Dead)这五 ...
- Java线程状态及同步锁
线程的生命历程 线程的五大状态 创建状态:简而言之,当创建线程对象的代码出现的时候,此时线程就进入了创建状态.这时候的线程只是行代码而已.只有调用线程的start()方法时,线程的状态才会改变,进入就 ...
- Java线程状态转换
前言:对于Java线程状态方面的知识点,笔者总感觉朦朦胧胧,趁着最近整理资料,将Java线程状态方面的知识点总结归纳,以便加深记忆. 1.Java线程状态值 在Thread类源码中通过枚举为线程定义了 ...
随机推荐
- JS 删除对象中指定的值
1,通过delete删除 2,通过filter filter需要在循环的时候判断一下是true还是false,是true才会返回这个元素: let arr1 = [1,2,3]; let arr2 = ...
- C. Magic Grid 构造矩阵
C. Magic Grid time limit per test 1 second memory limit per test 256 megabytes input standard input ...
- javaScript中this的指向?
javaScript中this对象是在运行时基于函数的执行环境绑定的,在全局函数中,this等于window,而当函数被作为某个对象的方法调用时,this等于那个对象. 但在实际中,代码环境复杂,th ...
- [经验] HTML页面中子盒子溢出了怎么办
背景: 在查询数据记录的一个页面上使用bootstar 框架的分页插件作为显示数据表格的工具. 问题: 当查询的范围在一个较短的时间内时, 子元素是乖乖的呆在父元素内部的, 但是一但将查询的时间范围扩 ...
- go语言的基础类型
1.布尔类型:bool 2.整型:int8,byte,int16,int,uint,uintptr等 3.浮点类型:float32.float64 4.复数类型:complex64,complex12 ...
- 使用onclick报SyntaxError: identifier starts immediately after numeric literal
少了‘’ 错误 onclick="onlineWatch(${row.title})" 正确 onclick="onlineWatch('${row.title}')&q ...
- CSS-font
font:[ [ <' font-style '> || <' font-variant '> || <' font-weight '> ]? <' font ...
- 使用elk+redis搭建nginx日志分析平台(引)
http://www.cnblogs.com/yjf512/p/4199105.html elk+redis 搭建nginx日志分析平台 logstash,elasticsearch,kibana 怎 ...
- Wpa_supplicant 调试故障原因分析
背景 在使用Wpa_supplicant 工具调试Linux的wifi的时候,发现有一些问题.特此记录一下.有些问题是遇到的并已经有了解决方法,一些问题比较发杂,只能作为思路. 问题以及解决办法 1. ...
- spring切面编程
xml配置实现 先写三个类 public String amethod(String s) { System.out.println("This is AAAAAAAAAAAAAAAA&q ...