【问题标题】:Why is "java.lang.OutOfMemoryError: Java heap space" not caught?为什么“java.lang.OutOfMemoryError: Java heap space”没有被捕获?
【发布时间】:2010-12-25 16:57:58
【问题描述】:

我在 Java Web 应用程序中有一个线程导致 java.lang.OutOfMemoryError: Java heap space 异常,但 try/catch 块没有捕获错误。

示例代码:

private void doSomeWork()
{
     try
     {
         processData();  //Causes OutOfMemoryError
         System.out.println("This line does not execute");
     }
     catch (Exception e)
     {
         System.out.println("Exception.  This line does not execute.");
         //Log error
     }
     finally
     {
         System.out.println("finally.  This line does execute");
         System.out.println("Thread name: " + Thread.currentThread().getName());

     }
}

输出:

最后。这一行确实执行 线程名称:_Worker-8 线程“_Worker-8”java.lang.OutOfMemoryError 中的异常:Java 堆空间 ...

背景:

我最近接手了这个 Java 项目,我正在努力跟上 Java 和这个项目的步伐。我是 C# 开发人员,所以我还不熟悉这个项目或 Java。 我知道我可以使用 -Xmx 设置修复错误,但我有兴趣捕获此错误,以便记录它。该错误未显示在任何日志文件中,并且输出在 Eclipse 中以调试模式显示在控制台中。

【问题讨论】:

    标签: java try-catch out-of-memory


    【解决方案1】:

    “~Error”不是“~Exception”。

    你必须捕捉“错误”或“可抛出”

    【讨论】:

      【解决方案2】:

      我通常会在线程中添加一个“UncaughtExceptionHandler”,因此如果您有任何泄漏,至少有机会记录问题并进行一些清理。

      【讨论】:

        【解决方案3】:

        因为OutOfMemoryErrorError,而不是Exception。由于OutOfMemoryError 不是Exception 的子类,因此catch (Exception e) 不适用。

        OutOfMemoryError 确实扩展了Throwable,但是,你应该能够抓住它。这是一个SO discussion,关于何时(如果有的话)你应该捕获错误。通常,由于您对此无能为力,因此建议不要费心在生产代码中捕获错误。但考虑到您尝试调试正在发生的事情的特殊情况,它可能会有所帮助。

        【讨论】:

        • 带有链接参考的好答案。我很感激,谢谢!
        • 我建议在应用程序的最外部(或线程方法的最外部)捕获 throwable,这样您就可以真正了解程序中止的原因(如果没有其他人会为你做这件事)。
        【解决方案4】:

        java.lang.OutOfMemoryError 没有扩展 java.lang.Exception 所以它不是一个异常。 OutOfMemoryError 扩展了 java.lang.Error。如果你想捕捉错误,试试这个:

        private void doSomeWork()
        {
             try
             {
                 processData();  //Causes OutOfMemoryError
                 System.out.println("This line does not execute");
             }
             catch (Error e)
             {
                 System.out.println("Exception.  This line does not execute.");
                 //Log error
             }
             finally
             {
                 System.out.println("finally.  This line does execute");
                 System.out.println("Thread name: " + Thread.currentThread().getName());
        
             }
        }
        

        注意:异常和错误扩展了 Throwable,因此您也可以使用 Throwable 来捕获两者。

        http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Throwable.html

        【讨论】:

          【解决方案5】:

          OutOfMemoryError 扩展 VirtualMachineError 而 Exception 直接扩展 Throwable。所以它没有按照 Java 规范被捕获。如果您希望捕获所有异常,请将 catch (Throwable e) 添加到子句中,您将拥有它。

          【讨论】:

          • 更准确地说,OutOfMemoryError 扩展了 VirtualMachineError,它扩展了 Error,并且由于 Errors 不是 Exceptions,catch(Exception) 无法捕获它
          • 宾果游戏。想列出整棵树但变得懒惰:)
          猜你喜欢
          • 2012-08-03
          • 2016-04-15
          • 1970-01-01
          • 2013-05-18
          • 1970-01-01
          • 1970-01-01
          • 2018-12-25
          • 2014-06-15
          相关资源
          最近更新 更多