jstat 内存泄漏_基于Java内存dump文件分析解决内存泄漏问题
概述
本文介紹一次解決現場java內存泄漏問題的經過,希望能提供后續遇到類似情況的讀者一點思路。
生產環境發現的問題問題
生產環境運維人員反饋,服務器(windows系統)卡死,相關的服務都運行異常,重啟之后也沒作用。通過運行管理器看到java進程內存占用5G,初步判斷是程序內存泄漏。
基本解決方案
基本解決方案是先收集生產環境的jvm內存使用信息,線程信息,再利用工具進行進一步分析。
解決過程
1、收集jvm內存信息,線程信息
生產環境的操作系統是windows,機器需要先設置好JAVA_HOME環境變量。下面以java進程PID為12140,輸出文件路徑保存在C:\jvmtest 文件夾中為例。
1.1、收集內存使用基本情況統計
使用命令行命令:jmap -heap 12140 > C:\jvmtest\jmapheap
直接打開查看C:\jvmtest文件夾下面的jampheap文件,里面包含內存使用情況基本統計,可以確認問題原因不是jvm參數內存分配過小。
可以看到java堆內存基本已經用完。
內存使用情況基本統計.png
1.2、收集所有java線程運行信息
使用命令行命令:jstack 12140 > C:\jvmtest\jstack
直接打開查看C:\jvmtest文件夾下面的jstack文件,里面包含所有java線程運行信息:
所有java線程運行信息
1.3、收集java內存詳細使用信息
使用命令行命令:jmap -dump:format=b,file=C:\jvmtest\jmap_dump_all 12140
得到C:\jvmtest文件夾下面的jmap_dump_all文件,該內存dump文件有5G大小,二進制文件,不可直接查看,需要用工具查看。
2、基于工具分析
2.1、工具選擇
如果dump文件比較小,推薦直接使用jdk自帶的jvisiualvm工具進行打開,但是如果dump文件比較大,親測jvisiualvm打開失敗,這時推薦選擇eclipse的內存分析工具:eclipse memory analyer(mat)
2.2、eclipse memory analye軟件配置
這里選擇從eclipse官網下載MemoryAnalyzer-1.7.0.20170613-win32.win32.x86_64.zip文件(也可以下載eclipse插件),由于dump文件比較大,打開分析工具前需要修改eclipse memory analyer的內存配置:
配置.png
配置.png
最后一行修改為需要的內存大小
如果dump文件比較大的情況下,如果分析工具運行的環境機器內存太小是打不開的,機器可用內存至少要比dump文件大。
2.2、查看分析情況
打開eclipse memory analye軟件,載入dump文件,看到以下信息:
overlook.png
線程內存使用情況.png
2.3、問題定位
基于eclipse memory analye軟件,可用定位到有1條線程名為pool-4-thread-1的線程,里面有一個ArrayList的對象,這個list對象保存了一系列的HashMap對象,總共有4G。
搜索 1.2步驟介紹的所有java線程信息的文件,可以得到pool-4-thread-1線程運行狀態如下:基于此可以定位到有問題的代碼。
image.png
2.4、問題原因定位
檢查代碼的時候發現,程序有一個模塊,功能是從數據庫定時查詢數據然后數據做處理,模塊中把查出來的數據基于log4j寫到日志中,實際現場環境有時候定時查詢得到的數據有幾百兆,打印到日志文件中打印不過來。導致數據在內存中不斷積壓等待被打印,內存得不到釋放。
總結
本次使用了JVM性能調優監控工具jstack、jamp,相關工具還有jstack、jmap、jhat、jstat,這些工具對于內存溢出,CPU飆升,線程死鎖、等問題解決非常有幫助。
總結
以上是生活随笔為你收集整理的jstat 内存泄漏_基于Java内存dump文件分析解决内存泄漏问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 华为语音助手怎么关闭_一直觉得华为语音助
- 下一篇: error java on syntax