乐趣区

关于docker:如何排查Java应用内存泄漏问题

什么是内存透露

内存透露是指 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…
https://www.cnblogs.com/alcc/…
https://www.eclipse.org/mat/

欢送关注我的集体公众号 ” 东南偏北 UP”,记录代码人生,行业思考,科技评论

退出移动版