我在一个程序中得到这个错误,该程序创建了几个(数十万)HashMap对象,每个对象有几个(15-20)文本条目。在将这些字符串提交到数据库之前,必须收集所有这些字符串(而不将其分解为更小的数量)。
根据Sun的说法,错误发生在“如果在垃圾收集上花费了太多的时间:如果超过98%的总时间花在垃圾收集上,而不到2%的堆被恢复,则会抛出OutOfMemoryError”。
显然,可以使用命令行将参数传递给JVM
增加堆的大小,通过“-Xmx1024m”(或更多),或者
通过"-XX:-UseGCOverheadLimit"完全禁用错误检查。
第一种方法工作得很好,第二种方法在另一个java.lang中结束。OutOfMemoryError,这次是关于堆的。
那么,问题是:对于特定的用例(即几个小HashMap对象),是否有任何编程替代方案?例如,如果我使用HashMap clear()方法,问题就会消失,但存储在HashMap中的数据也会消失!: -)
该问题也在StackOverflow的相关主题中进行了讨论。
如果你有java8,你可以使用G1垃圾收集器,然后运行你的应用程序:
-XX:+UseG1GC -XX:+UseStringDeduplication
这告诉G1寻找相似的字符串,并在内存中只保留其中一个字符串,其他字符串在内存中只是指向该字符串的指针。
当你有很多重复的字符串时,这很有用。此解决方案可能有效,也可能无效,这取决于每个应用程序。
更多信息:
https://blog.codecentric.de/en/2014/08/string-deduplication-new-feature-java-8-update-20-2/
http://java-performance.info/java-string-deduplication/
如果你有java8,你可以使用G1垃圾收集器,然后运行你的应用程序:
-XX:+UseG1GC -XX:+UseStringDeduplication
这告诉G1寻找相似的字符串,并在内存中只保留其中一个字符串,其他字符串在内存中只是指向该字符串的指针。
当你有很多重复的字符串时,这很有用。此解决方案可能有效,也可能无效,这取决于每个应用程序。
更多信息:
https://blog.codecentric.de/en/2014/08/string-deduplication-new-feature-java-8-update-20-2/
http://java-performance.info/java-string-deduplication/