如何解决OutOfMemoryError?

时间:2012-01-17 23:10:31

标签: java jvm out-of-memory

对于学校的项目,我必须编写不同类型的算法。问题是,我得到了一个有效的算法。但我必须运行它几次,一段时间后它会给我以下错误:

  

线程“main”中的异常java.lang.OutOfMemoryError:Java堆空间

我知道错误意味着什么,但是有可能让Java在运行期间搜索空白区域吗?我知道它使用了很多空间,而这些空间在某些时候并没有被使用。它在应用程序运行期间将很多对象设置为null并创建了许多新对象,因此它耗尽了内存。

如此具体:是否可以让JVM释放一些设置为null的空间?或者在程序运行时释放一些空间?我知道我可以将JVM设置为更多空间,但迟早我会遇到同样的问题。

如果您需要我的IDE(如果它是特定于IDE的),它就是Eclipse。

5 个答案:

答案 0 :(得分:2)

请谷歌'垃圾收集'。 Java总是希望从您不使用的对象中重用空间。如果内存不足,则需要使用-Xmx配置更多内存,或者必须修复代码以保留更少的对象。您可能会发现像jvisualvm这样的分析器可以帮助您找到浪费的内存使用情况。

答案 1 :(得分:1)

如果您使用的是Oracle / Sun JVM,我建议您下载Visual VM 1.3.3,安装所有插件,然后启动它。它将向您展示每个堆生成,线程,CPU,对象等中发生的事情。它可以告诉您哪个类占用了最多的堆空间。

如果你有数据,你会很快弄清楚。

答案 2 :(得分:0)

我会使用内存分析器来确定内存的使用位置。设置为null很少有帮助。在获得OOME之前,GC将始终运行并释放尽可能多的空间。

答案 3 :(得分:0)

问:“是否可以让JVM释放一些设置为null的空间?或者在程序运行时释放一些空间?”

答:是的,使用对System.gc()的调用会执行此操作,但这不太可能解决您的问题,因为系统会不时自动执行此操作。您需要找到使用所有内存的对象并在代码中修复它。可能是一个永远不会被清除且只被添加到的列表。

我实际上在实现需要大量数据结构的特别复杂的算法时遇到了这个问题。我不得不来这个网站发一个问题。事实证明,为了避免内存错误,我必须完全使用完全不同类型的对象。

这是question

答案 4 :(得分:0)

GC会自动回收'未使用'的内存,所以是的,可以在运行时释放一些空间,但了解被归类为可能被回收的内容至关重要。 基本上,如果对象本身无法访问,则可以回收对象的空间(垃圾收集) - 没有对它的引用。当您说'将空间设置为空'时,您最有可能通过将设置为null来删除仅一个链接(引用)到对象。这将允许仅在唯一链接(参考)

时回收对象
Object First= new Object();   //first object
Object Second= new Object();  //second object 
Object SecondPrim=Second;     //second reference to second object

First=null;   
// First memory will be reclaimed (sooner or later)
Second=null;
// there is still a reference to second object via SecondPrim
// second object will not be reclaimed

希望这会有所帮助。至于检查究竟发生了什么,我会建议分析你的程序。