天天看點

java程序記憶體一直沒釋放_如何排查Java伺服器記憶體和CPU過高問題

java程式記憶體一直沒釋放_如何排查Java伺服器記憶體和CPU過高問題

一、記憶體過高

1、記憶體過高一般有兩種情況:記憶體溢出和記憶體洩漏

(1)記憶體溢出:程式配置設定的記憶體超出實體機的記憶體大小,導緻無法繼續配置設定記憶體,出現OOM報錯。

(2)記憶體洩漏:不再使用的對象一直占據着記憶體不釋放,導緻這塊記憶體浪費掉,久而久之,記憶體洩漏的對象堆積起來,也會導緻實體機的記憶體被耗盡,出現OOM報錯。

2、記憶體過高的檢測辦法:通常我們的Java伺服器部署在Linux機器上面,可以通過jvm自帶的指令進行一些檢測:

(1)檢視對象的數目和占用記憶體大小;

(2)如果需要進一步定位問題代碼,那麼就需要把Java程式的記憶體鏡像導出,再具體分析了,通過如下指令導出程式的記憶體鏡像。

二、CPU過高

1、當程式發現CPU過高的情況時,可以使用Windows系統的Process Explorer工具來找到CPU高消耗的線程,是以需要在Windows機器上面搭建好伺服器的測試環境,盡量模拟出線上CPU飙升的情況;

2、模拟好環境後,通過任務管理器,在程序一欄中找到Java程式的程序号;

3、下載下傳Process Explorer工具:

https://docs.microsoft.com/zh-cn/sysinternals/downloads/process-explorer

4、打開工具後,根據剛才的程序号找到程序;

5、然後右鍵-->Properties,再選擇Threads頁籤,點進CPU排序,可以找到消耗CPU最多的那個線程;

6、使用科學電腦,将十進制的線程号轉成十六進制,比如493620-->78834;

7、到此已經拿到了可能出問題的程序号和線程号,接下來使用jvm内置的指令來導出Java的堆棧資訊:

jstack -l >

8、打開導出的堆棧資訊,并全文搜尋剛剛拿到的十六進制的線程号,就可以找到出問題的代碼具體位置了。