转载自  如何使用jstack分析线程状态

背景

记得前段时间,同事说他们测试环境的服务器cpu使用率一直处于100%,本地又没有什么接口调用,为什么会这样?cpu使用率居高不下,自然是有某些线程一直占用着cpu资源,那又如何查看占用cpu较高的线程?

当然一个正常的程序员不会写出上述代码,这里只是为了让一个线程占用较高的cpu资源。

top命令

在linux环境下,可以通过top命令查看各个进程的cpu使用情况,默认按cpu使用率排序

1、上图中可以看出pid为23344的java进程占用了较多的cpu资源;
2、通过top -Hp 23344可以查看该进程下各个线程的cpu使用情况;

上图中可以看出pid为25077的线程占了较多的cpu资源,利用jstack命令可以继续查看该线程当前的堆栈状态。

jstack命令

通过top命令定位到cpu占用率较高的线程之后,继续使用jstack pid命令查看当前java进程的堆栈状态

jstack命令生成的thread dump信息包含了JVM中所有存活的线程,为了分析指定线程,必须找出对应线程的调用栈,应该如何找?

在top命令中,已经获取到了占用cpu资源较高的线程pid,将该pid转成16进制的值,在thread dump中每个线程都有一个nid,找到对应的nid即可;隔段时间再执行一次stack命令获取thread dump,区分两份dump是否有差别,在nid=0x246c的线程调用栈中,发现该线程一直在执行JstackCase类第33行的calculate方法,得到这个信息,就可以检查对应的代码是否有问题。

通过thread dump分析线程状态

除了上述的分析,大多数情况下会基于thead dump分析当前各个线程的运行情况,如是否存在死锁、是否存在一个线程长时间持有锁不放等等。

在dump中,线程一般存在如下几种状态:
1、RUNNABLE,线程处于执行中
2、BLOCKED,线程被阻塞
3、WAITING,线程正在等待

实例1:多线程竞争synchronized锁

很明显:线程1获取到锁,处于RUNNABLE状态,线程2处于BLOCK状态
1、locked <0x000000076bf62208>说明线程1对地址为0x000000076bf62208对象进行了加锁;
2、waiting to lock <0x000000076bf62208> 说明线程2在等待地址为0x000000076bf62208对象上的锁;
3、waiting for monitor entry [0x000000001e21f000]说明线程1是通过synchronized关键字进入了监视器的临界区,并处于”Entry Set”队列,等待monitor,具体实现可以参考深入分析synchronized的JVM实现;

实例2:通过wait挂起线程
static class Task implements Runnable {@Overridepublic void run() {synchronized (lock) {try {lock.wait();//TimeUnit.SECONDS.sleep(100000);} catch (InterruptedException e) {e.printStackTrace();}}}
}
dump结果

线程1和2都处于WAITING状态
1、线程1和2都是先locked <0x000000076bf62500>,再waiting on <0x000000076bf62500>,之所以先锁再等同一个对象,是因为wait方法需要先通过synchronized获得该地址对象的monitor;
2、waiting on <0x000000076bf62500>说明线程执行了wait方法之后,释放了monitor,进入到”Wait Set”队列,等待其它线程执行地址为0x000000076bf62500对象的notify方法,并唤醒自己,具体实现可以参考深入分析Object.wait/notify实现机制;

如何使用jstack分析线程状态相关推荐

  1. 转: 如何使用jstack分析线程状态

    这个讲的好系列:  如何使用jstack分析线程状态 转:http://www.jianshu.com/p/6690f7e92f27 背景 记得前段时间,同事说他们测试环境的服务器cpu使用率一直处于 ...

  2. 将线程pid转成16进制_如何使用jstack分析线程状态

    背景 记得前段时间,同事说他们测试环境的服务器cpu使用率一直处于100%,本地又没有什么接口调用,为什么会这样?cpu使用率居高不下,自然是有某些线程一直占用着cpu资源,那又如何查看占用cpu较高 ...

  3. JVM 调优实战--使用jstack分析线程执行情况

    目录 jstack的使用 线程的6种状态 使用jstack分析死锁示例 jstack的使用 jstack命令可以直接输出每个线程的执行情况. 线程的6种状态 超时等待状态和等待状态的区别: 超时等待状 ...

  4. java jstack 分析_jstack 分析一下java程序

    感觉写的非常不错 前言 如果有一天,你的Java程序长时间停顿,也许是它病了,需要用jstack拍个片子分析分析,才能诊断具体什么病症,是死锁综合征,还是死循环等其他病症,本文我们一起来学习jstac ...

  5. Jstack查询线程堆栈

    Jstack是什么? jstack是java虚拟机自带的一种堆栈跟踪工具. jstack主要用来查看Java线程的调用堆栈的,可以用来分析线程问题(如死锁).线程快照是当前java虚拟机内每一条线程正 ...

  6. 面试必备,Java线程状态之细节回顾

    点击上方"方志朋",选择"设为星标" 做积极的人,而不是积极废人 来源:https://dwz.cn/vYqjShos Java线程有6种状态 在某个给定时间点 ...

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

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

  8. new thread后会阻塞主程序吗_阻塞模型将会使线程休眠,为什么 Java 线程状态却是 RUNNABLE?...

    使用 Java 阻塞 I/O 模型读取数据,将会导致线程阻塞,线程将会进入休眠,从而让出 CPU 的执行权,直到数据读取完成.这个期间如果使用 jstack 查看线程状态,却可以发现Java 线程状态 ...

  9. 既然阻塞 I/O 会使线程休眠,为什么 Java 线程状态却是 RUNNABLE?

    使用 Java 阻塞 I/O 模型读取数据,将会导致线程阻塞,线程将会进入休眠,从而让出 CPU 的执行权,直到数据读取完成.这个期间如果使用 jstack 查看线程状态,却可以发现Java 线程状态 ...

最新文章

  1. RESTful风格及其SpringMVC实现
  2. html完成横纵坐标位置确定,2018-2019学年安徽省合肥市七年级下期中数学试卷-附详细答案...
  3. android怎么写本地图片,Android 开发图片保存在本地
  4. Windows 操作系统的安全设置
  5. SIFT四部曲之——构建关键点特征描述符
  6. Asp.net大文件下载
  7. rj45接口线序_水晶头中的RJ45、RJ11、8P8C、6P4C有些什么学问?
  8. Spring框架 JdbcTemplate类 @Junit单元测试,可以让方法独立执行 如:@Test
  9. jq之animate()操作多个属性
  10. maple里面怎么搜索_怎么挖掘精准关键词进行引流?
  11. border做三角形
  12. Ubuntu alias在/etc/profile重启无效解决
  13. linux多CPU进程负载均衡解析
  14. 手摸手教你阅读和调试大型开源项目 ZooKeeper
  15. 5e服务器显示steam名字,5e为什么不显示我csgo的名字(5ecsgo)
  16. TensorFlow之saved_model使用笔记
  17. 举着一片片小小柔柔的叶子
  18. 为什么你只需要CD音质:16bits, 44.1kHz的意义
  19. 普中单片机怎么接霍尔传感器_霍尔传感器在测量电机转速时,它如何与单片机连接啊 求个电路图 谢谢...
  20. k8s之滚动更新及pod流量分析

热门文章

  1. [MyBatisPlus]通用枚举
  2. LeetCode 404左叶子之和-简单
  3. [蓝桥杯2018初赛]方格计数-巧妙枚举,找规,数论
  4. 数据结构-查找-总结归纳知识点
  5. matlab title多个标题_MATLAB中的直方图处理及均衡化
  6. 2019-ACM-ICPC-南京区网络赛-E. K Sum(莫比乌斯反演 + 杜教筛)
  7. Codeforces Round #648 (Div. 2)(A, B, C, D)
  8. 2018-2019 ACM-ICPC, Asia Shenyang Regional Contest E. The Kouga Ninja Scrolls 切比雪夫距离 +线段树
  9. 【IOI2018】狼人【Kruscal重构树】【主席树】
  10. K-D Tree学习笔记