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类源码中通过枚举为线程定义了 ...
随机推荐
- 利用Python进行数据分析笔记-时间序列(时区、周期、频率)
此文对Python中时期.时间戳.时区处理等阐述十分清楚,特别值得推荐学习. 原文链接:https://blog.csdn.net/wuzlun/article/details/80287517
- 《编写高质量iOS与OS X代码的52个有效方法》书籍目录
一.熟悉Objective-C 1.了解Objective-C语言的起源 2.在类的头文件中尽量少引入其他头文件 3.多用字面量语法,少用与之等价的方法 4.多用类型常量,少用#define预处理指令 ...
- keyup事件、keydown事件和input事件的区别
keydown.keyup 属于键盘事件,input 属于文本事件 详细说明: keydown:当用户按下键盘上的任意按键时触发,如果按住不放,会重复触发此事件. keyup:当用户释放键盘上的按键时 ...
- Java 后端压缩图片
import java.io.*;import java.util.Date;import java.awt.*;import java.awt.image.*;import javax.imagei ...
- MariaDB——备份与恢复
备份和恢复 为什么要备份? 灾难恢复:硬件故障.软件故障.自然灾害.黑客攻击.误操作 测试 要注意的点: 备份需要多少时间 能够容忍多少的数据丢失 恢复数据需要在多长时间完成 ...
- SQL常用关键字
常用SQL语句 SAP实际上提供了两种访问数据库的方式:Open SQL与Native SQL ---语句 功能 数据操作 insert 向表添加新数据行 delete 从表中删除数据行 upda ...
- SpringBoot 入门demo
创建SpringBoot项目方式一 (1)新建maven项目,不使用骨架. 使用maven管理依赖就行了,不必使用骨架(模板). (2)在pom.xml中添加 <!--springboot核心. ...
- Linux shell 学习随笔2
1.几个重要的快捷键 (1) Tab 命令补齐或文件补齐 vtas@vtas-computer:~$ ca[tab][tab] cal calibrate_ppa canberra-gtk-play ...
- 三 SVN权限设置&用户&组
创建组,添加用户之后进行权限的设置:
- 吴裕雄--天生自然JAVA面向对象高级编程学习笔记:继承的应用
class Array{ // 表示数组 private int temp[] ; // 整型数组 private int foot ; // 定义添加位置 public Array(int len) ...