如何快速定位JVM中消耗CPU最多的线程?
本文转载『你假笨』的微信公众号,你假笨(寒泉子)目前是 PerfMa 创始人之一兼 CEO,之前在阿里工作 7 年多,从事 JVM 相关工作,为各业务系统做性能优化,性能问题分析,是阿里性能分析平台的作者。
在日常 Java 的开发中,性能调优肯定是很多人不能绕开的一个环节。而其中最简单,也是最基础的一个问题就是如何定位消耗 CPU 最多的线程。这篇文章中你假笨以一个简单的 Test 例子为蓝本,给各位总结了分析这类问题的常用『套路』。
具体如下。
这个例子里新创建了 11 个线程,其中 10 个线程没干什么事,主要是 sleep,另外有一个线程在循环里一直跑着,可以想象这个线程是这个进程里最耗 CPU 的线程了,那怎么把这个线程给抓出来呢?
首先我们可以通过top -Hp
来看这个进程里所有线程的 CPU 消耗情况,得到类似下面的数据。
拿到这个结果之后,我们可以看到 cpu 最高的线程是 pid 为 18250 的线程,占了 99.8%:
接着我们可以通过 jstack
上面的线程栈我们注意到 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)
最后,强烈推荐你假笨的微信公众号,他这几年写了很多 JVM 的文章,也做了很多方便我们调试的小工具,相信能帮到你,特别是想深入研究 JVM 的同学。同时,他公众号还记录了自己成为 JVM 专家的点滴历程,比如我是如何走时 JVM 这条贼船这篇文章,看完之后,给我以前进的力量。
关注公众号:拾黑(shiheibook)了解更多
[广告]赞助链接:
四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/
随时掌握互联网精彩
- 1 暖暖新家暖暖年 7970426
- 2 美国小哥警告中国不要学美国糟粕 7987331
- 3 美国想要TikTok50%股份 商务部回应 7846024
- 4 年味渐浓 各地举办多种活动迎春节 7713072
- 5 李谷一回应缺席春晚:对不起大家 7613456
- 6 男子花30多万开俄货店 1个月就后悔 7547864
- 7 柯洁退赛无缘冠军 中国围棋协会回应 7482967
- 8 杨紫娜扎撞高定了 7396470
- 9 柯洁暴怒质问裁判 7281463
- 10 女子在高校工作16年未被缴养老险 7164462