天天看點

JVM調優之top+jstack+jmap找出最耗cpu、記憶體的線程并定位代碼

第一步:找出最耗cpu的Java服務

輸入:top

輸入:P

JVM調優之top+jstack+jmap找出最耗cpu、記憶體的線程并定位代碼

得到最耗cpu的Java程序pid為:6142

第二步:找出該程序内最消耗CPU的線程

輸入:top -Hp 6142

JVM調優之top+jstack+jmap找出最耗cpu、記憶體的線程并定位代碼

得到最耗cpu的Java線程pid為:如6149

輸入:printf ‘%x\n’ 6149

JVM調優之top+jstack+jmap找出最耗cpu、記憶體的線程并定位代碼

得到6149的十六進制為 1805

第三步:查詢線程資訊

輸入:jstack 6142 |grep 1805

JVM調優之top+jstack+jmap找出最耗cpu、記憶體的線程并定位代碼

得到線程名:GC task thread#0 (ParallelGC)

定位問題為gc耗時所緻,可能機器記憶體告急或記憶體洩漏。

如果機器記憶體正常,則大機率為短時間記憶體洩露嚴重,導緻GC回收不過來,導緻CPU短時間飙升。

第四步:查詢記憶體占用較大的對象資訊

輸入:jmap -histo:live 6142 |head -20

JVM調優之top+jstack+jmap找出最耗cpu、記憶體的線程并定位代碼

得到記憶體占用較多的對象為HashMap,程式中排查。