Java線上應用故障排查之一:高CPU佔用java
1,top 命令獲取高CPU 的java pidshell
top工具
2,top -H -p pid 查找進程對應的線程ID tid或者使用spa
ps -mp pid -o THREAD,tid,time.net
找出高CPU的tid線程
3,其次將須要的線程ID轉換爲16進制格式:code
printf "%x\n" tidorm
4,根據以上找出的tid使用jstack 對象
jstack pid |grep tid -A 30blog
grep -A 表示這一行往後30行
grep -B 表示這一行往前30行
具體能夠參考這篇文章http://blog.csdn.net/blade2001/article/details/9065985
1,top 命令獲取高mem的java pid
top
2,top -H -p pid 查找進程對應的線程ID tid或者使用
ps -mp 9004 -o THREAD,tid,time,rss,size,%mem
找出高mem佔用的tid,可是針對內存這個命令無法看到具體的線程佔用內存的大小
3,遺憾的是,發現PS命令能夠查到具體進程的CPU佔用狀況,可是不能查到一個進程下具體線程的內存佔用狀況。
只好尋求其餘方法了,幸虧Java提供了一個很好的內存監控工具:jmap命令
jmap命令有下面幾種經常使用的用法:
•jmap [pid] •jmap -histo:live [pid] >a.log •jmap -dump:live,format=b,file=xxx.xxx [pid]
用得最可能是後面兩個。其中,jmap -histo:live [pid] 能夠查看當前Java進程建立的活躍對象數目和佔用內存大小。
jmap -dump:live,format=b,file=xxx.xxx [pid] 則能夠將當前Java進程的內存佔用狀況導出來,方便用專門的內存分析工具(例如:MAT)來分析。
jmap -histo:live 13428 | head -n 20
也能夠用:
最後將獲得的文件使用MAT來分析
jmap -dump:live,format=b,file=13428.txt 13428