基于Java內(nèi)存dump文件分析解決內(nèi)存泄漏問(wèn)題

概述

  本文介紹一次解決現(xiàn)場(chǎng)java內(nèi)存泄漏問(wèn)題的經(jīng)過(guò),希望能提供后續(xù)遇到類(lèi)似情況的讀者一點(diǎn)思路。

生產(chǎn)環(huán)境發(fā)現(xiàn)的問(wèn)題問(wèn)題

  生產(chǎn)環(huán)境運(yùn)維人員反饋,服務(wù)器(windows系統(tǒng))卡死,相關(guān)的服務(wù)都運(yùn)行異常,重啟之后也沒(méi)作用。通過(guò)運(yùn)行管理器看到j(luò)ava進(jìn)程內(nèi)存占用5G,初步判斷是程序內(nèi)存泄漏。

基本解決方案

  基本解決方案是先收集生產(chǎn)環(huán)境的jvm內(nèi)存使用信息,線(xiàn)程信息,再利用工具進(jìn)行進(jìn)一步分析。

解決過(guò)程

1、收集jvm內(nèi)存信息,線(xiàn)程信息

生產(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
直接打開(kāi)查看C:\jvmtest文件夾下面的jampheap文件,里面包含內(nèi)存使用情況基本統(tǒng)計(jì),可以確認(rèn)問(wèn)題原因不是jvm參數(shù)內(nèi)存分配過(guò)小。
可以看到j(luò)ava堆內(nèi)存基本已經(jīng)用完。

內(nèi)存使用情況基本統(tǒng)計(jì).png

1.2、收集所有java線(xiàn)程運(yùn)行信息

使用命令行命令:jstack 12140 > C:\jvmtest\jstack

直接打開(kāi)查看C:\jvmtest文件夾下面的jstack文件,里面包含所有java線(xiàn)程運(yùn)行信息:


所有java線(xiàn)程運(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)行打開(kāi),但是如果dump文件比較大,親測(cè)jvisiualvm打開(kāi)失敗,這時(shí)推薦選擇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文件比較大,打開(kāi)分析工具前需要修改eclipse memory analyer的內(nèi)存配置:

配置.png
配置.png

最后一行修改為需要的內(nèi)存大小

如果dump文件比較大的情況下,如果分析工具運(yùn)行的環(huán)境機(jī)器內(nèi)存太小是打不開(kāi)的,機(jī)器可用內(nèi)存至少要比dump文件大。

2.2、查看分析情況

打開(kāi)eclipse memory analye軟件,載入dump文件,看到以下信息:

overlook.png
線(xiàn)程內(nèi)存使用情況.png
2.3、問(wèn)題定位

基于eclipse memory analye軟件,可用定位到有1條線(xiàn)程名為pool-4-thread-1的線(xiàn)程,里面有一個(gè)ArrayList的對(duì)象,這個(gè)list對(duì)象保存了一系列的HashMap對(duì)象,總共有4G。

搜索 1.2步驟介紹的所有java線(xiàn)程信息的文件,可以得到pool-4-thread-1線(xiàn)程運(yùn)行狀態(tài)如下:基于此可以定位到有問(wèn)題的代碼。

image.png
2.4、問(wèn)題原因定位

檢查代碼的時(shí)候發(fā)現(xiàn),程序有一個(gè)模塊,功能是從數(shù)據(jù)庫(kù)定時(shí)查詢(xún)數(shù)據(jù)然后數(shù)據(jù)做處理,模塊中把查出來(lái)的數(shù)據(jù)基于log4j寫(xiě)到日志中,實(shí)際現(xiàn)場(chǎng)環(huán)境有時(shí)候定時(shí)查詢(xún)得到的數(shù)據(jù)有幾百兆,打印到日志文件中打印不過(guò)來(lái)。導(dǎo)致數(shù)據(jù)在內(nèi)存中不斷積壓等待被打印,內(nèi)存得不到釋放。

總結(jié)

本次使用了JVM性能調(diào)優(yōu)監(jiān)控工具jstack、jamp,相關(guān)工具還有jstack、jmap、jhat、jstat,這些工具對(duì)于內(nèi)存溢出,CPU飆升,線(xiàn)程死鎖、等問(wèn)題解決非常有幫助。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 參考自 http://techblog.youdao.com/?p=961 在分析具體故障,先介紹一下幾種常用的工...
    抓兔子的貓閱讀 6,579評(píng)論 1 27
  • jmap -heap 1234 查看進(jìn)程號(hào)為1234的Java程序的整個(gè)jvm內(nèi)存狀態(tài) jmap -histo 1...
    daocers閱讀 57,295評(píng)論 0 5
  • 今天抑郁越來(lái)越嚴(yán)重 群里小伙伴聊得很多。想著以后不知能不能好了,不能好的話(huà),我就躲起來(lái),不要面對(duì)這個(gè)社會(huì)了 失戀失...
    小徑時(shí)光閱讀 235評(píng)論 0 0
  • 很多人遇到愛(ài)人的時(shí)候。 會(huì)對(duì)她或他說(shuō), 早點(diǎn)遇到你就好了。 其實(shí), 現(xiàn)在遇到, 剛剛好, 不早不晚。 每一個(gè)時(shí)空的...
    358741519617閱讀 534評(píng)論 0 0
  • 河南話(huà)的說(shuō)法,大多字的發(fā)音跟普通話(huà)都一樣,只是聲調(diào)的不同。 四個(gè)聲調(diào)ā á ǎ à,第一個(gè)聲調(diào)ā,往往發(fā)第二個(gè)聲調(diào)...
    羅掌柜real閱讀 5,499評(píng)論 0 0

友情鏈接更多精彩內(nèi)容