背景

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

/***一个线程占用较高的cpu资源** Created by haoting.wang on 2017/2/24.*/
public class JstackCase {static ExecutorService executorService = Executors.newFixedThreadPool(5);public static void main(String[] args) {Task task1 = new Task();Task task2 = new Task();executorService.execute(task1);executorService.execute(task2);}public static Object lock = new Object();static class Task implements Runnable{public void run() {synchronized (lock){calculate();}}public void calculate(){long i = 0L;while (true){i++;}}}
}

top命令

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

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

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

jstack命令

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

在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,线程正在等待

    “Entry Set”中等待的线程状态是 “Waiting for monitor entry”,而在 “Wait Set”中等待的线程状态是 “in Object.wait()。Wait on condition网络瓶颈的征兆”。
    

jstack分析线程状态相关推荐

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

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

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

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

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

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

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

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

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

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

  6. Jstack查询线程堆栈

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

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

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

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

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

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

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

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

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

最新文章

  1. linux下挂载U盘过程
  2. hbase中为何不能向表中插入数据_Hbase快速入门(超精炼总结)
  3. HTTP VS RPC
  4. 在 Python 中使用 OpenCV 高斯模糊我这张的丑脸
  5. win7 怎么干净删除php,window_win7系统如何删除注册表里面的垃圾文件?,win7系统如何删除注册表里面的 - phpStudy...
  6. RedisTemplate清空所有键值对
  7. Python基础——文件拷贝(从手动实现到shutil的使用)
  8. ssh图示+hibernate图示
  9. python操作mysql时mysqldb和pymysql的安装和使用
  10. python计算平面的法向-利用协方差矩阵求解特征值和特征向量
  11. 网站服务器变更ip后更新域名,服务器变更后域名需要重新备案吗
  12. linux重启文件被删除,linux 误删文件恢复方法(debugfs)
  13. 图像直方图均衡化和空间滤波
  14. CVPR 二十年,影响力最大的 10 篇论文
  15. 10个微型计算机应用的例子,微型计算机原理与接口技术 复习资料
  16. 得到谷歌认证的《Android UI框架进阶解密》开源了,亮瞎我的钛合金
  17. matlab如何实现信道衰落,Matlab下多径衰落信道的仿真
  18. git 生成patch和打patch的方法
  19. JTopo绘制网络拓扑图
  20. 研究03丨ahr999屯币指数逐行代码深度剖析

热门文章

  1. MSRCR(Multi-Scale Retinex with Color Restore)
  2. 【错误】函数调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。
  3. IDL实现高分一号数据辐射定标TASK(二)
  4. 实习踩坑之路:Mybatis写的sql语句有<符号的问题导致项目启动失败以及count(*)怎么对应到某个实体类的字段
  5. JavaEE学习--javascript中的正则表达式
  6. JavaSE学习--单例设计模式
  7. 深入理解java虚拟机读书笔记(三)
  8. 益阳计算机应用专业推荐一下,益阳职业技术学院10大好专业推荐
  9. php判断平板,一种 PHP 判断设备是否是手机/平板的方法
  10. mysql prefix_批量修改MySQL表前缀