一 背景
项目上线后出现jvm内存过高的情况,并且运行一段时间后会出现内存溢出。
二 分析
- 查看项目状态
可以看到现在使用内存已经达到了12g并且没有内存溢出,推测存在内存泄漏情况
下载jvm内存快照
- 查看容器中的java进程pid,找到服务的pid
jps -lv
- 下载内存快照
jmap -dump:format=b,file=head.bin pid
- 查看容器中的java进程pid,找到服务的pid
查看内存快照
通过检查具体的内存使用情况来进一步定位问题 通过visualvm来转入快照
注意visualvm要调整识别文件后缀为hprof文件
准入后我们可以查看具体的快照信息
查看内存各个类型占比
发现byte[]类型占比较高,char类型占比也比较高,还有int[]类型,并没有看到哪个对象占用内存很高,其实对象本身如果不是实例数太多,也就是被new了很多次,他本身占用内存其实没那么多,但是其中引用的成员变量,如果很大那么就会占用很多内存,而这部分成员变量是存储在堆区的,也就是byte[] char,String等类型。但是这部分占用比例较高的char[]是由谁来引用呢?我们看看下图
上图就是具体的实例信息,可以看到引用实例与大小,不过很遗憾,从上面并没有看到具体的内容。
## 三 结语
visualvm是很出名了分析jvm内存的工具,但是在这次排查中并没有看到具体的问题点,在问题的追踪过程中,找到了另一个工具MAT,这个工具可以更详细的对内存快照进行分析,下一篇会写MAT工具对内存快照的分析。