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

如何处理“ java.lang.OutOfMemoryError:Java堆空间”错误?

苍德寿
2023-03-14
问题内容

如何处理“ java.lang.OutOfMemoryError:Java堆空间”错误?


问题答案:

最终,无论你在什么平台上运行,都始终可以使用有限的最大堆。在Windows 32位环境中2GB(不是专门用于堆,而是每个进程的内存总量)。碰巧的是,Java选择减小默认值(大概是为了让程序员在没有遇到这个问题且不必仔细检查它们在做什么的情况下,无法创建内存分配失控的程序)。

因此,考虑到这种情况,你可以采用多种方法来确定所需的内存量或减少正在使用的内存量。Java或C#等垃圾收集语言的一个常见错误是,保留对不再使用的对象的引用,或者在可以重用它们时分配许多对象。只要对象引用了它们,它们将继续使用堆空间,因为垃圾收集器不会删除它们。

在这种情况下,你可以使用Java内存探查器来确定程序中哪些方法正在分配大量对象,然后确定是否有办法确保不再引用它们,或者首先不分配它们。我过去使用的一个选项是“ JMP” http://www.khelekore.org/jmp/。

如果确定你出于某种原因分配这些对象,并且需要保留引用(取决于实际情况),则仅需要在启动程序时增加最大堆大小。但是,一旦执行了内存分析并了解了对象的分配方式,就应该对所需的内存有一个更好的了解。

通常,如果你不能保证程序会在一定数量的内存中运行(也许取决于输入大小),则总是会遇到此问题。仅在用尽所有这些之后,你才需要研究将对象缓存到磁盘等中。在这一点上,你应该有一个很好的理由说“我需要Xgb的内存”,你不能通过改进来解决它。你的算法或内存分配模式。通常,只有在大型数据集(例如数据库或某些科学分析程序)上运行的算法才会出现这种情况,然后诸如缓存和内存映射IO之类的技术就变得有用。



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

  • 我正在Java 5上编写一个客户端Swing应用程序(图形字体设计器)。最近,我遇到了错误,因为我在内存使用方面并不保守。用户可以打开无限数量的文件,程序会将打开的对象保存在内存中。经过快速研究,我在5.0 Java虚拟机中发现了人体工程学,其他人说在Windows机器上,JVM默认最大堆大小为。 在这种情况下,我应该如何处理这种限制? 我可以使用java的命令行选项来增加最大堆大小,但这需要找出

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

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

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

  • 问题内容: 我在Java Web应用程序中有一个线程,它导致 java.lang.OutOfMemoryError:Java堆空间 异常,但是try / catch块无法捕获该错误。 样例代码: 输出: 背景: 我最近接手了这个Java项目,并试图跟上Java和这个项目的发展。我是C#开发人员,所以我还不熟悉这个项目或Java。我知道我可以使用- Xmx设置来修复该错误,但我有兴趣捕获此错误,因此