规则引擎每改一次就加载一次类,Metaspace默默涨到1G把服务打挂了
凌晨四点,一台订单服务的 Pod 重启了三次。 不是 OOM killer,是老年代也正常,JVM 挂的时候堆才用了 2G(最大 4G)。诡异的是 Metaspace 占了 1.2G,而且每次重启后不到两小时又回到 1.2G。 翻 Metaspace 的内存分布,Class Count 已经飙到 15 万。正常一个 Spring Boot 服务也就 1-2 万个类。这多出来的十几万个类哪来的? 顺着加载的类名找过去——全部是 com.alibaba.qlexpress.ExpressionRunner 加上不同的数字后缀: com.alibaba.qlexpress.ExpressionRunner$1 com.alibaba.qlexpress.ExpressionRunner$2 com.alibaba.qlexpress.ExpressionRunner$3 ... com.alibaba.qlexpress.ExpressionRunner$154327 QLExpress 每次执行 QLExpressRunner.execute() 时,会把规则脚本编译成字节码,然后通过一....