为什么“java.lang.OutOfMemoryError: Java heap space”没有被捕获?

2022-09-04 23:48:59

我在Java Web应用程序中有一个线程导致java.lang.OutOfMemoryError:Java堆空间异常,但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());

     }
}

输出:

finally.  This line does execute 
Thread name: _Worker-8
Exception in thread "_Worker-8" java.lang.OutOfMemoryError: Java heap space
...

背景:

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


答案 1

因为是错误,而不是异常。因为 不是 的子类,则不适用。OutOfMemoryErrorOutOfMemoryErrorExceptioncatch (Exception e)

OutOfMemoryError但是,确实扩展了Shrewable,因此您应该能够捕获它。这是一个关于何时(如果有的话)应该捕获错误的SO讨论。通常,由于您无法对此执行任何操作,因此建议不要在生产代码中捕获错误。但是,考虑到您尝试调试正在发生的事情的特殊情况,这可能会有所帮助。


答案 2

java.lang.OutOfMemoryError 不会扩展 java.lang.Exception,所以它不是 Exception。OutOfMemoryError extends 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


推荐