問題排查之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都會飆...