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

问题:

我在一个程序中得到这个错误,该程序创建了几个(数十万个)HashMap对象,每个对象具有几个(15-20)个文本条目。在提交到数据库之前,这些字符串都将被收集(不分解成较小的数量)。
根据Sun的说法,如果在垃圾收集中花费了太多时间,那么会发生错误:如果超过98%的总时间花在垃圾回收中,而不到2%的堆就被恢复,那么将抛出一个OutOfMemoryError。 ”。
显然,可以使用命令行将参数传递给JVM

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

第一种方法工作正常,第二种方法最终在另一个java.lang.OutOfMemoryError中,这次是关于堆的。
那么问题是:对于特定用例(即几个小的HashMap对象),是否有任何程序化的替代方法?如果我使用HashMap clear()方法,例如问题消失了,数据存储在HashMap中! 🙂
这个问题也在related topic in StackOverflow.中讨论

回答:

你实际上是用完了内存,以顺利地运行这个过程。想到的选择:

  1. 指定更多的内存,就像你提到的那样,先尝试像-Xmx512m之间的东西
  2. 使用较小批次的HashMap对象可以一次处理
  3. 如果您有很多重复的字符串,则在将它们放入HashMap之前使用String.intern()
  4. 使用HashMap(int initialCapacity, float loadFactor)构造函数调整您的大小写

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: java.lang.OutOfMemoryError: GC overhead limit exceeded

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

+ 56 = 66