在测试环境中报了 java.lang.OutOfMemoryError: Java heap space
错误,即 Java 堆内存溢出,通过日志没找到具体原因,决定通过分析 Java 内存。
进入该服务的容器后,执行 ps -ef | grep java
,可以看到该 Java 服务有这行参数:
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/dapeng-container/bin/../logs/20190810105201.hprof
即当 OutOfMemoryError 发生时自动生成 Heap Dump 文件,生成的文件在容器的 /dapeng-container/bin/../logs/20190810105201.hprof
。然后我把这个生成的文件下载到本地。
打开 JDK 自带的 jvisualvm.exe
程序,该程序在 JDK 安装目录的 bin 目录下,载入 Heap Dump 文件。点击类,按大小倒序,可以看到下图:
可以看到 char[]
这个类占用非常大的空间,点进去,看到下图:
可以看到前面两个实例占用内存很大,然后根据“数组项”的描述,