概述
本文介紹一次解決現(xiàn)場java內(nèi)存泄漏問題的經(jīng)過领迈,希望能提供后續(xù)遇到類似情況的讀者一點(diǎn)思路波材。
生產(chǎn)環(huán)境發(fā)現(xiàn)的問題問題
生產(chǎn)環(huán)境運(yùn)維人員反饋拆魏,服務(wù)器(windows系統(tǒng))卡死搓谆,相關(guān)的服務(wù)都運(yùn)行異常薯嗤,重啟之后也沒作用嘹害。通過運(yùn)行管理器看到j(luò)ava進(jìn)程內(nèi)存占用5G撮竿,初步判斷是程序內(nèi)存泄漏。
基本解決方案
基本解決方案是先收集生產(chǎn)環(huán)境的jvm內(nèi)存使用信息吼拥,線程信息倚聚,再利用工具進(jìn)行進(jìn)一步分析。
解決過程
1凿可、收集jvm內(nèi)存信息惑折,線程信息
生產(chǎn)環(huán)境的操作系統(tǒng)是windows,機(jī)器需要先設(shè)置好JAVA_HOME環(huán)境變量枯跑。下面以java進(jìn)程PID為12140惨驶,輸出文件路徑保存在C:\jvmtest 文件夾中為例。
1.1敛助、收集內(nèi)存使用基本情況統(tǒng)計(jì)
使用命令行命令:jmap -heap 12140 > C:\jvmtest\jmapheap
直接打開查看C:\jvmtest文件夾下面的jampheap文件粗卜,里面包含內(nèi)存使用情況基本統(tǒng)計(jì),可以確認(rèn)問題原因不是jvm參數(shù)內(nèi)存分配過小纳击。
可以看到j(luò)ava堆內(nèi)存基本已經(jīng)用完续扔。
1.2、收集所有java線程運(yùn)行信息
使用命令行命令:jstack 12140 > C:\jvmtest\jstack
直接打開查看C:\jvmtest文件夾下面的jstack文件焕数,里面包含所有java線程運(yùn)行信息:
1.3纱昧、收集java內(nèi)存詳細(xì)使用信息
使用命令行命令:jmap -dump:format=b,file=C:\jvmtest\jmap_dump_all 12140
得到C:\jvmtest文件夾下面的jmap_dump_all文件,該內(nèi)存dump文件有5G大小堡赔,二進(jìn)制文件识脆,不可直接查看,需要用工具查看。
2灼捂、基于工具分析
2.1离例、工具選擇
如果dump文件比較小,推薦直接使用jdk自帶的jvisiualvm工具進(jìn)行打開悉稠,但是如果dump文件比較大宫蛆,親測jvisiualvm打開失敗,這時推薦選擇eclipse的內(nèi)存分析工具:eclipse memory analyer(mat)
2.2的猛、eclipse memory analye軟件配置
這里選擇從eclipse官網(wǎng)下載MemoryAnalyzer-1.7.0.20170613-win32.win32.x86_64.zip文件(也可以下載eclipse插件)洒扎,由于dump文件比較大拱燃,打開分析工具前需要修改eclipse memory analyer的內(nèi)存配置:
最后一行修改為需要的內(nèi)存大小
如果dump文件比較大的情況下膜宋,如果分析工具運(yùn)行的環(huán)境機(jī)器內(nèi)存太小是打不開的沸久,機(jī)器可用內(nèi)存至少要比dump文件大。
2.2猫牡、查看分析情況
打開eclipse memory analye軟件,載入dump文件邓线,看到以下信息:
2.3淌友、問題定位
基于eclipse memory analye軟件,可用定位到有1條線程名為pool-4-thread-1的線程骇陈,里面有一個ArrayList的對象震庭,這個list對象保存了一系列的HashMap對象,總共有4G你雌。
搜索 1.2步驟介紹的所有java線程信息的文件器联,可以得到pool-4-thread-1線程運(yùn)行狀態(tài)如下:基于此可以定位到有問題的代碼。
2.4婿崭、問題原因定位
檢查代碼的時候發(fā)現(xiàn)拨拓,程序有一個模塊,功能是從數(shù)據(jù)庫定時查詢數(shù)據(jù)然后數(shù)據(jù)做處理氓栈,模塊中把查出來的數(shù)據(jù)基于log4j寫到日志中渣磷,實(shí)際現(xiàn)場環(huán)境有時候定時查詢得到的數(shù)據(jù)有幾百兆,打印到日志文件中打印不過來授瘦。導(dǎo)致數(shù)據(jù)在內(nèi)存中不斷積壓等待被打印醋界,內(nèi)存得不到釋放。
總結(jié)
本次使用了JVM性能調(diào)優(yōu)監(jiān)控工具jstack提完、jamp形纺,相關(guān)工具還有jstack、jmap氯葬、jhat挡篓、jstat,這些工具對于內(nèi)存溢出,CPU飆升官研,線程死鎖秽澳、等問題解決非常有幫助。