未加星标

如何快速定位JVM中消耗CPU最多的线程?Java

字体大小 | |
[大数据技术 所属分类 大数据技术 | 发布者 店小二05 | 时间 | 作者 红领巾 ] 0人收藏点击收藏

如何快速定位JVM中消耗CPU最多的线程?Java
python
如何快速定位JVM中消耗CPU最多的线程?Java
Java
如何快速定位JVM中消耗CPU最多的线程?Java
Hadoop
如何快速定位JVM中消耗CPU最多的线程?Java
培训
如何快速定位JVM中消耗CPU最多的线程?Java
JVM

你假笨(寒泉子)目前是 PerfMa 创始人之一兼 CEO,之前在阿里工作 7 年多,从事 JVM 相关工作,为各业务系统做性能优化,性能问题分析,是阿里性能分析平台的作者。


在日常 Java 的开发中,性能调优肯定是很多人不能绕开的一个环节。而其中最简单,也是最基础的一个问题就是如何定位消耗 CPU 最多的线程。这篇文章中你假笨以一个简单的 Test 例子为蓝本,给各位总结了分析这类问题的常用『套路』。


具体如下。


如何快速定位JVM中消耗CPU最多的线程?Java

这个例子里新创建了 11 个线程,其中 10 个线程没干什么事,主要是 sleep,另外有一个线程在循环里一直跑着,可以想象这个线程是这个进程里最耗 CPU 的线程了,那怎么把这个线程给抓出来呢?


首先我们可以通过top -Hp <pid>来看这个进程里所有线程的 CPU 消耗情况,得到类似下面的数据。


如何快速定位JVM中消耗CPU最多的线程?Java

拿到这个结果之后,我们可以看到 cpu 较高的线程是 pid 为 18250 的线程,占了 99.8%:


如何快速定位JVM中消耗CPU最多的线程?Java

接着我们可以通过 jstack的输出来看各个线程栈:


如何快速定位JVM中消耗CPU最多的线程?Java

上面的线程栈我们注意到 nid 的值其实就是线程 ID,它是十六进制的,我们将消耗 CPU 较高的线程18250,转成十六进制0X47A,然后从上面的线程栈里找到nid=0X47A的线程,其栈为:

"Busiest Thread" #28 prio=5 os_prio=0 tid=0x00007fb91498d000 nid=0x474a runnable [0x00007fb9065fe000] java.lang.Thread.State: RUNNABLE at Test$2.run(Test.java:18)

欢迎加入本站公开兴趣群

软件开发技术群

兴趣范围包括:Java,C/C++,Pythonphp,Ruby,shell等各种语言开发经验交流,各种框架使用,外包项目机会,学习、培训、跳槽等交流

QQ群:204132433


Hadoop源代码研究群

兴趣范围包括:Hadoop源代码解读,改进,优化,分布式系统场景定制,与Hadoop有关的各种开源项目,总之就是玩转Hadoop

QQ群:204050420

主题: CPUJavaJVMHadoopRubyC++开源PHP定位Python
tags: 线程,CPU,Java,Hadoop,nid,JVM,消耗,pid,java,prio,Thread,Python
分页:12
转载请注明
本文标题:如何快速定位JVM中消耗CPU最多的线程?Java
本站链接:http://www.codesec.net/view/576557.html
分享请点击:


1.凡CodeSecTeam转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。
登录后可拥有收藏文章、关注作者等权限...
技术大类 技术大类 | 大数据技术 | 评论(0) | 阅读(59)