本系列笔记主要基于《深入理解Java虚拟机:JVM高级特性与最佳实践 第2版》,是这本书的读书笔记。

jstack命令可以打印Java进程的各个线程堆栈跟踪信息,可以用来查看Java中各个线程的执行情况,可以用来定位和解决死循环和死锁导致的CPU飙高的问题。

所有的JDK工具都可以在Oracle官网的 Java Tools Reference 文档中找到使用说明,这是主要参考,包括命令格式、参数内容、输出信息等等。

jstack命令格式:

  1. jstack [-l] <pid>
  2. jstack -F [-m] [-l] <pid>
  3. jstack [-m] [-l] <executable> <core>
  4. jstack [-m] [-l] [server_id@]<remote server IP or hostname>

jstack帮助信息:

jstack输出内容格式

先使用jps命令查询Java进程,输出pid。

  1. jps -l

然后使用jstack加上pid,输出内容到txt文件中。

  1. jstack 42859 > 42859.txt

然后在XShell中可以使用sz命令下载txt文件,也可以在Linux中直接打开。

jstack输出的内容举例如下:

  1. "ajp-nio-8009-Acceptor-0" #180 daemon prio=5 os_prio=0 tid=0x00007f279865a000 nid=0xa825 runnable [0x00007f265e0c8000]
  2. java.lang.Thread.State: RUNNABLE
  3. at sun.nio.ch.ServerSocketChannelImpl.accept0(Native Method)
  4. at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:422)
  5. at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:250)
  6. - locked <0x00000006c0234640> (a java.lang.Object)
  7. at org.apache.tomcat.util.net.NioEndpoint$Acceptor.run(NioEndpoint.java:692)
  8. 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

  1. NEW:新建,线程创建后还未启动,还没调用start方法。
  2. RUNNABLE:运行,处于可运行状态,正在运行或准备运行。
  3. BLOCKED:阻塞,线程挂起,等待获取锁。
  4. WAITING:无限期等待,线程无限期地等待另一个线程执行特定操作。
  5. TIMED_WAITING:有限期等待,线程正在等待另一个线程执行最多指定等待时间的操作。
  6. 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线程状态的更多相关文章

  1. 面试官:都说阻塞 I/O 模型将会使线程休眠,为什么 Java 线程状态却是 RUNNABLE?

    摘要: 原创出处 https://studyidea.cn 「公众号:程序通事 」欢迎关注和转载,保留摘要,谢谢! 使用 Java 阻塞 I/O 模型读取数据,将会导致线程阻塞,线程将会进入休眠,从而 ...

  2. Java线程状态及切换

    Java线程状态及切换 一.什么是Java线程状态 在Java程序中,用于描述Java线程的六种状态: 新建(NEW):当前线程,刚刚新建出来,尚未启动. 运行(RUNNABLE):当前线程,处于竞争 ...

  3. Java线程状态Jstack线程状态BLOCKED/TIMED_WAITING/WAITING解释

    一.线程5种状态 新建状态(New) 新创建了一个线程对象. 就绪状态(Runnable) 线程对象创建后,其他线程调用了该对象的start()方法.该状态的线程位于可运行线程池中,变得可运行,等待获 ...

  4. linux查看Java线程

    一.查看Java进程pid的方式 1. ps命令 ps -ef | grep java 2. jvm自带的 jps 工具 3. 当然还有其他命令也可以显示 netstat ,top 二.查看Java线 ...

  5. Java线程状态、线程start方法源码、多线程、Java线程池、如何停止一个线程

    下面将依次介绍: 1. 线程状态.Java线程状态和线程池状态 2. start方法源码 3. 什么是线程池? 4. 线程池的工作原理和使用线程池的好处 5. ThreadPoolExecutor中的 ...

  6. 从源码看java线程状态

    关于java线程状态,网上查资料很混乱,有的说5种状态,有的说6种状态,初学者搞不清楚这个线程状态到底是怎么样的,今天我讲一下如何看源码去解决这个疑惑. 直接上代码: public class Thr ...

  7. 浅谈 Java线程状态转换及控制

    线程的状态(系统层面) 一个线程被创建后就进入了线程的生命周期.在线程的生命周期中,共包括新建(New).就绪(Runnable).运行(Running).阻塞(Blocked)和死亡(Dead)这五 ...

  8. Java线程状态及同步锁

    线程的生命历程 线程的五大状态 创建状态:简而言之,当创建线程对象的代码出现的时候,此时线程就进入了创建状态.这时候的线程只是行代码而已.只有调用线程的start()方法时,线程的状态才会改变,进入就 ...

  9. Java线程状态转换

    前言:对于Java线程状态方面的知识点,笔者总感觉朦朦胧胧,趁着最近整理资料,将Java线程状态方面的知识点总结归纳,以便加深记忆. 1.Java线程状态值 在Thread类源码中通过枚举为线程定义了 ...

随机推荐

  1. Hadoop大实验——MapReduce的操作

    日期:2019.10.30 博客期:114 星期三 实验6:Mapreduce实例——WordCount   实验说明: 1.          本次实验是第六次上机,属于验证性实验.实验报告上交截止 ...

  2. Design and History FAQ for Python3

    Source : Design and History FAQ for Python3 Why is there no goto? 你可以通过异常来获得一个可以跨函数调用的 "goto 结构 ...

  3. 眼镜蛇扫描器2.3【旁注,目录扫描,md5解密,后台破解,0day】

    功能: 1):旁注查询 引用站长工具 2):目录扫描  支持ASP PHP  JSP  ASPX  以及普遍存在漏洞的目录 速度还好.几乎和御剑差不多 3):0day扫描, 仿的熊眼  0day是 C ...

  4. robot framework 命令行执行用例与自带的run configurations运行用例

    一.cmd中运行命令 1.执行整个项目下的所有用例: pybot 项目路径.例如: pybot F:\EC\RF_Api 2.执行某个suite中的所有用例: pybot -s 项目路径\suite文 ...

  5. OPCDA通信--工作在透明模式下的CISCO ASA 5506-X防火墙配置

    尊重原创,转发请声名 inside OPCSERVER 一台 outside OPCCLIENT 一台 route模式 配置没成功,放弃,采用透明模式 !----进入全局配置-- configure ...

  6. TCP/IP,三次握手四次挥手,TCP/UDP , HTTP/HTTPS

    internet:通用名词,由多个计算机网络组成的网络,网络间的通信协议是任意的 Internet:专用名词,当前全球最大的开放计算机网络,采用TCP/IP协议族作为通信的规则.www万维网是广泛应用 ...

  7. 【转】彻底搞透Netty框架

    本文基于 Netty 4.1 展开介绍相关理论模型,使用场景,基本组件.整体架构,知其然且知其所以然,希望给大家在实际开发实践.学习开源项目方面提供参考. Netty 是一个异步事件驱动的网络应用程序 ...

  8. ajax请求Controller,返回信息乱码问题

    参考:https://blog.csdn.net/hgg923/article/details/53610548 @RequestMapping(value = "changeMobile& ...

  9. pip升级报错(权限问题)

    今天跟新pip的时候错一个接一个 看到拒绝访问应该是权限的问题,想起安装的时候选择谁可以使用软件(大概是这样的一个选项),选择了“只有我”,选择所有用户应该就不会存在这个问题了,那么怎么解决呢? 敲黑 ...

  10. ASM ClassReader failed to parse class file

    ASM ClassReader failed to parse class file - probably due to a new Java class file version that isn' ...