如果
在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
要重现,请运行以下代码
上面代码的输出将是:
如何使
我在druid.io中遇到了这个问题。如果实时索引任务遇到
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参数:-XX:MaxDirectMemorySize=10485760 -XX:+ExitOnOutOfMemoryError
程序输出“OOME didn't terminate JVM!”并以退出码0终止。我原本期望它会崩溃并返回大于0的退出码。当由于堆空间不足而抛出OutOfMemory
时,它会以这种方式工作。
如果您使用jvm参数-Xmx10485760 -XX:+ExitOnOutOfMemoryError
运行以下代码,则jvm进程将以退出码3崩溃:
try {
byte[] b = new byte[10485760*2];
System.out.println("OOME not triggered");
} catch (OutOfMemoryError err) {
System.out.println("OOME didn't terminate JVM!");
}
上面代码的输出将是:
由于Java堆空间不足而终止:java.lang.OutOfMemoryError
这是预期的行为,但第一个示例没有复现。如何使
ExitOnOutOfMemoryError
选项适用于此情况?
也许有更新的JDK或替代JDK实现没有这样的错误?我在druid.io中遇到了这个问题。如果实时索引任务遇到
java.lang.OutOfMemoryError: Direct buffer memory
它卡住了,无法终止。