如果OutOfMemoryError
是由分配直接字节缓冲区引起的,则忽略JVM标志-XX:+ExitOnOutOfMemoryError
。
检查Oracle JDK和OpenJDK Java版“1.8.0_144” Java(TM)SE运行时环境(版本1.8.0_144-b01) Java HotSpot(TM)64位服务器VM(版本25.144-b01,混合模式)
操作系统:Ubuntu 16.04
重现运行以下代码
package com.company;
import java.nio.ByteBuffer;
public class Main {
public static void main(String[] args) {
// This should guarantee to throw:
try {
ByteBuffer bb = ByteBuffer.allocateDirect(10485760*2);
System.out.println("OOME not triggered");
} catch (OutOfMemoryError err) {
System.out.println("OOME didn't terminate JVM!");
}
}
}
jvm args:-XX:MaxDirectMemorySize=10485760 -XX:+ExitOnOutOfMemoryError
程序输出“OOME没有终止JVM!”并以退出代码0终止。
我希望它崩溃并返回大于0的退出代码。当由于堆空间不足而抛出OutOfMemory
时,它会以这种方式工作。
如何让ExitOnOutOfMemoryError
选项适用于此案例?
也许有一个更新的JDK或替代JDK实现没有这样的错误?
我对druid.io有这个问题。如果实时索引任务遇到
java.lang.OutOfMemoryError: Direct buffer memory
它挂起并且不会终止。