有现场反应k8s中的java应用出现java.lang.OutOfMemoryError: Metaspace,但是没有提供hprof转储文件,所以本地排查该问题。
Metaspace区域的内存溢出错误,通常意味着 JVM 中加载的类元数据超出了限制。
jstat -class
然后arthas的classloader命令可以查看每个类加载器加载的类的个数,例如:
根据现场反馈,某计算任务进行一段时间后会出现该错误,所以本地也进行同样操作争取复现。
jstat -class
在我的例子中是org.drools.core.rule.JavaDialectRuntimeData$PackageClassLoader的numberOfInstances和loadedCountTotal都有明显增加,可以知道问题和drools规则引擎有关。
经过排查代码得知是有同事把KieBase对象缓存到redis中,每次从redis取出反序列化时都会增加类,占用metaspace空间,从而引起OOM。