问题背景:

由于双十一压测的需要,我们的订单服务要接入数列科技的压测探针,生产接入完以后,没过多久就出现Metaspace内存溢出。

问题大概分析:

奇怪了,之前运行的好好的,怎么接入这个数列科技的探针就报错了,就引了第三方的jar包而已呀(会对原始类做增强,生成新的类,然后加载到内存),也没干其他事情呀,怀疑是不是接入这个第三方jar,导致元空间加载了很多类,然后导致Metaspace内存溢出啊。

 内存溢出后,会自动生成dump文件,我们把dump文件用MAT工具排查一下结果。

注意:没接探针之前metaspace空间就快要满了:

查看Top consumers

打开Top consumers(top消耗内存的信息)看下占用内存的最大对象报告,看到com.shulie(第三方压测探针的jar)包下的类在此有出现。

 看下Histogram

Histogram搜索com.shulie包相关的对象个有5万多个.对象大小为1675kb,Retained Heap大概是10几M.

经过上面的过程分析:大概了解到引入压测探针jar包,会占用metaspace空间大小,com.shulie包对象,自身内存占用量大小为1675kb,Retained Heap(支配对象的内存占用量)大概是10几M.

结果分析:

1.由于之前本身metaspace空间就占用比较大,到91%了。

2.业务导入excel批量下单,对象转换也会占用metaspace空间大小:

导入订单excel下单,excel数据较大,有1千条记录,这1千条数据要转成list数据集合,会占用metaspace空间大小,出现OOM之前,确实是查到有excel数据批量导入操作的。

 3.本地缓存数据:系统启动时,会将比如敏感词等数据全部放入本地缓存,这个也会占用metaspace空间大小。

4.引入压测探针jar包,也会占用metaspace空间大小,com.shulie包对象大小为1675kb,Retained Heap大概是10几M.,这个探针是用的java-agent技术实现的,它会对原本的类做增强,生成新的类,然后重新加载到内存,这个也要占用metaspace空间大小。

解决措施:

 把元空间大小由原来256M,调大到512M。重启运行观察一段时间后,没有再出现此类问题。

posted on 2023-02-21 19:26  路飞_lufei  阅读(552)  评论(0编辑  收藏  举报