将线程pid转成16进制_如何使用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 { @Override public 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方法,并唤醒自己。
将线程pid转成16进制_如何使用jstack分析线程状态相关推荐
- 将线程pid转成16进制_硬件资讯 | AMD 线程撕裂者 5000 系 CPU 将包含 16 核版本
新闻转自IT之家-信鸽 1月3日消息 近日,AMD 锐龙 Clock Tuner 工具的开发者 @1usmus 发布了一条加密代码,表示解密以后就可以获得 AMD 线程撕裂者 5000 系 CPU 的 ...
- 2个字节能存多少个16进制_多个二进制分析工具各项性能进行的分析与比较
看玄武的公众号的时候看到了这篇文章.二进制工具分析的主要是程序的各种信息,比如格式.体系结构.编译器标识.指令.助记符等. 反汇编 概览 IDA是HexRays公司的商业产品,这个也是大家最熟悉的了. ...
- c语言115写成16进制,C语言指针问题
C语言指针问题 來源:互聯網 2009-04-01 16:01:29 評論 分類: 電腦/網絡 >> 程序設計 >> 其他編程語言 問題描述: int a=115,*p;p ...
- Linux中如何将文件dump成16进制值
http://www.cnblogs.com/bcxx_qin/archive/2009/05/06/1450596.html 在linux中有多种方式可以将文件dump成16进制显示,也可以将16进 ...
- 10进制转换成16进制
更新中......... 任意2-36进制数转化为10进制数. 建议自己写函数,代码如下: int Atoi(string s,int radix) //s是给定的radix进制字符串 {int an ...
- 将字符串转换成16进制
将字符串转换成16进制 原文:将字符串转换成16进制 1.将普通字符串转换成16进制的字符串. 点击进入推荐链接 class Program {static void Main(string[] ar ...
- python定义16进制数组_python 文件转成16进制数组的实例
如下所示: #! /usr/bin/python2 # coding=utf-8 import numpy import binascii if __name__=='__main__': #my_m ...
- 将一个BYTE数组转换成16进制字符串和10进制字符串格式
背景: unsigned char port[5]; 以02x的格式打印出来是 00 00 02 00 00 1.如何转成16进制形式的字符串,使得char *strport16 = "00 ...
- java 16进制数组 字符串_byte数组转换成16进制字符串和字符数组的方法
byte数组转换成16进制字符串String: public class CommonUtil { /** * byte数组转换成16进制字符串 * @param src * @return */ p ...
最新文章
- 重磅!2021年考研国家线正式公布,部分学科分数线比去年更低!
- linux dd入门,Linux基础知识:Linux中DD命令详解
- Oracle碎碎念~2
- vue页面传参(多个参数传值)与接参 - 代码篇
- 英语计算机简历范文模板,计算机专业英文简历模板范文六篇(3)
- HIVE存储(四)ORCFile
- package.json详解
- vb连接mysql未发现_vb连接mysql(错误代码)
- nginx负载均衡核心模块(upstream和proxy模块)及常用参数介绍
- Access 97 , Access 2k , Access 03 数据库密码破解
- 计算机数学公式画爱心教程,几何画板如何绘制爱心?几何画板爱心函数教程
- Pysot训练自己数据集前的预处理
- PyG搭建GCN前的准备:了解PyG中的数据格式
- maven引入支付宝SDK
- 音频(七)——数字麦克风和模拟麦克风(DMIC/AMIC)
- IC数字芯片学习各类公众号汇总
- http://jingyan.baidu.com/article/0eb457e5208cbb03f0a9054c.html
- CSS改变鼠标样式(图片)
- 无需代码,极简5步大屏可视化教程,3分钟就能轻松做出酷炫报表
- 我的生活-上海周边玩乐