脚本引擎 Metaspace OOM 防护:动态规则频繁加载导致内存泄漏?ClassLoader 隔离 + 定时回收!
公司有个规则引擎服务,每天运营要更新几百条风控规则。QLExpress 每次执行规则都会编译生成一个匿名类,然后装进 JVM 的 Metaspace。运行了两周之后,服务开始频繁 Full GC,再后来直接 Metaspace OOM 崩了。重启能续命两周,但规则数量只增不减,两周变成十天,十天变成一周,最后每天都得重启。 这个问题在脚本引擎场景下几乎必现。GroovyShell、QLExpress、Aviator,甚至 Nashorn,只要是"动态编译 → 生成类 → 装载到 JVM"的模式,都会往 Metaspace 里塞东西。而且 Metaspace 默认没有上限——它只会一直涨,直到物理内存耗尽。 今天聊聊怎么用 ClassLoader 隔离 + 定时回收,让 Metaspace 不炸。 Metaspace 里到底装了什么 Java 8 以前叫 PermGen,Java 8 以后改名为 Metaspace。换了个名字,但干的活一样——存类的元数据。 你写的每一个类,编译后的字节码,字段名、方法名、注解信息、常量池,全部放在这里。普通的 Java 类在应用启动时加载一次,之后不....