在Drools中禁用JIT解决JVM崩溃是否可取?会产生哪些运行影响?
禁用MVEL JIT方案的推荐性判断
你遇到的JVM崩溃本质是MVEL动态JIT编译字节码时,和Java 8的JVM编译逻辑、IntelliJ启动优化注入的字节码产生了冲突,导致非法内存访问。-Ddrools.jittingThreshold=-1方案的推荐性分场景判断:
- 开发环境:非常推荐,不需要修改IDE配置,开发阶段对规则执行性能敏感度极低,稳定性优先级更高。
- 生产环境:需要结合业务性能要求判断,低负载规则场景可以直接使用,高性能场景建议先做压测验证,或者升级到Drools 7.67+最终稳定版(该版本已修复同类兼容性崩溃问题)。
禁用MVEL JIT后的运行表现
- 执行逻辑变化:Drools默认的jittingThreshold值为20,即单条规则的MVEL表达式累计执行超过20次后,会触发JIT编译为字节码提升执行效率;设置为-1后所有MVEL表达式全程走解释执行,完全跳过动态编译环节。
- 性能变化:规则执行频次低的业务几乎感知不到性能差异;如果是单条规则单次请求就要执行上千次、或者QPS极高的规则引擎场景,会有10%~30%的性能损耗,规则表达式越复杂、循环执行次数越多,损耗幅度越高。
- 稳定性变化:彻底规避MVEL JIT编译相关的兼容性问题,不会再出现同类JVM崩溃,解释执行逻辑的成熟度更高,极少出现运行时异常。
- 内存变化:无需缓存JIT编译生成的字节码,元空间和堆外内存占用会略微降低,不会产生额外内存开销。
内容的提问来源于stack exchange,提问作者javalearner
相关产品推荐
相关产品推荐

