如何在JVM级别捕获OutOfMemory错误?

时间:2012-08-14 07:59:25

标签: java exception-handling jvm out-of-memory

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

  • 有些组件会抓住并“吞下”所有Throwables,包括OutOfMemory
  • 如果某个帖子没有抓住OutOfMemory,则会退出,我们不知道OutOfMemory已发生

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

3 个答案:

答案 0 :(得分:3)

  

有些组件捕获并“吞噬”所有Throwables,包括OutOfMemory

他们不应该这样做,我会解决它们。

  

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

我也会解决。

您可以注册UncaughtExceptionHandler。

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

永远不会发现错误!那么,RTFM! ;)

错误非常奇怪,因此它们应该抛到主要位置并停止虚拟机。

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

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

重构您的代码! ;)