定位消耗CPU最多的线程
来源:互联网 发布:网络刷手一天能挣多少 编辑:程序博客网 时间:2024/05/21 20:46
先看代码
public class Test{ public static void main(String args[]){ for(int i=0;i<10;i++){ new Thread(){ public void run(){ try{ Thread.sleep(100000); }catch(Exception e){} } }.start(); } Thread t=new Thread(){ public void run(){ int i=0; while(true){ i=(i++)/100; } } }; t.setName("Busiest Thread"); t.start(); }}
这个例子里新创建了11个线程,其中10个线程没干什么事,主要是sleep,另外有一个线程在循环里一直跑着,可以想象这个线程是这个进程里最耗cpu的线程了,那怎么把这个线程给抓出来呢?
首先我们可以通过top -Hp <pid>
来看这个进程里所有线程的cpu消耗情况,得到类似下面的数据
$ top -Hp 18207
$ top -Hp 18207top - 19:11:43 up 573 days, 2:43, 2 users, load average: 3.03, 3.03, 3.02Tasks: 44 total, 1 running, 43 sleeping, 0 stopped, 0 zombieCpu(s): 18.8%us, 0.0%sy, 0.0%ni, 81.1%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%stMem: 99191752k total, 98683576k used, 508176k free, 128248k buffersSwap: 1999864k total, 191064k used, 1808800k free, 17413760k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND18250 admin 20 0 26.1g 28m 10m R 99.9 0.0 0:19.50 java Test18207 admin 20 0 26.1g 28m 10m S 0.0 0.0 0:00.00 java Test18208 admin 20 0 26.1g 28m 10m S 0.0 0.0 0:00.09 java Test18209 admin 20 0 26.1g 28m 10m S 0.0 0.0 0:00.00 java Test18210 admin 20 0 26.1g 28m 10m S 0.0 0.0 0:00.00 java Test18211 admin 20 0 26.1g 28m 10m S 0.0 0.0 0:00.00 java Test18212 admin 20 0 26.1g 28m 10m S 0.0 0.0 0:00.00 java Test18213 admin 20 0 26.1g 28m 10m S 0.0 0.0 0:00.00 java Test18214 admin 20 0 26.1g 28m 10m S 0.0 0.0 0:00.00 java Test18215 admin 20 0 26.1g 28m 10m S 0.0 0.0 0:00.00 java Test18216 admin 20 0 26.1g 28m 10m S 0.0 0.0 0:00.00 java Test18217 admin 20 0 26.1g 28m 10m S 0.0 0.0 0:00.00 java Test18218 admin 20 0 26.1g 28m 10m S 0.0 0.0 0:00.00 java Test18219 admin 20 0 26.1g 28m 10m S 0.0 0.0 0:00.00 java Test18220 admin 20 0 26.1g 28m 10m S 0.0 0.0 0:00.00 java Test18221 admin 20 0 26.1g 28m 10m S 0.0 0.0 0:00.00 java Test18222 admin 20 0 26.1g 28m 10m S 0.0 0.0 0:00.00 java Test18223 admin 20 0 26.1g 28m 10m S 0.0 0.0 0:00.00 java Test18224 admin 20 0 26.1g 28m 10m S 0.0 0.0 0:00.00 java Test18225 admin 20 0 26.1g 28m 10m S 0.0 0.0 0:00.00 java Test18226 admin 20 0 26.1g 28m 10m S 0.0 0.0 0:00.00 java Test18227 admin 20 0 26.1g 28m 10m S 0.0 0.0 0:00.00 java Test
拿到这个结果之后,我们可以看到cpu最高的线程是pid为18250的线程,占了99.8%:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND18250 admin 20 0 26.1g 28m 10m R 99.9 0.0 0:19.50 java Test
接着我们可以通过jstack <pid>
的输出来看各个线程栈:
$ jstack 182072016-03-30 19:12:23Full thread dump OpenJDK 64-Bit Server VM (25.66-b60 mixed mode):"Attach Listener" #30 daemon prio=9 os_prio=0 tid=0x00007fb90be13000 nid=0x47d7 waiting on condition [0x0000000000000000] java.lang.Thread.State: RUNNABLE"DestroyJavaVM" #29 prio=5 os_prio=0 tid=0x00007fb96245b800 nid=0x4720 waiting on condition [0x0000000000000000] java.lang.Thread.State: RUNNABLE"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)"Thread-9" #27 prio=5 os_prio=0 tid=0x00007fb91498c800 nid=0x4749 waiting on condition [0x00007fb906bfe000] java.lang.Thread.State: TIMED_WAITING (sleeping) at java.lang.Thread.sleep(Native Method) at Test$1.run(Test.java:9)"Thread-8" #26 prio=5 os_prio=0 tid=0x00007fb91498b800 nid=0x4748 waiting on condition [0x00007fb906ffe000] java.lang.Thread.State: TIMED_WAITING (sleeping) at java.lang.Thread.sleep(Native Method) at Test$1.run(Test.java:9)"Thread-7" #25 prio=5 os_prio=0 tid=0x00007fb91498b000 nid=0x4747 waiting on condition [0x00007fb9073fe000] java.lang.Thread.State: TIMED_WAITING (sleeping) at java.lang.Thread.sleep(Native Method) at Test$1.run(Test.java:9)"Thread-6" #24 prio=5 os_prio=0 tid=0x00007fb91498a000 nid=0x4746 waiting on condition [0x00007fb9077fe000] java.lang.Thread.State: TIMED_WAITING (sleeping) at java.lang.Thread.sleep(Native Method) at Test$1.run(Test.java:9)...
上面的线程栈我们注意到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)
即将最耗cpu的线程找出来了,是Businest Thread
0 0
- 定位消耗CPU最多的线程
- 如何定位消耗CPU最多的线程
- 监控消耗CPU最多的语句
- 定位CPU高消耗的问题
- Linux下查看消耗CPU的线程
- Java 性能优化实战记录(1)---定位并分析耗cpu最多的线程
- postgresql定位分析消耗CPU高的SQL语句
- 控制一个高消耗CPU的线程数控制方案
- 定位 占用CPU最多 SQL
- 找出cpu资源占用最多的那个线程
- linux查找消耗cpu最高的线程(jstack),内存占用最大线程(jmap),线程gc情况(jstat)
- 定位cpu占用过高的线程和对应的方法
- 查找消耗CPU较大的sql语句
- memset\memcpy的时间、CPU消耗
- col +最消耗cpu的语句
- 消耗CPU资源的shell脚本
- mysql CPU消耗过大的情况分析
- shell脚本消耗机器的CPU实例
- 【高性能JavaScript】读书笔记
- 【Spring MVC】深度探险SpringMVC(二)——框架介绍
- CSS单位
- ArrayList动态增长方式
- gplt L2-006. 树的遍历(后序中序求层序)
- 定位消耗CPU最多的线程
- TensorFlow用到的数学知识传送门
- className ~
- easyUI datagrid 遍历集合
- 关联规则算法1------关联规则Apriori原理和R实现
- 事务的四种隔离级别
- dpdk学习之一--初识dpdk
- hessian构建RPC的两种方式
- Java类的定义、声明及使用