jstat 内存泄漏_基于Java内存dump文件分析解决内存泄漏问题
概述
本文介紹一次解決現(xiàn)場(chǎng)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)用完。
內(nèi)存使用情況基本統(tǒng)計(jì).png
1.2、收集所有java線程運(yùn)行信息
使用命令行命令:jstack 12140 > C:\jvmtest\jstack
直接打開查看C:\jvmtest文件夾下面的jstack文件,里面包含所有java線程運(yùn)行信息:
所有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文件比較大,親測(cè)jvisiualvm打開失敗,這時(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文件比較大,打開分析工具前需要修改eclipse memory analyer的內(nèi)存配置:
配置.png
配置.png
最后一行修改為需要的內(nèi)存大小
如果dump文件比較大的情況下,如果分析工具運(yùn)行的環(huán)境機(jī)器內(nèi)存太小是打不開的,機(jī)器可用內(nèi)存至少要比dump文件大。
2.2、查看分析情況
打開eclipse memory analye軟件,載入dump文件,看到以下信息:
overlook.png
線程內(nèi)存使用情況.png
2.3、問題定位
基于eclipse memory analye軟件,可用定位到有1條線程名為pool-4-thread-1的線程,里面有一個(gè)ArrayList的對(duì)象,這個(gè)list對(duì)象保存了一系列的HashMap對(duì)象,總共有4G。
搜索 1.2步驟介紹的所有java線程信息的文件,可以得到pool-4-thread-1線程運(yùn)行狀態(tài)如下:基于此可以定位到有問題的代碼。
image.png
2.4、問題原因定位
檢查代碼的時(shí)候發(fā)現(xiàn),程序有一個(gè)模塊,功能是從數(shù)據(jù)庫定時(shí)查詢數(shù)據(jù)然后數(shù)據(jù)做處理,模塊中把查出來的數(shù)據(jù)基于log4j寫到日志中,實(shí)際現(xiàn)場(chǎng)環(huán)境有時(shí)候定時(shí)查詢得到的數(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,這些工具對(duì)于內(nèi)存溢出,CPU飆升,線程死鎖、等問題解決非常有幫助。
總結(jié)
以上是生活随笔為你收集整理的jstat 内存泄漏_基于Java内存dump文件分析解决内存泄漏问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 华为语音助手怎么关闭_一直觉得华为语音助
- 下一篇: 崩溃重启_semi-sync插件崩溃导致