java:找出占用CPU資源最多的那個線程


linux環境下,當發現java進程占用CPU資源很高,且又要想更進一步查出哪一個java線程占用了CPU資源時,按照以下步驟進行查找:

1、先用top命令找出占用資源厲害的java進程id,如:

2、如上圖所示,java的進程id為'12377',接下來用top命令單獨對這個進程中的所有線程作監視:

top -p 12377 -H

如圖:

 

3、如上圖所示,linux下,所有的java內部線程,其實都對應了一個進程id,也就是說,linux上的sun jvm將java程序中的線程映射為了操作系統進程;

我們看到,占用CPU資源最高的那個進程id是'15417',這個進程id對應java線程信息中的'nid'

4、要想找到到底是哪段具體的代碼占用了如此多的資源,先使用jstack打出當前棧信息到一個文件里, 比如stack.log:

jstack 12377 > stack.log

 

      然后使用'jtgrep'腳本把這個進程號為'15417'的java線程在stack.log中抓出來:

jtgrep 15417 stack.log

 

其中,'jtgrep'是自己隨便寫的一個shell腳本:

 

#!/bin/sh

nid=`python -c "print hex($1)"`
grep -i $nid $2

道理很簡單,就是把'15417'轉換成16進制后,直接grep stack.log;可以看到,被grep出的那個線程的nid=0x3c39,正好是15417的16進制表示。

文章轉自:http://wenyue.me/blog/382


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM