java - 如何解决java.lang.OutOfMemoryError

标签 java memory-management out-of-memory

在 Eclipse 中出现以下错误。

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space.

有人知道如何解决这个问题吗?

问候,
马亨德拉·阿瑟尼亚

最佳答案

使用更少的内存。

如果不知道您正在运行哪种应用程序,就很难准确说出问题所在。所以这个答案只是包含处理这个问题的一般建议。

使用 JDK 附带的 jvisualvm 应用程序。它将允许您连接到正在运行的进程并查看内存使用情况的详细信息。

在结果中查找大量不应该出现的对象。如果您看到一个类有 20,000 个实例,请计算一下,看看是否真的应该有那么多。查找实例数量多于实际数量的对象类型。然后你必须弄清楚为什么你有这么多。

这些额外的对象可能正在创建但未正确取消引用。您可能会将它们放入数据结构中的某个位置而不是删除它们。您可能有仍在运行的线程引用此数据,但它们没有像应有的那样结束。有各种各样的原因导致您可能会继续引用应进行垃圾收集的数据。

关键信息是了解哪个对象类别的数量正在爆炸式增长。一旦知道了这一点,您就可以重写该类的构造函数和析构函数来记录它们的创建和销毁数量以及位置。通过分析这些数据,您可以确定额外的对象在哪里被制作,或者它们在哪里没有被销毁。纠正此问题后,您将不再收到错误。

当然,您正在处理的数据也完全有可能确实需要这么多内存。您没有告诉我们有关您的项目的任何信息,因此无法准确判断。如果是这种情况,那么您需要弄清楚如何对数据进行分区以一次仅加载其中的一部分,对其进行处理,将其从内存中释放,然后移至下一个数据 block 。

我以前遇到过这些问题,并使用上述所有技术来解决它们。

关于java - 如何解决java.lang.OutOfMemoryError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5042127/

相关文章:

java - 简单的@ManyToOne 关系 : could not resolve property (org. hibernate.QueryException)

JavaScript,没有引用的对象实例

objective-c - 在自动释放之后立即保留有什么意义?

c# - 当磁盘上没有可用空间时,Image.Save 不会抛出异常

WVGA800 上的 android OutOfMemoryError 而不是任何小屏幕格式

java - 在 Windows 上编译 Java 时访问被拒绝

java - 帮助删除 Java 列表中的空引用?

android - WebView 内存不足异常

java - 在 Selenium 中执行 findElement 时未找到元素

c++ - C++中动态分配内存的碎片整理