1. 程式人生 > >java進程占用系統內存高,排查解決

java進程占用系統內存高,排查解決

java進程


故障:最近收到生產服務器的報警短信以及郵件,報警內容為:內存使用率高於70%。


  1. 使用top命令查看系統資源的使用情況,命令:top


    技術分享圖片



    如圖可以看到java的進程內存使用率較高,java進程的內存使用率達到了70%+



2.定位線程問題(通過命令查看9718進程的線程情況),命令:ps p 9718 -L -o pcpu,pmem,pid,tid,time,tname,cmd

技術分享圖片

由此可以看到這PID:9718的進程產生了很多線程。接下來就可以通過jstack查看內存使用的堆棧。


3. 查看內存使用的堆棧:在這裏我們挑選了TID=9720的線程進行分析,首先需要將9731這個id轉換為16進制。需輸入如下命令,

printf "%x\n" 9731


技術分享圖片

接下需要使用16進制的2603


4. 將PID為9718的堆棧信息打印到jstack.log中,命令:jstack -l 9718 > jstack.log


技術分享圖片


5. 查看堆棧信息文件,命令:vim jstack.log


在進行搜索TID為2603的相關信息。如圖:

技術分享圖片

可以看到這個線程狀態為:WAITING。通過查看文件分析 看到大量 Java Thread State。

說明它在等待另一個條件的發生,來把自己喚醒,或者幹脆它是調用了 sleep(N)。

此時線程狀態大致為以下幾種:

java.lang.Thread.State: WAITING (parking):一直等那個條件發生;

java.lang.Thread.State: TIMED_WAITING (parking或sleeping):定時的,那個條件不到來,也將定時喚醒自己。


6.代碼優化:將文件發送給開發。優化下線程

java進程占用系統內存高,排查解決