记录一次内存泄漏追踪(一)

659 阅读2分钟

一 背景

项目上线后出现jvm内存过高的情况,并且运行一段时间后会出现内存溢出。

二 分析

  1. 查看项目状态 image.png

可以看到现在使用内存已经达到了12g并且没有内存溢出,推测存在内存泄漏情况

  1. 下载jvm内存快照

  • 查看容器中的java进程pid,找到服务的pid

    jps -lv

  • 下载内存快照

    jmap -dump:format=b,file=head.bin pid

  1. 查看内存快照

    通过检查具体的内存使用情况来进一步定位问题

    通过visualvm来转入快照

image.png

注意visualvm要调整识别文件后缀为hprof文件

image.png

 准入后我们可以查看具体的快照信息
 
 

image.png

查看内存各个类型占比

image.png

发现byte[]类型占比较高,char类型占比也比较高,还有int[]类型,并没有看到哪个对象占用内存很高,其实对象本身如果不是实例数太多,也就是被new了很多次,他本身占用内存其实没那么多,但是其中引用的成员变量,如果很大那么就会占用很多内存,而这部分成员变量是存储在堆区的,也就是byte[] char,String等类型。但是这部分占用比例较高的char[]是由谁来引用呢?我们看看下图

image.png

上图就是具体的实例信息,可以看到引用实例与大小,不过很遗憾,从上面并没有看到具体的内容。

三 结语

visualvm是很出名了分析jvm内存的工具,但是在这次排查中并没有看到具体的问题点,在问题的追踪过程中,找到了另一个工具MAT,这个工具可以更详细的对内存快照进行分析,下一篇会写MAT工具对内存快照的分析。