java cpu佔用過高
查到記憶體佔用最高的是java應用,使用2253M記憶體,但是這臺伺服器跑了好幾個java,具體哪個程序使用top看下資源情況
使用top
可以看到java應用整體記憶體使用率超過了70%,其中pid為16494的程序 一個應用佔了28.7的記憶體
2.定位執行緒問題
使用ps檢視46243的執行緒情況
命令:ps p 46243 -L -o pcpu,pmem,pid,tid,time,tname,cmd
看到46243這個pid的應用產生了很多執行緒。
3.檢視記憶體使用的堆疊
使用jstack檢視
我們挑選了TID=46248的執行緒進行分析
在分析前需要將46248這個id轉換為16進位制,方便查詢資訊
[root@localhost ~]# printf "%x\n" 46248
b4a8
16進製為b4a8
將pid為46234的應用列印到日誌中
[root@localhost ~]# jstack -l 46243> jstack.log
4.檢視記憶體堆疊資訊
[root@localhost ~]# vim jstack.log
在日誌資訊中查詢剛剛轉換的b4a8
可以看到這個執行緒狀態為WAITING
通過檢視日誌發現有大量的 waiting on condition
parking to wait for <0x0000000000000000>
存在大量執行緒等待被喚醒,佔用大量記憶體
5.程式碼優化
將相應日誌傳送給相應開發,優化執行緒
補充:分析java執行緒佔用cpu或者記憶體高的程式碼
1、通過top檢視佔用cpu或者記憶體高的程序截圖如下【備註輸入大寫P以cpu從大到小排序,大寫M以記憶體大小排序】
2、通過對應的cpu找到PID也就是程序對應的pid,然後找到java程序46243這個程序id
3、通過命令top -Hp PID 例如top -Hp 46243
就可以列出該程序下的所有執行緒id
4、通過輸出大寫的P檢視執行緒佔用cpu最高的或者通過大寫M檢視記憶體佔用最高的
然後找到46243這個執行緒id
5、使用命令printf “%x\n” 46243輸出對應的十六進位制碼,1ab4f這個碼是為了過濾執行緒id查到對應的程式碼
6、使用命令jstack 46243(PID)|grep b4a8【備註PID是程序的id,b4a8是這個程序下的一個執行緒佔用最高的cpu十六進位制碼】