背景

记得前段时间,同事说他们测试环境的服务器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分析线程状态相关推荐

  1. 将线程pid转成16进制_硬件资讯 | AMD 线程撕裂者 5000 系 CPU 将包含 16 核版本

    新闻转自IT之家-信鸽 1月3日消息 近日,AMD 锐龙 Clock Tuner 工具的开发者 @1usmus 发布了一条加密代码,表示解密以后就可以获得 AMD 线程撕裂者 5000 系 CPU 的 ...

  2. 2个字节能存多少个16进制_多个二进制分析工具各项性能进行的分析与比较

    看玄武的公众号的时候看到了这篇文章.二进制工具分析的主要是程序的各种信息,比如格式.体系结构.编译器标识.指令.助记符等. 反汇编 概览 IDA是HexRays公司的商业产品,这个也是大家最熟悉的了. ...

  3. c语言115写成16进制,C语言指针问题

    C语言指针问题 來源:互聯網  2009-04-01 16:01:29  評論 分類: 電腦/網絡 >> 程序設計 >> 其他編程語言 問題描述: int a=115,*p;p ...

  4. Linux中如何将文件dump成16进制值

    http://www.cnblogs.com/bcxx_qin/archive/2009/05/06/1450596.html 在linux中有多种方式可以将文件dump成16进制显示,也可以将16进 ...

  5. 10进制转换成16进制

    更新中......... 任意2-36进制数转化为10进制数. 建议自己写函数,代码如下: int Atoi(string s,int radix) //s是给定的radix进制字符串 {int an ...

  6. 将字符串转换成16进制

    将字符串转换成16进制 原文:将字符串转换成16进制 1.将普通字符串转换成16进制的字符串. 点击进入推荐链接 class Program {static void Main(string[] ar ...

  7. python定义16进制数组_python 文件转成16进制数组的实例

    如下所示: #! /usr/bin/python2 # coding=utf-8 import numpy import binascii if __name__=='__main__': #my_m ...

  8. 将一个BYTE数组转换成16进制字符串和10进制字符串格式

    背景: unsigned char port[5]; 以02x的格式打印出来是 00 00 02 00 00 1.如何转成16进制形式的字符串,使得char *strport16 = "00 ...

  9. java 16进制数组 字符串_byte数组转换成16进制字符串和字符数组的方法

    byte数组转换成16进制字符串String: public class CommonUtil { /** * byte数组转换成16进制字符串 * @param src * @return */ p ...

最新文章

  1. 重磅!2021年考研国家线正式公布,部分学科分数线比去年更低!
  2. linux dd入门,Linux基础知识:Linux中DD命令详解
  3. Oracle碎碎念~2
  4. vue页面传参(多个参数传值)与接参 - 代码篇
  5. 英语计算机简历范文模板,计算机专业英文简历模板范文六篇(3)
  6. HIVE存储(四)ORCFile
  7. package.json详解
  8. vb连接mysql未发现_vb连接mysql(错误代码)
  9. nginx负载均衡核心模块(upstream和proxy模块)及常用参数介绍
  10. Access 97 , Access 2k , Access 03 数据库密码破解
  11. 计算机数学公式画爱心教程,几何画板如何绘制爱心?几何画板爱心函数教程
  12. Pysot训练自己数据集前的预处理
  13. PyG搭建GCN前的准备:了解PyG中的数据格式
  14. maven引入支付宝SDK
  15. 音频(七)——数字麦克风和模拟麦克风(DMIC/AMIC)
  16. IC数字芯片学习各类公众号汇总
  17. http://jingyan.baidu.com/article/0eb457e5208cbb03f0a9054c.html
  18. CSS改变鼠标样式(图片)
  19. 无需代码,极简5步大屏可视化教程,3分钟就能轻松做出酷炫报表
  20. 我的生活-上海周边玩乐

热门文章

  1. @Transactional-同一个类中方法自调,调用方法事物失效
  2. java 给窗口加菜单_程序求助:如何给窗口添加菜单?
  3. Spring Transactional还能导致生产事故?
  4. Spring Cloud Alibaba 配置中心:基于 Nacos 集中管理应用配置
  5. Nginx 五大常见应用场景,Linux运维请收藏~
  6. iOS网络缓存扫盲篇
  7. GDataXMLNode:xml解析库
  8. 使用Xcode修改iOS项目工程名和路径名
  9. 开源阅读书源_安卓开源无广告追书神器阅读App
  10. 推荐几个9月爆火的 GitHub 电商项目 赶紧收藏