JVM-SANDBOX 导致目标服务 JVM Metaspace OOM 的调查始末

本文详细介绍了在使用放火平台进行故障注入时,由于JVM-SANDBOX的问题导致目标服务的Metaspace OOM。通过分析Metaspace、注入流程和日志,发现了由于ThreadLocal未及时清理导致的ClassLoader关闭失败,进而引发内存泄漏。经过本地复现和问题排查,最终确定了修复方案并验证其有效性。
摘要由CSDN通过智能技术生成

背景

放火平台是公司内部研发的平台:遵循混沌工程理念通过故障注入模式对系统进行演练的实施平台,提供丰富的故障场景模拟,以可视化、自动化的方式实施故障演练。

放火平台利用字节增强框架JVM-SANDBOX对 java 类型的服务进行故障注入。在业务线使用的过程中发现在放火平台对某个 java 进程故障注入后故障没有生效

在经过排查后发现主要是开源项目JVM-SANDBOX的 bug,其中涉及到 ThreadLocal,ClassLoader,Metaspace 等相关知识,具体的分析以及优化过程可以往下看。

注入流程

放火平台注入 java 故障的流程:

在注入故障时放火平台会把故障指令下发到目标机器的 chaos-agent 上,chaos-agent 利用开源项目 jvm-sandbox 对目标 jvm 进行故障注入和故障清除。

排查过程

日志表现

在注入无效后登陆目标机器上观察日志,首先发现 jvm-sandbox 在 attach 目标 jvm 时失败了

其次看到更关键的日志:Metaspace 溢出了!!!

Metaspace

Metaspace 是什么,引用官方介绍

Metaspace is a native (as in: off-heap) memory manager in the hotspot.It is used to manage memory for class metadata. Class metadata are allocated when classes are loaded. Their lifetime is usually scoped to that of the loading classloader - when a loader gets collected, all class metadata it accumulated are released in bulk.

简单来说:Metapace 是一块非堆内存,用来存储类的元数据,当加载类的时候会在 Metaspace 中分配空间存储类的元数据,当某个 ClassLoader 关闭时会对应释放掉对类元数据的引用,当触发 GC 时这部分类元数据占用的空间即可在 Metaspace 中被回收掉。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值