我在一个程序中创建了几个(数十万个)HashMap对象,每个对象都有几个(15-20)个文本项。这些字符串在提交到数据库之前都已收集(没有分解成更小的数量)。java.lang.OutOfMemoryError:超出GC开销限制
根据Sun的说法,错误发生在“如果在垃圾收集中花费了太多时间:如果超过总时间的98%花在垃圾收集上,并且小于2%的堆被恢复,OutOfMemoryError将被抛出。“
显然,可以使用命令行参数传递给JVM为
- 增加堆大小,经由“-Xmx1024m”(或更多),或
- 完全禁用错误校验,通过“-XX:-UseGCOverheadLimit”。
第一种方法工作正常,第二种方法在另一个java.lang.OutOfMemoryError中结束,这次是关于堆。
因此,问题:对于特定的用例(即几个小型的HashMap对象),是否有任何程序化的替代方案?例如,如果我使用HashMap clear()方法,问题就会消失,但存储在HashMap中的数据也会消失! :-)
这个问题也是在related topic in StackOverflow.
您可能需要改变你的算法,并使用一些更有效的数据结构。你能告诉我们你正在试图实现哪种算法,这需要大量的HashMaps吗? – Ankur 2011-04-30 03:59:47
我只是阅读非常大的文本文件(每个数十万行),我无法控制它们,即它们不能被分解。对于每一行文本,都会构造一个HashMap,其中包含少数(实际上大约10个)小字符串值,并且一次又一次使用相同的数据库字段名称。理想情况下,我希望在将数据发送到数据库之前能够读取整个文件。 – PNS 2011-04-30 09:32:34
听起来好像在将数据发送到数据库之前读取整个文件实际上是一个很糟糕的解决方案......实际上它根本无法工作,在可用内存的非常实际的限制之内。无论如何,你为什么要这么做? “一次又一次使用相同的数据库字段名”是什么意思?字段名称作为键或值?如果他们的字段是键,那么只需使用一个数组,其中的字段被它的位置所隐含......如果它们是值,那么在将它们添加到地图之前将它们实习。这有助于了解数据是什么。干杯。基思。 – corlettk 2011-04-30 10:22:39