我在一個程序中創建了幾個(數十萬個)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