内存溢出问题解决
一、常规解决思路
-
首先、在JVM参数配置时需要配置内存溢出后dump出内存的快照来,配置如下:
-XX:HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=内存快照.hprof输出路径
-
然后、导出.hprof,放到分析工具里面分析内存溢出的原因
-
最后、通过调整JVM参数或者修复内存泄漏的代码来修复问题。
二、问题的发现
首先进入到容器查看JVM参数配置片段如下:
-XX:HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/dcs/home/.dependecy-check/dump/
可以看到内存溢出后的快照放在/dcs/home/.dependecy-check/dump/
路径下面
进入到该路径,下面有一个
xxxxx.hprof文件
将这个xxxxx.hprof文件从容器导出到本地
kubectl cp statefule-0:/dcs/home/.dependecy-check/dump/xxxxx.hprof /tmp/dcs.hprof
将.hprof文件通过mat工具打开(也可以通过其他工具打开)
概览:
可以看到上面有一个399MB的对象。
stacktrace如下:
可以看到在做git clone时发生内存溢出。
通过jmap
命令可以看到容器的内存状况
日常情况下,JVM的内存情况还是比较正常的,但是对内存设置为512M,可能是由于堆内存设置过小,单个文件占用内存过多导致的内存溢出。
问题解决
调整JVM内存大小为2G,通过jmap
查看到的信息,老年代设置的特别小只有2M,在调整内存参数时一起做了调整如下: