java内存不足,然后退出

java内存不足,然后退出,java,memory,jvm,out-of-memory,exit,Java,Memory,Jvm,Out Of Memory,Exit,我有一个分析大文件的软件。限制输入或提供无限的内存不是一个选项,所以我不得不忍受飞行的噪音。因为OOME只会杀死线程,所以我的软件运行状态很糟糕 从外面看,一切都正常,因为进程正在运行,但从内部看,它是死的 我想拔掉插头。但是我该怎么做呢 捕获OOME并不能保证执行下一行代码。e、 g.系统出口(9)。因此JVM必须注意OOME并破坏自身 他们的虚拟机选项是否适用于此?当你得到一个OOME时,你的内存可能会非常低,而且日志记录并不总是有效。解决这个问题的一种方法是使用一个shutdown方法,该

我有一个分析大文件的软件。限制输入或提供无限的内存不是一个选项,所以我不得不忍受飞行的噪音。因为OOME只会杀死线程,所以我的软件运行状态很糟糕

从外面看,一切都正常,因为进程正在运行,但从内部看,它是死的

我想拔掉插头。但是我该怎么做呢

捕获OOME并不能保证执行下一行代码。e、 g.系统出口(9)。因此JVM必须注意OOME并破坏自身


他们的虚拟机选项是否适用于此?

当你得到一个OOME时,你的内存可能会非常低,而且日志记录并不总是有效。解决这个问题的一种方法是使用一个shutdown方法,该方法保存一些在关闭之前不会释放的内存

e、 g

因此JVM必须注意OOME并销毁自己。他们的虚拟机对此有什么选择吗

不,没有

但是,我不得不质疑您的假设,即您无法捕获
OutOfMemoryError
并立即调用异常处理程序中的
System.exit()

在实践中,它应该起作用。唯一的潜在问题是您是否调用了
Runtime.setRunFinalizersOnExit(true)
。。。如果您以非零退出状态退出,则该选项也会被忽略


(关于捕获OOME和其他随机的
错误
异常的警告是JVM可能不适合继续执行。但是调用
System.exit(非零)
不会这样做!)

您可以使用Java 8 update 92支持的
-XX:+ExitOnOutOfMemoryError

您还可以使用
-XX:+CrashOnOutOfMemoryError
获取内核转储以进行进一步调查

您还可以使用
-XX:+HeapDumpOnOutOfMemoryError
在OOME上生成堆转储,以供进一步调查


来源:和。

“捕捉OOME并不能保证下一行代码将被执行。”你对此有参考吗?它确实有效,我已经编写了一个Swing程序,它捕获OutOfMemoryError,然后向屏幕发送一条关于它的消息。在调用堆栈中捕获几级OOME的行为可能会释放足够的内存来进行一些基本的日志记录/错误处理(因为调用堆栈中的GC根消失)。这是真的,@Peter Lawrey的答案是另一种方法。(我在其他上下文中也看到过。例如,一些JVM做这种事情是为了为创建OOME及其堆栈框架保留空间。)有趣的方法!你在某处生产过吗?勇敢、异国情调、离谱:p@JoachimSauer我在生产中使用了这个,并保留了64KB。
 private static byte[] lastResort = new byte[256*1024];
 public static void handleOOME(OutOfMemoryError oome) {
     lastResort = null;
     try {
        LOG.fatal("Dying after ", oome);
     } finally {
        System.exit(-1);
     }
  }