猿问

java.lang.OutOfMemoryError:超出了GC开销限制

java.lang.OutOfMemoryError:超出了GC开销限制

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

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

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

  • 通过“-Xmx1024m”(或更多)增加堆大小,或

  • 通过“-XX:-UseGCOverheadLimit”完全禁用错误检查。

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

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

StackOverflow中的相关主题也讨论了该问题


烙印99
浏览 763回答 3
3回答

有只小跳蛙

你基本上没有内存来顺利运行这个过程。想到的选项:像你提到的那样指定更多的内存,在-Xmx512m第一个之间尝试一下HashMap如果可能,使用较小批次的对象进行处理如果你有很多重复的字符串,请String.intern()在将它们放入之前使用它们HashMap使用HashMap(int initialCapacity, float loadFactor)构造函数来调整您的案例
随时随地看视频慕课网APP

相关分类

Java
我要回答