1,检查机器上面服务的JVM参数配置
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/data/jvmLog/mdm/heapdump_pid%p.hprof 用来自动生成堆内存转储文件的。
参数说明:
- -XX:+HeapDumpOnOutOfMemoryError
作用:当发生OutOfMemoryError时,自动生成堆内存转储文件
触发条件:Java堆内存不足,抛出OutOfMemoryError异常
默认值:false(不自动生成) - -XX:HeapDumpPath=/data/jvmLog/mdm/heapdump_pid%p.hprof
作用:指定堆转储文件的保存路径和文件名
路径:/data/jvmLog/mdm/ 目录
文件名:heapdump_pid%p.hprof(%p会被替换为进程ID)

注:发现有些机器版本不识别%p,所以建议直接写目录:
-XX:HeapDumpPath=/data/jvmLog/mdm/
2,进入机器使用命令查看服务进程
ps aux | grep java

上面的24601是mdm服务的进程id,下面31530是ESS服务的进程id。
3,GC日志目录 :
/data/jvmLog/mdm/
查看gc.log日志
gc日志记录了youngGC和fullGC

内存溢出会生成hprof文件,

下载文件使用sz命令:sz -e 文件名
文件太大使用gzip压缩一下

使用sz命令下载压缩文件到本地:

解压后用idea打开该文件:

打开后长这样:



上面的OriginData对象有64万个,对象本身有647M(hprof文件中的shallow heap单位是字节(Byte)),他和他的孩子对象一共2.6G。

点进去就能看到这个List确实占用了2.6G,对应OriginDataServiceImpl类的第326行代码:

把2.6G的集合对象存到redis里面,导致内存溢出了,定位到问题了,所以下一步就是进行优化了。
手动生成堆转储(这会触发GC并生成.hprof文件)
jmap -dump:format=b,file=/data/jvmLog/ess/test_heapdump.hprof


4491

被折叠的 条评论
为什么被折叠?



