2

OutOfMemory假设有一个大型 Java 应用程序,如果发生错误,我想优雅地关闭它。现在我看到以下问题:

  • 一些组件捕获并“吞下”所有组件,Throwables包括OutOfMemory
  • 如果一个线程没有捕获OutOfMemory它就退出并且我们不知道OutOfMemory发生了什么

我可以以某种方式注册一个“JVM 级”处理程序来捕获任何OutOfMemory可能发生在 JVM 中的 JVM 吗?

4

3 回答 3

3

一些组件捕获并“吞下”所有 Throwable,包括 OutOfMemory

他们不应该那样做,我会修复他们。

如果一个线程没有捕获 OutOfMemory,它就会退出并且我们不知道 OutOfMemory 发生了

我也会解决的。

您可以注册一个 UncaughtExceptionHandler。

唯一的选择可能是在 OOME 上触发一个脚本,该脚本会关闭您的程序。这可以从命令行完成。

于 2012-08-14T08:02:39.537 回答
2

内存不足问题是错误,这意味着您无法从中恢复正确的 JVM 状态,因此您无法进行任何终结。相反,您可以尝试监视您的应用程序内存消耗,并在可用内存级别太低时尝试正确关闭它(我想这就是您想要的)。

于 2012-08-14T08:02:38.723 回答
1

永远不要发现错误!所以,RTFM!;)

错误非常奇怪,所以它们应该抛出到 main 并停止 VM。

异常是可抛出的,可以“处理”(SocketTimeoutException、NullpointerException 等)。错误是无法处理的可抛出对象(在最常见的情况下)。如果抛出 OutOfMemoryError,你想做什么?你能延长你的记忆@执行时间吗?垃圾收集器通常会在抛出 OOME 之前运行多次。

所以在你的特殊情况下:很高兴,你有足够的内存来创建 OutOufMemoryError-Object 来看看 VM-Death 的原因是什么。

重构你的代码!;)

于 2012-08-14T09:46:32.837 回答