什么是記憶體泄漏
記憶體泄漏是指java應用的堆記憶體使用率持續升高,直至記憶體溢位,
記憶體泄漏的的原因可能有多種
- 分配給應用程式的記憶體本身過小,而應用的業務代碼,確實需要生成大量的物件
- 代碼bug,某些需要被回收的物件,由于代碼bug,卻持續的被參考,導致java虛擬機無法回收這些物件,從而撐爆記憶體
無論哪種記憶體泄露,我們的解決方法都是要定位到具體是什么物件,占用了大量記憶體,從而方便我們基于此進行代碼分析,debug,找出代碼問題,
而能夠幫助我們實作這一目的的方式就是獲取java應用的記憶體 dump
如何獲取記憶體dump
使用命令獲取jcmd
首先需要獲取java 行程id,獲取到java行程后
使用命令
jcmd <pid> GC.heap_dump <file-path>
如果執行報錯
com.sun.tools.attach.AttachNotSupportedException: Unable to open socket file: target process not responding or HotSpot VM not loaded
一般是由于執行jcmd的用戶同java應用本身不是同一個用戶,解決辦法是切換到應用對應的用戶下再執行上述命令
sudo -u [userid] /jcmd <pid> GC.heap_dump <file-path>
如果應用在本地
如果應用是在本地,除了用上述方法外,還可以用JVisualVM 、JConsole
程式例外退出時自動dump
但更為重要的,為了準確還原應用故障的現場,最好通過指定java 執行引數,在程式出錯時,自動dump
java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=<file-or-dir-path>
如何分析記憶體dump
獲取到dump檔案后,需要使用eclipse.org 出品的 Memory Analyzer 工具,使用其中的Dominator Tree,查看各物件的記憶體占用情況

找出占用記憶體最多的物件及其類資訊

參考資料
https://www.baeldung.com/java-heap-dump-capture
https://www.cnblogs.com/alcc/p/9905705.html
https://www.eclipse.org/mat/
歡迎關注我的個人公眾號"西北偏北UP",記錄代碼人生,行業思考,科技評論
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/227205.html
標籤:Windows
