jstack分析线程状态
背景
记得前段时间,同事说他们测试环境的服务器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中,线程一般存在如下几种状态:
RUNNABLE,线程处于执行中
BLOCKED,线程被阻塞
WAITING,线程正在等待
“Entry Set”中等待的线程状态是 “Waiting for monitor entry”,而在 “Wait Set”中等待的线程状态是 “in Object.wait()。Wait on condition网络瓶颈的征兆”。
jstack分析线程状态相关推荐
- 如何使用jstack分析线程状态
转载自 如何使用jstack分析线程状态 背景 记得前段时间,同事说他们测试环境的服务器cpu使用率一直处于100%,本地又没有什么接口调用,为什么会这样?cpu使用率居高不下,自然是有某些线程一直 ...
- 转: 如何使用jstack分析线程状态
这个讲的好系列: 如何使用jstack分析线程状态 转:http://www.jianshu.com/p/6690f7e92f27 背景 记得前段时间,同事说他们测试环境的服务器cpu使用率一直处于 ...
- 将线程pid转成16进制_如何使用jstack分析线程状态
背景 记得前段时间,同事说他们测试环境的服务器cpu使用率一直处于100%,本地又没有什么接口调用,为什么会这样?cpu使用率居高不下,自然是有某些线程一直占用着cpu资源,那又如何查看占用cpu较高 ...
- JVM 调优实战--使用jstack分析线程执行情况
目录 jstack的使用 线程的6种状态 使用jstack分析死锁示例 jstack的使用 jstack命令可以直接输出每个线程的执行情况. 线程的6种状态 超时等待状态和等待状态的区别: 超时等待状 ...
- java jstack 分析_jstack 分析一下java程序
感觉写的非常不错 前言 如果有一天,你的Java程序长时间停顿,也许是它病了,需要用jstack拍个片子分析分析,才能诊断具体什么病症,是死锁综合征,还是死循环等其他病症,本文我们一起来学习jstac ...
- Jstack查询线程堆栈
Jstack是什么? jstack是java虚拟机自带的一种堆栈跟踪工具. jstack主要用来查看Java线程的调用堆栈的,可以用来分析线程问题(如死锁).线程快照是当前java虚拟机内每一条线程正 ...
- 面试必备,Java线程状态之细节回顾
点击上方"方志朋",选择"设为星标" 做积极的人,而不是积极废人 来源:https://dwz.cn/vYqjShos Java线程有6种状态 在某个给定时间点 ...
- java runnable wait_面试官:都说阻塞 I/O 模型将会使线程休眠,为什么 Java 线程状态却是 RUNNABLE?...
摘要: 原创出处 https://studyidea.cn 「公众号:程序通事 」欢迎关注和转载,保留摘要,谢谢! 使用 Java 阻塞 I/O 模型读取数据,将会导致线程阻塞,线程将会进入休眠,从而 ...
- new thread后会阻塞主程序吗_阻塞模型将会使线程休眠,为什么 Java 线程状态却是 RUNNABLE?...
使用 Java 阻塞 I/O 模型读取数据,将会导致线程阻塞,线程将会进入休眠,从而让出 CPU 的执行权,直到数据读取完成.这个期间如果使用 jstack 查看线程状态,却可以发现Java 线程状态 ...
- 既然阻塞 I/O 会使线程休眠,为什么 Java 线程状态却是 RUNNABLE?
使用 Java 阻塞 I/O 模型读取数据,将会导致线程阻塞,线程将会进入休眠,从而让出 CPU 的执行权,直到数据读取完成.这个期间如果使用 jstack 查看线程状态,却可以发现Java 线程状态 ...
最新文章
- linux下挂载U盘过程
- hbase中为何不能向表中插入数据_Hbase快速入门(超精炼总结)
- HTTP VS RPC
- 在 Python 中使用 OpenCV 高斯模糊我这张的丑脸
- win7 怎么干净删除php,window_win7系统如何删除注册表里面的垃圾文件?,win7系统如何删除注册表里面的 - phpStudy...
- RedisTemplate清空所有键值对
- Python基础——文件拷贝(从手动实现到shutil的使用)
- ssh图示+hibernate图示
- python操作mysql时mysqldb和pymysql的安装和使用
- python计算平面的法向-利用协方差矩阵求解特征值和特征向量
- 网站服务器变更ip后更新域名,服务器变更后域名需要重新备案吗
- linux重启文件被删除,linux 误删文件恢复方法(debugfs)
- 图像直方图均衡化和空间滤波
- CVPR 二十年,影响力最大的 10 篇论文
- 10个微型计算机应用的例子,微型计算机原理与接口技术 复习资料
- 得到谷歌认证的《Android UI框架进阶解密》开源了,亮瞎我的钛合金
- matlab如何实现信道衰落,Matlab下多径衰落信道的仿真
- git 生成patch和打patch的方法
- JTopo绘制网络拓扑图
- 研究03丨ahr999屯币指数逐行代码深度剖析
热门文章
- MSRCR(Multi-Scale Retinex with Color Restore)
- 【错误】函数调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。
- IDL实现高分一号数据辐射定标TASK(二)
- 实习踩坑之路:Mybatis写的sql语句有<符号的问题导致项目启动失败以及count(*)怎么对应到某个实体类的字段
- JavaEE学习--javascript中的正则表达式
- JavaSE学习--单例设计模式
- 深入理解java虚拟机读书笔记(三)
- 益阳计算机应用专业推荐一下,益阳职业技术学院10大好专业推荐
- php判断平板,一种 PHP 判断设备是否是手机/平板的方法
- mysql prefix_批量修改MySQL表前缀