有些时候我们需要查看下jvm中的线程执行情况,比如,发现服务器的CPU的负载突然增

高了、出现了死锁、死循环等,我们该如何分析呢?

由于程序是正常运行的,没有任何的输出,从日志方面也看不出什么问题,所以就需要

看下jvm的内部线程的执行情况,然后再进行分析查找出原因。

用法:jstack

java线程的6种状态

初始态(NEW)

创建一个Thread对象,但还未调用start()启动线程时,线程处于初始态。

运行态(RUNNABLE),在Java中,运行态包括 就绪态 和 运行态。

就绪态

该状态下的线程已经获得执行所需的所有资源,只要CPU分配执行权就能运行。

所有就绪态的线程存放在就绪队列中。

运行态

获得CPU执行权,正在执行的线程。

由于一个CPU同一时刻只能执行一条线程,因此每个CPU每个时刻只有一条运行态的线程。

阻塞态(BLOCKED)

当一条正在执行的线程请求某一资源失败时,就会进入阻塞态。

而在Java中,阻塞态专指请求锁失败时进入的状态。

由一个阻塞队列存放所有阻塞态的线程。

处于阻塞态的线程会不断请求资源,一旦请求成功,就会进入就绪队列,等待执行。

等待态(WAITING)

当前线程中调用wait、join、park函数时,当前线程就会进入等待态。

也有一个等待队列存放所有等待态的线程。

线程处于等待态表示它需要等待其他线程的指示才能继续运行。

进入等待态的线程会释放CPU执行权,并释放资源(如:锁)

超时等待态(TIMED_WAITING)

当运行中的线程调用sleep(time)、wait、join、parkNanos、parkUntil时,就会进入该状态;它和等待态一样,并不是因为请求不到资源,而是主动进入,并且进入后需要其他线程唤醒;

进入该状态后释放CPU执行权 和 占有的资源。

与等待态的区别:到了超时时间后自动进入阻塞队列,开始竞争锁。

终止态(TERMINATED)

线程执行结束后的状态。

使用jstack查找死锁

构造死锁

public class TestDeadLock {

private static Object obj1 = new Object();

private static Object obj2 = new Object();

public static void main(String[] args) {

new Thread(new Thread1()).start();

new Thread(new Thread2()).start();

}

private static class Thread1 implements Runnable {

@Override

public void run() {

synchronized (obj1) {

System.out.println("Thread1 拿到了 obj1 的锁!");

try {

// 停顿2秒的意义在于,让Thread2线程拿到obj2的锁 Thread.sleep(2000);

} catch (InterruptedException e) {

e.printStackTrace();

}

synchronized (obj2) {

System.out.println("Thread1 拿到了 obj2 的锁!");

}

}

}

}

private static class Thread2 implements Runnable {

@Override

public void run() {

synchronized (obj2) {

System.out.println("Thread2 拿到了 obj2 的锁!");

try {

// 停顿2秒的意义在于,让Thread1线程拿到obj1的锁 Thread.sleep(2000);

} catch (InterruptedException e) {

e.printStackTrace();

}

synchronized (obj1) {

System.out.println("Thread2 拿到了 obj1 的锁!");

}

}

}

}

}

jstack 11464

Found one Java-level deadlock:

=============================

"Thread-1":

waiting to lock monitor 0x0000017bfeca3e80 (object 0x000000008a0e36e8, a java.lang.Object),

which is held by "Thread-0"

"Thread-0":

waiting to lock monitor 0x0000017bfeca5e80 (object 0x000000008a0e36f8, a java.lang.Object),

which is held by "Thread-1"

Java stack information for the threads listed above:

===================================================

"Thread-1":

at TestDeadLock$Thread2.run(TestDeadLock.java:40)

- waiting to lock <0x000000008a0e36e8> (a java.lang.Object)

- locked <0x000000008a0e36f8> (a java.lang.Object)

at java.lang.Thread.run(java.base@9.0.4/Thread.java:844)

"Thread-0":

at TestDeadLock$Thread1.run(TestDeadLock.java:22)

- waiting to lock <0x000000008a0e36f8> (a java.lang.Object)

- locked <0x000000008a0e36e8> (a java.lang.Object)

at java.lang.Thread.run(java.base@9.0.4/Thread.java:844)

Found 1 deadlock.

VisualVM工具的使用

打开 jdk1.8.0_211\bin\jvisualvm.exe

查看CPU、内存、类、线程运行信息

查看线程状态

java 线程状态 jstack_jstack查看jvm线程状态相关推荐

  1. 查看jvm内存状态的方式 -NMT证明jvm内存多样性

    查看jvm内存状态的方式  1 图形化工具,如Jconsole.VisualVM 2 指令 jps jmap -heap/dump jstack 3 gc日志 4 NMT NMT详解 NMT特性可以用 ...

  2. java 内存情况_java查看jvm内存使用情况

    java查看jvm内存使用情况 (2012-03-22 15:50:54) 标签: jvm 内存 虚拟机 分配 it java.lang.Runtime类提供了查看当前JVM内存的使用情况.每个jav ...

  3. 观察多个线程同时运行|| 查看进程线程的方法——未完待续

    观察多个线程同时运行:主要是理解,交替执行,谁先谁后,不由我们控制 查看进程线程的方法

  4. Java命令:jstat — 查看JVM的GC信息

    文章目录 一.简介 二.常用命令 1.jstat -class pid : class loader行为统计 2.jstat -compiler pid : JIT编译器行为统计 3.jstat -g ...

  5. linux看线程占用率,查看linux线程的CPU占用率

    测试代码如下: #include #include void *thread_routine(void *arg) { prctl(PR_SET_NAME, "child_thread&qu ...

  6. linux里hba状态_linux查看hba卡状态

    RadHat6 连接 DELL Md3600f 一.redhat6系统安装 设置 Root 账户密码 以上完成了操作系统的安装 二.在Linux服务器上安装HBA卡驱动 三.在笔记本电脑上安装MD36 ...

  7. 魔兽怎么查服务器状态,如何查看魔兽世界服务器状态(查看游戏服务器状态的技巧)...

    魔兽世界怀旧服自从TBC即将到来的消息放出,不少玩家包括G哥在内都更加期待新区何时到来.与老区相比,新区的一切都是从头开始,看起来一切都很美好,但是看过了前夕的种种情况之后,期待新区这件事好像需要重新 ...

  8. java获取当前tomcat线程pid_java 查看tomcat线程信息(示例代码)

    查看线程信息 标签: 线程 堆栈 信息 日志 tomcat 响应 tomcat有时候会遇到所有操作都响应很慢,或者一直没有响应的情况.如果这个时候通过日志无法看到错误信息.可能就不好分析问题出处. 这 ...

  9. jvm线程分析命令_JVM:如何分析线程转储

    jvm线程分析命令 本文将教您如何分析JVM线程转储,并查明问题的根本原因. 以我的观点,线程转储分析是掌握Java EE生产支持的任何个人最重要的技能. 您可以从线程转储快照中获取的信息量通常远远超 ...

最新文章

  1. Does LGWR use synchronous IO even AIO enabled?
  2. php os darwin,解决Mac os(10.12.6) 编译php7提示“/usr/lib/system/libsystem_darwin.dylib”找不到...
  3. C#中实现对象的深拷贝
  4. ROC曲线与AUC区域的理解与实践
  5. BNU 背包密码(编码与解密)
  6. 常用身份证识别 OCR 技术 手机拍照识别身份证
  7. 深度学习基础笔记——卷积神经网络概念及其计算方式
  8. python 抖音短视频 去水印_如何去除抖音快手等短视频平台的水印?(工具+原理)...
  9. 数据可视化--实验四:地理数据可视化
  10. C++检测平面内两个三角形是否相交(逻辑清晰,手撕精简版)
  11. Objective C的关键字oneway
  12. html 背景图片不重复显示,css如何设置背景图片不重复?
  13. hbase数据库的一些基本操作(持续更新中)
  14. 人物-发明家-爱迪生:*托马斯·阿尔瓦·爱迪生
  15. 4 第二式:左右开弓似射雕
  16. 关键词推广-关键词推广软件
  17. obs上传文件到服务器,文件上传到obs
  18. Cox回归之变量筛选的R实现 (Stepwise Variable Selection in R)
  19. 黑色沙漠服务器修改密码,黑色沙漠二次密码重置方法介绍 怎么重置二次密码...
  20. AK F.*ing leetcode 流浪计划之线段树

热门文章

  1. 转: eclipse 快捷键列表(功能清晰版本)
  2. js检测是否安装了flash插件
  3. 浅析为什么要使用ST的固件库,谈谈我个人的工具思维!!!
  4. c语言和其他高级语言一样也要经过编译,C语言和其他高级语言的最大的区别是什么?...
  5. [一维粒子模拟 version3.6]renormalization
  6. [MATLAB学习笔记]matlab结构体A.B
  7. 云炬Android开发笔记 18解决沉浸栏的Bug和被手机状态栏遮挡的问题
  8. 超赞的 PyTorch 资源大列表,有人把它翻译成了中文版!
  9. 72 页 PPT,带你梳理神经网络完整架构(含 PyTorch 代码)
  10. Scikit-Learn 与 TensorFlow 机器学习实用指南学习笔记1 — 机器学习基础知识简介