我在一个创建几个(数十万个)HashMap 对象的程序中遇到这个错误,每个对象都有几个(15-20)个文本条目。在提交到数据库之前,这些字符串必须全部收集(不分解成更小的数量)。
根据 Sun 的说法,错误发生在“如果在垃圾收集上花费了太多时间:如果超过 98% 的总时间用于垃圾收集并且回收的堆少于 2%,则会抛出 OutOfMemoryError。 ”。
显然,可以使用命令行将参数传递给 JVM
- 通过“-Xmx1024m”(或更多)增加堆大小,或
- 通过“-XX:-UseGCOverheadLimit”完全禁用错误检查。
第一种方法效果很好,第二种方法在另一个 java.lang.OutOfMemoryError 中结束,这次是关于堆。
所以,问题:对于特定的用例(即几个小 HashMap 对象),是否有任何程序替代方案?例如,如果我使用 HashMap clear() 方法,问题就会消失,但存储在 HashMap 中的数据也会消失!:-)
StackOverflow 中的相关主题也讨论了这个问题。