什么是内存泄漏
内存泄漏是指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,查看各对象的内存占用情况
找出占用内存最多的对象及其类信息
以上就是排查Java应用内存泄漏问题的步骤的详细内容,更多关于Java应用内存泄漏的资料请关注呐喊教程其它相关文章!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:notice#nhooo.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。