科锐线上OOM内存溢出排查

1,检查机器上面服务的JVM参数配置

-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/data/jvmLog/mdm/heapdump_pid%p.hprof 用来自动生成堆内存转储文件的。
参数说明:

  1. -XX:+HeapDumpOnOutOfMemoryError
    作用:当发生OutOfMemoryError时,自动生成堆内存转储文件
    触发条件:Java堆内存不足,抛出OutOfMemoryError异常
    默认值:false(不自动生成)
  2. -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
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值