這里對linux下、sun(oracle) JDK的線程資源占用問題的查找步驟做一個小結;
linux環境下,當發現java進程占用CPU資源很高,且又要想更進一步查出哪一個java線程占用了CPU資源時,按照以下步驟進行查找:
(一):通過【
top
?-p12377 -H
】 查看java進程的有哪些線程的運行情況;
????? 和通過【jstack 12377 > stack.log】生成Java線程的dump詳細信息;
-
- 先用top命令找出占用資源厲害的java進程id,如圖:# top
- 如上圖所示,java的進程id為’52554′,接下來用top命令單獨對這個進程中的所有線程作監視:
- 先用top命令找出占用資源厲害的java進程id,如圖:# top
-
1
top
?-p52554 -H
#? top視圖里面里面可以通過快捷鍵依次b ,x高亮顯示top的列找出需要的線程,默認CPU排序,Shift+< ,Shift+>可以左右移動高亮排序的列;
如圖:(這時就看出來哪個java線程CPU高,哪個線程內存用的多)
- 如上圖所示,linux下,所有的java內部線程,其實都對應了一個進程id,也就是說,linux上的sun jvm將java程序中的線程映射為了操作系統進程;我們看到,占用CPU資源最高的那個進程id是’15417′,這個進程id對應java線程信息中的’nid’(‘n’ stands for ‘native’);
- (1)要想找到到底是哪段具體的代碼占用了如此多的資源,先使用jstack打出當前棧信息到一個文件里, 比如stack.log:
- python -c
"print hex(9757)"然后記住二進制的號
cat stack.log|grep 二進制的號
-
1
jstack 52554 > stack.log
然后使用’jtgrep’腳本把這個進程號為’9757′的java線程在stack.log中抓出來:
1
jtgrep 9757 stack.log
其中,’jtgrep’是自己隨便寫的一個shell腳本:
1
#!/bin/sh
3
nid=`python -c
"print hex($1)"
`
4
grep
?-i $nid $2
道理很簡單,就是 把’9757′轉換成16進制后,直接grep stack.log;可以看到,被grep出的那個線程的nid=0x3c39,正好是15417的16進制表示。
?