linux環境下,當發現java進程佔用CPU資源很高,且又要想更進一步查出哪個java線程佔用了CPU資源時,按照如下步驟進行查找:java
一、先用top命令找出佔用資源厲害的java進程id,如:python
二、如上圖所示,java的進程id爲'12377',接下來用top命令單獨對這個進程中的全部線程做監視:linux
top -p 12377 -H
如圖:shell
三、如上圖所示,linux下,全部的java內部線程,其實都對應了一個進程id,也就是說,linux上的sun jvm將java程序中的線程映射爲了操做系統進程;jvm
咱們看到,佔用CPU資源最高的那個進程id是'15417',這個進程id對應java線程信息中的'nid'spa
四、要想找到究竟是哪段具體的代碼佔用瞭如此多的資源,先使用jstack打出當前棧信息到一個文件裏, 好比stack.log:操作系統
jstack 12377 > stack.log
而後使用'jtgrep'腳本把這個進程號爲'15417'的java線程在stack.log中抓出來:線程
jtgrep 15417 stack.log
其中,'jtgrep'是本身隨便寫的一個shell腳本:code
#!/bin/sh nid=`python -c "print hex($1)"` grep -i $nid $2
道理很簡單,就是把'15417'轉換成16進制後,直接grep stack.log;能夠看到,被grep出的那個線程的nid=0x3c39,正好是15417的16進製表示。blog