当前位置: 首页 > 面试题库 >

为什么没有捕获到“ java.lang.OutOfMemoryError:Java堆空间”?

步嘉德
2023-03-14
问题内容

我在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());

     }
}

输出:

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

背景:

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


问题答案:

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

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



 类似资料:
  • 问题内容: 我在执行多线程程序时遇到以下错误 上面的错误发生在其中一个线程中。 据我所知,堆空间仅由实例变量占用。如果这是正确的,那么为什么在运行一段时间后会出现此错误,因为在创建对象时分配了实例变量的空间。 有什么办法可以增加堆空间? 我应该对程序进行哪些更改,以使其占用更少的堆空间? 问题答案: 如果要增加堆空间,可以 -在命令行上使用。默认情况下,这些值基于JRE版本和系统配置。你可以在Ja

  • 问题内容: 我得到这个例外: 在此代码: 我连续2次查询。如果我评论其中之一,其他工作正常。 如果我删除交易,那么事物异常便消失了。这是怎么回事?这是内存泄漏之类的吗?提前致谢。 问题答案: 我从这种事情的多年痛苦中得到了一个提示:答案通常会仔细地隐藏在堆栈跟踪的前10行中的某个位置。始终多次读取堆栈跟踪,如果没有提供足够的帮助,请读取发生故障的方法的源代码。 在这种情况下,问题出在Hiberna

  • 当我使用spark运行一个模型训练管道时,我产生了上面的错误 oom错误由org.apache.spark.util.Collection.ExternalSorter.WritePartitionedFile(ExternalSorter.Scala:706)触发(在堆栈跟踪的底部) 日志: 任何建议都会很棒:)

  • 为我的人工智能类编写一段代码,它旨在列出所有可能的状态,给出三个水壶的水壶问题(你可以装满任何一个水壶,或者把一个水壶倒入另一个水壶,或者清空任何一个水壶,你想要多少次就多少次,以任何顺序),从空水壶开始。 出于某种原因,在记录了88个看似不同的状态后,第89个状态与第一个状态相同,我最终用完了空间,因为它在循环。 我想这与我如何检查状态是不同的有关,但我不能弄清楚。任何帮助都将不胜感激。 }

  • 问题内容: 如何处理“ java.lang.OutOfMemoryError:Java堆空间”错误? 问题答案: 最终,无论你在什么平台上运行,都始终可以使用有限的最大堆。在Windows 32位环境中2GB(不是专门用于堆,而是每个进程的内存总量)。碰巧的是,Java选择减小默认值(大概是为了让程序员在没有遇到这个问题且不必仔细检查它们在做什么的情况下,无法创建内存分配失控的程序)。 因此,考虑

  • 问题内容: 每个线程都有自己的堆栈,但是它们共享一个公共堆。 所有人都清楚堆栈是用于局部/方法变量,堆是用于实例/类变量。 在线程之间共享堆有什么好处。 有多个线程同时运行,因此共享内存可能导致诸如并发修改,互斥等开销的问题。堆中的线程共享哪些内容。 为什么会这样呢?为什么每个线程也不拥有自己的堆?谁能提供一个现实的例子,线程如何利用共享内存? 问题答案: 要将数据从一个线程传递到另一个线程时该怎