我在一个创建数百万个HashMap对象的程序中遇到了错误,每个对象包含15-20个文本条目。这些字符串必须全部收集(不分成较小的部分)后才能提交到数据库。根据Sun的说法,如果垃圾回收花费的时间太长,即如果总时间的98%以上用于垃圾回收,且只恢复了不到2%的堆,则会抛出OutOfMemoryError错误。显然,可以使用命令行向JVM传递参数来解决此问题,方法如下:
增加堆大小,通过"-Xmx1024m"(或更多);或者
完全禁用错误检查,通过"-XX:-UseGCOverheadLimit"。
第一种方法可以正常工作,而第二种方法最终会导致另一个java.lang.OutOfMemoryError错误,这次是关于堆的。因此,问题是:对于特定用例(即多个小HashMap对象),是否有编程替代方案?例如,如果我使用HashMap clear() 方法,则问题就解决了,但存储在HashMap中的数据也会消失!:-) 这个问题也在StackOverflow的相关主题中讨论过。
增加堆大小,通过"-Xmx1024m"(或更多);或者
完全禁用错误检查,通过"-XX:-UseGCOverheadLimit"。
第一种方法可以正常工作,而第二种方法最终会导致另一个java.lang.OutOfMemoryError错误,这次是关于堆的。因此,问题是:对于特定用例(即多个小HashMap对象),是否有编程替代方案?例如,如果我使用HashMap clear() 方法,则问题就解决了,但存储在HashMap中的数据也会消失!:-) 这个问题也在StackOverflow的相关主题中讨论过。