java 线程状态 jstack_jstack查看jvm线程状态
有些时候我们需要查看下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线程状态相关推荐
- 查看jvm内存状态的方式 -NMT证明jvm内存多样性
查看jvm内存状态的方式 1 图形化工具,如Jconsole.VisualVM 2 指令 jps jmap -heap/dump jstack 3 gc日志 4 NMT NMT详解 NMT特性可以用 ...
- java 内存情况_java查看jvm内存使用情况
java查看jvm内存使用情况 (2012-03-22 15:50:54) 标签: jvm 内存 虚拟机 分配 it java.lang.Runtime类提供了查看当前JVM内存的使用情况.每个jav ...
- 观察多个线程同时运行|| 查看进程线程的方法——未完待续
观察多个线程同时运行:主要是理解,交替执行,谁先谁后,不由我们控制 查看进程线程的方法
- Java命令:jstat — 查看JVM的GC信息
文章目录 一.简介 二.常用命令 1.jstat -class pid : class loader行为统计 2.jstat -compiler pid : JIT编译器行为统计 3.jstat -g ...
- linux看线程占用率,查看linux线程的CPU占用率
测试代码如下: #include #include void *thread_routine(void *arg) { prctl(PR_SET_NAME, "child_thread&qu ...
- linux里hba状态_linux查看hba卡状态
RadHat6 连接 DELL Md3600f 一.redhat6系统安装 设置 Root 账户密码 以上完成了操作系统的安装 二.在Linux服务器上安装HBA卡驱动 三.在笔记本电脑上安装MD36 ...
- 魔兽怎么查服务器状态,如何查看魔兽世界服务器状态(查看游戏服务器状态的技巧)...
魔兽世界怀旧服自从TBC即将到来的消息放出,不少玩家包括G哥在内都更加期待新区何时到来.与老区相比,新区的一切都是从头开始,看起来一切都很美好,但是看过了前夕的种种情况之后,期待新区这件事好像需要重新 ...
- java获取当前tomcat线程pid_java 查看tomcat线程信息(示例代码)
查看线程信息 标签: 线程 堆栈 信息 日志 tomcat 响应 tomcat有时候会遇到所有操作都响应很慢,或者一直没有响应的情况.如果这个时候通过日志无法看到错误信息.可能就不好分析问题出处. 这 ...
- jvm线程分析命令_JVM:如何分析线程转储
jvm线程分析命令 本文将教您如何分析JVM线程转储,并查明问题的根本原因. 以我的观点,线程转储分析是掌握Java EE生产支持的任何个人最重要的技能. 您可以从线程转储快照中获取的信息量通常远远超 ...
最新文章
- Does LGWR use synchronous IO even AIO enabled?
- php os darwin,解决Mac os(10.12.6) 编译php7提示“/usr/lib/system/libsystem_darwin.dylib”找不到...
- C#中实现对象的深拷贝
- ROC曲线与AUC区域的理解与实践
- BNU 背包密码(编码与解密)
- 常用身份证识别 OCR 技术 手机拍照识别身份证
- 深度学习基础笔记——卷积神经网络概念及其计算方式
- python 抖音短视频 去水印_如何去除抖音快手等短视频平台的水印?(工具+原理)...
- 数据可视化--实验四:地理数据可视化
- C++检测平面内两个三角形是否相交(逻辑清晰,手撕精简版)
- Objective C的关键字oneway
- html 背景图片不重复显示,css如何设置背景图片不重复?
- hbase数据库的一些基本操作(持续更新中)
- 人物-发明家-爱迪生:*托马斯·阿尔瓦·爱迪生
- 4 第二式:左右开弓似射雕
- 关键词推广-关键词推广软件
- obs上传文件到服务器,文件上传到obs
- Cox回归之变量筛选的R实现 (Stepwise Variable Selection in R)
- 黑色沙漠服务器修改密码,黑色沙漠二次密码重置方法介绍 怎么重置二次密码...
- AK F.*ing leetcode 流浪计划之线段树
热门文章
- 转: eclipse 快捷键列表(功能清晰版本)
- js检测是否安装了flash插件
- 浅析为什么要使用ST的固件库,谈谈我个人的工具思维!!!
- c语言和其他高级语言一样也要经过编译,C语言和其他高级语言的最大的区别是什么?...
- [一维粒子模拟 version3.6]renormalization
- [MATLAB学习笔记]matlab结构体A.B
- 云炬Android开发笔记 18解决沉浸栏的Bug和被手机状态栏遮挡的问题
- 超赞的 PyTorch 资源大列表,有人把它翻译成了中文版!
- 72 页 PPT,带你梳理神经网络完整架构(含 PyTorch 代码)
- Scikit-Learn 与 TensorFlow 机器学习实用指南学习笔记1 — 机器学习基础知识简介