什么是内存泄漏
内存泄漏是指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 、JCo