【问题标题】:how to solve java.lang.OutOfMemoryError如何解决 java.lang.OutOfMemoryError
【发布时间】:2011-02-18 13:55:24
【问题描述】:

在 Eclipse 中出现以下错误。

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

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

问候,
马亨德拉·雅典娜

【问题讨论】:

标签: java memory-management out-of-memory


【解决方案1】:

使用更少的内存。

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

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

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

这些额外的对象很可能正在被创建并且没有被正确地取消引用。您可能将它们放在某个数据结构中而不是删除它们。您可能有仍在运行的线程,这些线程引用了这些数据,而这些数据并未像应有的那样结束。出于各种原因,您可能会继续引用应该被垃圾收集的数据。

关键信息是知道哪个对象类的数量像这样爆炸。一旦知道这一点,您就可以覆盖该类的构造函数和析构函数,以记录其中有多少被创建和销毁,以及在哪里创建和销毁。通过查看这些数据,您可以确定额外的对象是在哪里制造的,或者它们在哪里没有被破坏。更正此问题后,您将不再收到此错误。

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

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

【讨论】:

    【解决方案2】:

    eclipse 运行的是内存还是你在 eclipse 中运行的应用程序?

    假设它不是内存泄漏并且您只需要更多内存,您可以更改传递给在 eclipse 中运行的应用程序的 VM 参数。运行配置 -> VM 参数 -> -Xmx512m

    如果问题是 eclipse,那么您可以编辑设置文件 eclipse.ini 并更改 -Xmx 参数。

    但是,如果确实存在内存泄漏,增加最大堆大小只会将问题隐藏得更久。

    【讨论】:

      【解决方案3】:

      而不是像@keatch 建议的那样强制System.gc(),我认为最好找出内存泄漏是什么。有一个工具jHat (Java Heap Analysis Tool) 可以帮助找出问题的原因。

      Here 解释了如何进行堆转储。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-04-27
        • 2018-12-25
        • 2014-06-15
        • 1970-01-01
        • 2014-11-01
        • 1970-01-01
        相关资源
        最近更新 更多