问题背景:
由于双十一压测的需要,我们的订单服务要接入数列科技的压测探针,生产接入完以后,没过多久就出现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。重启运行观察一段时间后,没有再出现此类问题。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!