一种排查java.lang.OutOfMemoryError: Metaspace的方法

有现场反应k8s中的java应用出现java.lang.OutOfMemoryError: Metaspace,但是没有提供hprof转储文件,所以本地排查该问题。
Metaspace区域的内存溢出错误,通常意味着 JVM 中加载的类元数据超出了限制。
jstat -class 1000命令可以每隔一秒打印一次虚拟机装载了的类的个数,例如:
image

然后arthas的classloader命令可以查看每个类加载器加载的类的个数,例如:
image
根据现场反馈,某计算任务进行一段时间后会出现该错误,所以本地也进行同样操作争取复现。
jstat -class 1000 观察到类个数增加后,执行arthas的classloader命令,对比哪个类加载器的个数或加载的类个数增加了,从而缩小排查范围。
在我的例子中是org.drools.core.rule.JavaDialectRuntimeData$PackageClassLoader的numberOfInstances和loadedCountTotal都有明显增加,可以知道问题和drools规则引擎有关。
经过排查代码得知是有同事把KieBase对象缓存到redis中,每次从redis取出反序列化时都会增加类,占用metaspace空间,从而引起OOM。

posted @ 2025-10-09 18:20  年迈的魔法师  阅读(5)  评论(0)    收藏  举报