問題排查之JVM記憶體洩漏

2021-10-12 06:37:19 字數 1776 閱讀 2183

問題排查之jvm記憶體洩漏

1.問題描述,部署在客戶伺服器上的資料閘道器專案,客戶開發反應,出現伺服器記憶體占用很高的問題,懷疑是否為我們部署的專案導致?

開始排查:

一.[endif]登入到客戶伺服器,首先確認是否是我們應用占用的記憶體

[endif]檢視記憶體占用排行

ps aux | sort -k4,4nr | head -n 10

發現了我們應用程序id的身影

[endif]檢視資料閘道器實時記憶體占用

命令:jps, top - p pid檢視實時記憶體分別看

vmpeak程序所使用的虛擬記憶體的峰值

vmsize程序當前使用的虛擬記憶體的大小

vmlck已經鎖住的物理記憶體的大小(鎖住的物理記憶體不能交換到硬碟)

vmhwm程序所使用的物理記憶體的峰值

vmrss程序當前使用的物理記憶體的大小

[endif]我不相信,再用cat/proc/pid/status檢視閘道器記憶體,確認是閘道器記憶體洩漏導致。

[endif]回去翻一下**,沒看出來洩露的地方

[endif]開始嘗試調整jvm引數,希望能通過jvm的調優消除(希望肯定是,渺茫的)

使用-xx:+useconcmarksweepgc -xx:+heapdumponoutofmemoryerror

調整-xms,-xmx,-xmn等引數,測試環境跑。

引數設定發生oom時生成dump

結果是:oom還是出現了(預期內的)

[endif]拿下dump使用jdk中自帶的jvisualvm進行分析

dump匯入,看其裡面的日誌及記憶體gc等,以及第一次出現oom時的gc報錯,反覆看,

發現初次報錯中,找到一些似曾相識的類關鍵字面孔,大概猜想是程式的那一段那一句。

[endif]本地專案跑起來,使用jvisualvm連線本地jdk監控記憶體,gc情況,以及物件記憶體占用情況,同時帶著猜想**段出現問題,可能會出現的情況。看執行緒的生成。

[endif]最後,我發現jvisualvm出現有乙個建立執行緒數達7000加,同一名稱。

[endif]猜想,因為我存在監控定時任務,對kafka資料補償補償。

每隔10秒鐘會執行一次檢查,檢查使用單執行緒池。

案例**

}
日誌確實是顯示關閉了,但是不明白為什麼jvisualvm還是裡面顯示重複建立這個執行緒。

當然到這裡肯定是確認了kafkaproduce物件導致的記憶體洩露。

[endif]解決,將kafkaproduce物件獲取使用單例,每次獲取到的都是同乙個物件就好。

記憶體洩漏排查

在工作中發現乙個tuexdo服務存在記憶體洩漏的情況,之前也嘗試過用valgrind等工具查詢,但是因為 直接載入在tuexdo的服務中,不知道怎麼直接啟動,所以沒有用valgrind。在經過查詢資料後,決定自己寫重寫malloc free等函式,列印出分配位址和釋放位址,進行對比,如果發現只有ma...

jvm記憶體增長問題排查簡例

排查個jvm 記憶體占用持續增加的問題,紀錄一下,引以為戒。運維發現應用jvm記憶體占用在發布後回落,然後持續增高,dump後分析一下 佔記憶體的大部分是這種名字相似的bean,會產生這麼多相同類產生的bean呢?應用使用了動態語言groovy,請求走邏輯時,動態拿到指令碼執行。其中核心 就是gro...

如何排查JVM記憶體問題並定位

今天收到測試小姐姐提的bug,在進行壓測的時,記憶體和cpu都飆高,要我分析一下。使用jdk自帶的 jvisualvm.exe 功能 在jdk的bin目錄下 如果是記憶體洩漏,堆記憶體會一直往上飆,然後會出現瘋狂gc的情況。我這裡沒有出現瘋狂gc的情況,而是有規律的gc,但每次gc的時候cpu都會飆...