1. 先找到Java的進(jìn)程號(hào)
Linux下:
windows 下:
打開(kāi)任務(wù)管理器,然后點(diǎn)擊“查看”菜單滋觉,然后點(diǎn)擊“選擇列”,把pid勾上齐邦,然后就可以在任務(wù)管理器里面看到所有進(jìn)程的pid了
2. 做dump (可選)
jdk自帶的jstack工具可以查看jiava的線(xiàn)程信息椎侠,可以實(shí)時(shí)查看,也可以導(dǎo)出來(lái)措拇。如果實(shí)時(shí)查看不方便可以先dump我纪。
jstack 命令使用提示:
Usage:
jstack [-l] <pid>
(to connect to running process)
jstack -F [-m] [-l] <pid>
(to connect to a hung process)
jstack [-m] [-l] <executable> <core>
(to connect to a core file)
jstack [-m] [-l] [server_id@]<remote server IP or hostname>
(to connect to a remote debug server)
Options:
-F to force a thread dump. Use when jstack <pid> does not respond (process is hung)
-m to print both java and native frames (mixed mode)
-l long listing. Prints additional information about locks
-h or -help to print this help message
3. 找到里面是哪個(gè)線(xiàn)程占用率最高
Linux下:
用 top -H -p <pid> 查看該進(jìn)程所有線(xiàn)程信息,找到占用率最高的那個(gè)
Windows下:
除了使用jvisualvm或者帶上top-thread插件的jconsole之外丐吓,可以用Windows自己提供的三方工具—— Process Explorer v15.3
4. 找到里面是哪個(gè)線(xiàn)程占用率最高
得到占用率最高的線(xiàn)程ID后浅悉,要把它轉(zhuǎn)成16進(jìn)制
Linux下:
printf "%x\n" <pid>
Windows下:
自帶的計(jì)算器可以提供該功能
5. 分析dump查找問(wèn)題代碼片
可以用 jstack <pid> | grep -A <tid> 來(lái)實(shí)時(shí)獲取內(nèi)存中該線(xiàn)程代碼片,這里<tid>是第3步中得到的16進(jìn)制的id
也可以在第2步中導(dǎo)出的dump里面查找第3步中得到的線(xiàn)程id的十六進(jìn)制而找到代碼片券犁。
6. 更簡(jiǎn)單的辦法
DK自帶工具jvisualvm和jconsole是非常強(qiáng)大的术健。其中jvisualvm原聲支持實(shí)時(shí)查看線(xiàn)程CPU使用情況。
啟動(dòng)jvisualvm粘衬,并查看目標(biāo)java進(jìn)程信息荞估,然后選擇Sampler -> CPU -> Thread CPU Time
如圖: