【发布时间】:2011-08-15 21:52:19
【问题描述】:
我在创建几个(数十万个)HashMap 对象的程序中遇到此错误,每个对象有几个(15-20)个文本条目。在提交到数据库之前,这些字符串都必须被收集(而不是分解成更小的数量)。
根据 Sun 的说法,错误发生在“如果在垃圾收集上花费了太多时间:如果超过 98% 的总时间花在垃圾收集上,而堆的回收率不到 2%,则会出现 OutOfMemoryError被扔掉。”。
显然,可以使用命令行向 JVM 传递参数
- 增加堆大小,通过“-Xmx1024m”(或更多),或
- 通过“-XX:-UseGCOverheadLimit”完全禁用错误检查。
第一种方法效果很好,第二种方法在另一个 java.lang.OutOfMemoryError 中结束,这次是关于堆。
所以,问题:对于特定的用例(即几个小的 HashMap 对象),是否有任何程序替代方案?例如,如果我使用 HashMap clear() 方法,问题就会消失,但存储在 HashMap 中的数据也会消失! :-)
related topic in StackOverflow. 中也讨论了这个问题
【问题讨论】:
-
您可能需要更改您的算法并使用一些更有效的数据结构。你能告诉我们你试图实现的算法需要这么多的 HashMap 吗?
-
我只是在阅读非常大的文本文件(每个文件数十万行),我无法控制这些文件,即它们无法分解。对于每一行文本,构造一个包含几个(实际上大约 10 个)小字符串值的 HashMap,一次又一次地使用相同的数据库字段名称。理想情况下,我希望能够在将数据发送到数据库之前读取整个文件。
-
听起来在将数据发送到数据库之前读取整个文件是一个非常糟糕的解决方案......事实上,在可用内存的非常真实的限制内,它根本不起作用。你为什么要这样做呢? “一次又一次地使用相同的数据库字段名称”是什么意思?字段名称作为键或值?如果它们的字段是键,那么只需使用一个数组,该字段由它的位置隐含......如果它们是值,那么在将它们添加到地图之前实习它们。了解数据是什么会有所帮助。干杯。基思。
-
它们是具有恒定值的键。实习生似乎确实有帮助,谢谢。
标签: java hashmap heap-memory g1gc