我在一個程序中建立了這個錯誤,該程序建立了幾個(數十萬)HashMap對象,每一個對象都有幾個(15-20)文本條目。 這些字符串必須所有收集(不分解成較小的數量),而後再提交給數據庫。 java
根據Sun的說法,該錯誤發生「若是在垃圾回收上花費了太多時間:若是在垃圾回收上花費了總時間的98%以上,而回收不到2%的堆,則將引起OutOfMemoryError。 」。 算法
顯然,可使用命令行將參數傳遞給JVM sql
第一種方法能夠很好地工做,第二種方法最後是另外一個java.lang.OutOfMemoryError,這是關於堆的。 數據庫
所以,問題是:對於特定的用例(例如,幾個小的HashMap對象),是否有任何編程替代方法? 例如,若是我使用HashMap clear()方法,問題就會消失,可是存儲在HashMap中的數據也會消失! :-) 編程
StackOverflow的相關主題中也討論了此問題。 ui
這幫助我擺脫了這個錯誤。此選項禁用-XX:+ DisableExplicitGC spa
使用替代的HashMap實現( Trove )。 標準Java HashMap具備大於12倍的內存開銷。 人們能夠在這裏閱讀詳細信息。 命令行
若是發生錯誤: code
「內部編譯器錯誤:java.lang.OutOfMemoryError:java.lang.AbstractStringBuilder超出了GC開銷限制」 對象
將Java堆空間增長到2GB,即-Xmx2g.
在等待結束時不要將整個結構存儲在內存中。
將中間結果而不是哈希表寫入數據庫中的臨時表-從功能上講,數據庫表等效於哈希表,即二者均支持對數據的鍵控訪問,但該表不受內存限制,所以請在此處使用索引表,而不要使用索引表哈希圖。
若是正確完成,您的算法甚至都不會注意到更改-此處正確意味着意味着使用一個類來表示表,甚至像哈希表同樣爲它提供put(key,value)和get(key)方法。
中間表完成後,從中而不是從內存中生成所需的sql語句。
若是在垃圾回收上花費了太多時間,則並行收集器將拋出OutOfMemoryError
。 特別是,若是在垃圾回收上花費了總時間的98%以上,而回收不到2%的堆,則會拋出OutOfMemoryError
。 此功能旨在防止應用程序長時間運行,而因爲堆過小而幾乎沒有進展,甚至沒有進展。 若有必要,能夠經過在命令行中添加選項-XX:-UseGCOverheadLimit
來禁用此功能。