java.lang.OutOfMemoryError:超出GC开销限制[重复]

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

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

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

  • 通过“-Xmx1024m”(或更多)增加堆大小,或
  • 通过“-XX:-UsegCoveredLimit”完全禁用错误检查

第一种方法工作正常,第二种方法最终导致另一个java.lang.OutOfMemoryError,这次是关于堆的

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

这个问题也在aStackOverflow中的相关主题

实际上,您的内存不足,无法顺利运行进程。想到的选项:

  1. 如前所述指定更多内存,请先尝试介于-Xmx512m之间的内容
  2. 如果可能的话,使用小批量的HashMap对象立即进行处理
  3. 如果有大量重复字符串,请使用String.intern(),然后将它们放入哈希映射中
  4. 使用HashMap(int initialCapacity,float loadFactor)根据您的情况调整构造函数

发表评论