如何解决java.lang.OutOfMemoryError

如何解决java.lang.OutOfMemoryError,java,memory-management,out-of-memory,Java,Memory Management,Out Of Memory,在eclipse中获得以下错误 Exception in thread "main" java.lang.OutOfMemoryError: Java heap space. 有人知道如何解决这个问题吗 问候, Mahendra Athneria我认为最好是找出内存泄漏的原因,而不是像@keatch建议的那样强制执行System.gc()。有一个工具可以帮助找出问题的原因 这是如何进行堆转储的说明。使用更少的内存。 如果不知道您运行的是哪种应用程序,就很难准确地说出问题所在。所以这个答案将包含

在eclipse中获得以下错误

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space.
有人知道如何解决这个问题吗

问候,

Mahendra Athneria

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


这是如何进行堆转储的说明。

使用更少的内存。

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

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

在结果中查找大量不应该存在的对象。如果您看到一个类有20000个实例,请进行数学运算,看看是否应该有那么多实例。查找实例数量远远超过实际数量的对象类型。然后你必须弄清楚为什么你有这么多

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

关键信息是知道哪一个对象类在数量上像这样爆炸。一旦知道了这一点,就可以重写该类的构造函数和析构函数,以记录其中有多少个已创建和销毁,以及在何处创建和销毁。通过浏览这些数据,您可以确定在何处制作额外的对象,或者在何处不销毁这些对象。一旦你纠正了这个问题,你将停止得到错误

当然,也完全有可能您正在处理的数据实际上需要这么大的内存。你没有告诉我们你的项目,所以不可能准确地判断。如果是这种情况,那么您需要弄清楚如何对数据进行分区,一次只加载部分数据,对其进行处理,从内存中释放数据,然后移动到下一块数据


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

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

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

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


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

是否尝试增加堆空间?也许您确实需要那么多内存(默认值非常低),如果您还可以添加堆栈跟踪,这将非常有用。无法用给定的信息诊断原因。可能是重复的