JVM参数-XX:+ExitOnOutOfMemoryError在直接内存OOM时失效问题咨询
JVM参数
-XX:+ExitOnOutOfMemoryError对Direct Buffer内存溢出不生效的问题 最近我碰到了一个挺棘手的JVM行为问题:当程序抛出java.lang.OutOfMemoryError: Direct buffer memory时,原本配置的-XX:+ExitOnOutOfMemoryError参数居然完全被忽略了——JVM并没有像预期那样直接退出,而是继续运行并不断抛出错误信息。
验证环境
我已经在以下环境中确认了这个问题的存在:
- JDK版本:Oracle JDK/OpenJDK
1.8.0_144(具体运行环境:Java(TM) SE Runtime Environment (build 1.8.0_144-b01),Java HotSpot(TM) 64-Bit Server VM (build 25.144-b01, mixed mode)) - 操作系统:Ubuntu 16.04
复现代码
你可以用下面的代码快速复现这个问题:
package com.company; import java.nio.ByteBuffer; public class Main { public static void main(String[] args) { // 循环分配直接缓冲区,直到触发Direct buffer内存溢出 while (true) { ByteBuffer.allocateDirect(1024 * 1024 * 10); // 每次分配10MB的直接内存 } } }
运行时加上-XX:+ExitOnOutOfMemoryError参数,你会观察到:当JVM抛出OutOfMemoryError: Direct buffer memory后,程序并不会立即终止,这明显违反了该参数的设计预期。
内容的提问来源于stack exchange,提问作者denisvlah
相关产品推荐
相关产品推荐

