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

本文轉(zhuǎn)載『你假笨』的微信公眾號(hào),你假笨(寒泉子)目前是 PerfMa 創(chuàng)始人之一兼 CEO,之前在阿里工作 7 年多,從事 JVM 相關(guān)工作,為各業(yè)務(wù)系統(tǒng)做性能優(yōu)化,性能問(wèn)題分析,是阿里性能分析平臺(tái)的作者。

在日常 Java 的開(kāi)發(fā)中,性能調(diào)優(yōu)肯定是很多人不能繞開(kāi)的一個(gè)環(huán)節(jié)。而其中最簡(jiǎn)單,也是最基礎(chǔ)的一個(gè)問(wèn)題就是如何定位消耗 CPU 最多的線程。這篇文章中你假笨以一個(gè)簡(jiǎn)單的 Test 例子為藍(lán)本,給各位總結(jié)了分析這類(lèi)問(wèn)題的常用『套路』。

具體如下。

這個(gè)例子里新創(chuàng)建了 11 個(gè)線程,其中 10 個(gè)線程沒(méi)干什么事,主要是 sleep,另外有一個(gè)線程在循環(huán)里一直跑著,可以想象這個(gè)線程是這個(gè)進(jìn)程里最耗 CPU 的線程了,那怎么把這個(gè)線程給抓出來(lái)呢?

首先我們可以通過(guò)top -Hp 來(lái)看這個(gè)進(jìn)程里所有線程的 CPU 消耗情況,得到類(lèi)似下面的數(shù)據(jù)。

拿到這個(gè)結(jié)果之后,我們可以看到 cpu 最高的線程是 pid 為 18250 的線程,占了 99.8%:

接著我們可以通過(guò) jstack的輸出來(lái)看各個(gè)線程棧:

上面的線程棧我們注意到 nid 的值其實(shí)就是線程 ID,它是十六進(jìn)制的,我們將消耗 CPU 最高的線程18250,轉(zhuǎn)成十六進(jìn)制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)

最后,強(qiáng)烈推薦你假笨的微信公眾號(hào),他這幾年寫(xiě)了很多 JVM 的文章,也做了很多方便我們調(diào)試的小工具,相信能幫到你,特別是想深入研究 JVM 的同學(xué)。同時(shí),他公眾號(hào)還記錄了自己成為 JVM 專(zhuān)家的點(diǎn)滴歷程,比如我是如何走時(shí) JVM 這條賊船這篇文章,看完之后,給我以前進(jìn)的力量。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容