在eclipse中获得以下错误。
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space.
有人知道如何解决这个问题吗?
的问候,
Mahendra Athneria
答案 0 :(得分:4)
使用更少的内存。
如果不知道你正在运行什么样的应用程序,很难确切地说出问题所在。所以这个答案只包含处理这个问题的一般建议。
使用JDK随附的jvisualvm
应用程序。它将允许您连接到正在运行的进程,并查看内存使用情况的细分。
查看不应该存在的大量对象的结果。如果您看到一个类有20,000个实例,请进行数学计算,看看是否确实存在多个实例。寻找具有比实际更多实例的对象类型。然后你必须弄清楚为什么你有这么多。
这些额外的对象很可能正在创建,而且没有正确解除引用。您可能会将它们放在某个地方的数据结构中而不是删除它们。您可能有仍在运行的线程,这些线程引用的数据并非如此结束。有很多原因导致您可能继续引用应该进行垃圾收集的数据。
关键信息是知道哪个对象类的数量如此爆炸。一旦你知道了,你可以覆盖该类的构造函数和析构函数来记录它们中有多少已经被创建和销毁,以及在哪里。通过倾注这些数据,您可以确定额外物体的制作位置或未被销毁的位置。纠正此问题后,您将停止收到错误。
当然,您正在处理的数据实际上也可能确实需要这么多的内存。您没有告诉我们您的项目,因此无法准确判断。如果是这种情况,那么你需要弄清楚如何对数据进行分区,一次只加载部分数据,处理它,从内存中释放数据,然后转移到下一个数据块。
我之前遇到过这些问题并使用了上述所有技术来解决这些问题。
答案 1 :(得分:1)
是eclipse运行内存还是你在eclipse中运行的应用程序?
假设它不是内存泄漏而您只需要更多内存,则可以更改传递给在eclipse中运行的应用程序的VM参数。运行配置 - > VM参数 - > -Xmx512m
如果问题是eclipse,那么你可以编辑设置文件eclipse.ini并更改-Xmx参数。
但是,如果确实存在内存泄漏,增加最大堆大小只会将问题隐藏一段时间。
答案 2 :(得分:0)
而不是强迫System.gc()
作为@keatch建议我认为最好找出内存泄漏是什么。有一个工具jHat
(Java Heap Analysis Tool)可以帮助找出问题的原因。
Here解释了如何进行堆转储。