1. 程式人生 > 其它 >java cpu佔用過高

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十六進位制碼】