java.lang.OutOfMemoryError:超出了GC開銷限制

我在一個程序中建立了這個錯誤,該程序建立了幾個(數十萬)HashMap對象,每一個對象都有幾個(15-20)文本條目。 這些字符串必須所有收集(不分解成較小的數量),而後再提交給數據庫。 java

根據Sun的說法,該錯誤發生「若是在垃圾回收上花費了太多時間:若是在垃圾回收上花費了總時間的98%以上,而回收不到2%的堆,則將引起OutOfMemoryError。 」。 算法

顯然,可使用命令行將參數傳遞給JVM sql

  • 經過「 -Xmx1024m」(或更多)增長堆大小,或
  • 經過「 -XX:-UseGCOverheadLimit」徹底禁用錯誤檢查。

第一種方法能夠很好地工做,第二種方法最後是另外一個java.lang.OutOfMemoryError,這是關於堆的。 數據庫

所以,問題是:對於特定的用例(例如,幾個小的HashMap對象),是否有任何編程替代方法? 例如,若是我使用HashMap clear()方法,問題就會消失,可是存儲在HashMap中的數據也會消失! :-) 編程

StackOverflow相關主題中也討論了此問題 ui


#1樓

這幫助我擺脫了這個錯誤。此選項禁用-XX:+ DisableExplicitGC spa


#2樓

使用替代的HashMap實現( Trove )。 標準Java HashMap具備大於12倍的內存開銷。 人們能夠在這裏閱讀詳細信息。 命令行


#3樓

若是發生錯誤: code

「內部編譯器錯誤:java.lang.OutOfMemoryError:java.lang.AbstractStringBuilder超出了GC開銷限制」 對象

將Java堆空間增長到2GB,即-Xmx2g.


#4樓

在等待結束時不要將整個結構存儲在內存中。

將中間結果而不是哈希表寫入數據庫中的臨時表-從功能上講,數據庫表等效於哈希表,即二者均支持對數據的鍵控訪問,但該表不受內存限制,所以請在此處使用索引表,而不要使用索引表哈希圖。

若是正確完成,您的算法甚至都不會注意到更改-此處正確意味着意味着使用一個類來表示表,甚至像哈希表同樣爲它提供put(key,value)和get(key)方法。

中間表完成後,從中而不是從內存中生成所需的sql語句。


#5樓

若是在垃圾回收上花費了太多時間,則並行收集器將拋出OutOfMemoryError 。 特別是,若是在垃圾回收上花費了總時間的98%以上,而回收不到2%的堆,則會拋出OutOfMemoryError 。 此功能旨在防止應用程序長時間運行,而因爲堆過小而幾乎沒有進展,甚至沒有進展。 若有必要,能夠經過在命令行中添加選項-XX:-UseGCOverheadLimit來禁用此功能。

相關文章
相關標籤/搜索