內存泄漏是指java應用的堆內存使用率持續升高,直至內存溢出。
內存泄漏的的緣由可能有多種html
不管哪一種內存泄露,咱們的解決方法都是要定位到具體是什麼對象,佔用了大量內存,從而方便咱們基於此進行代碼分析,debug,找出代碼問題。
而可以幫助咱們實現這一目的的方式就是獲取java應用的內存 dumpjava
首先須要獲取java 進程id,獲取到java進程後
使用命令eclipse
jcmd <pid> GC.heap_dump <file-path>
若是執行報錯socket
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 、JConsoledebug
但更爲重要的,爲了準確還原應用故障的現場,最好經過指定java 執行參數,在程序出錯時,自動dumpcode
java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=<file-or-dir-path>
獲取到dump文件後,須要使用eclipse.org 出品的 Memory Analyzer 工具。使用其中的Dominator Tree,查看各對象的內存佔用狀況
htm
找出佔用內存最多的對象及其類信息
對象
https://www.baeldung.com/java-heap-dump-capture
http://www.javashuo.com/article/p-zvzqmaae-nw.html
https://www.eclipse.org/mat/blog
歡迎關注個人我的公衆號"西北偏北UP",記錄代碼人生,行業思考,科技評論