我在一个程序中得到这个错误,该程序创建了几个(数十万)HashMap对象,每个对象有几个(15-20)文本条目。在将这些字符串提交到数据库之前,必须收集所有这些字符串(而不将其分解为更小的数量)。

根据Sun的说法,错误发生在“如果在垃圾收集上花费了太多的时间:如果超过98%的总时间花在垃圾收集上,而不到2%的堆被恢复,则会抛出OutOfMemoryError”。

显然,可以使用命令行将参数传递给JVM

增加堆的大小,通过“-Xmx1024m”(或更多),或者 通过"-XX:-UseGCOverheadLimit"完全禁用错误检查。

第一种方法工作得很好,第二种方法在另一个java.lang中结束。OutOfMemoryError,这次是关于堆的。

那么,问题是:对于特定的用例(即几个小HashMap对象),是否有任何编程替代方案?例如,如果我使用HashMap clear()方法,问题就会消失,但存储在HashMap中的数据也会消失!: -)

该问题也在StackOverflow的相关主题中进行了讨论。


当前回答

The parallel collector will throw an OutOfMemoryError if too much time is being spent in garbage collection. In particular, if more than 98% of the total time is spent in garbage collection and less than 2% of the heap is recovered, OutOfMemoryError will be thrown. This feature is designed to prevent applications from running for an extended period of time while making little or no progress because the heap is too small. If necessary, this feature can be disabled by adding the option -XX:-UseGCOverheadLimit to the command line.

其他回答

为此使用下面的代码在你的应用程序gradle文件下的android关闭。

dexOptions { javaMaxHeapSize “4g” }

郑重声明,我们今天也遇到了同样的问题。我们通过使用这个选项来修复它:

-XX:-UseConcMarkSweepGC

显然,这修改了用于垃圾收集的策略,使问题消失了。

如果您正在创建数十万个哈希映射,那么您使用的哈希映射可能远远超过实际需要;除非处理大文件或图形,否则存储简单数据不应超过Java内存限制。

你应该重新考虑一下你的算法。在这种情况下,我会在这个问题上提供更多的帮助,但在你提供更多关于问题背景的信息之前,我不能提供任何信息。

这帮助我摆脱了这个错误。此选项将禁用 - xx: + DisableExplicitGC

对于我来说,使用-Xmx选项增加内存是解决方案。

我用java读取了一个10g的文件,每次我都得到相同的错误。当top命令中的RES列的值达到-Xmx选项中设置的值时,就会发生这种情况。然后使用-Xmx选项增加内存,一切正常。

还有一点。当我在用户帐户中设置JAVA_OPTS或CATALINA_OPTS并再次增加内存数量时,我得到了相同的错误。然后,我在我的代码中打印这些环境变量的值,它们给我的值与我设置的值不同。原因是Tomcat是该进程的根,然后由于我不是su-doer,我要求管理员在Tomcat中增加catalina.sh中的内存。