2017-10-28 162 views
0

了很多努力,我似乎​​無法克服得到一個避免「GC開銷超限」錯誤

GC開銷限制的問題後,在我的Java程序超過

錯誤。

它的發生是含有大量字符串操作,對象名單,數量和訪問DB一個大方法中。 我曾嘗試以下:

    使用每個的ArrayList後
  1. ,我已經加入:列表=新的ArrayList <>();列表= NULL;
  2. 對於琴絃,而不是具有例如。 50次追加(STR + =「....」)我嘗試有一個附加每個DB訪問我關閉語句和結果集後總文本

此方法是從主叫這樣的:

for(int i=0; i<L; i++) { 
    cns = new Console(i); 

    cns.processData();//this is the method 

    cns=null; 
} 

當此循環被執行1次或2次,一切正常。對於L> = 3,我幾乎肯定會得到垃圾回收器錯誤。

不應該在每次執行該方法後都有一個cns = null的事實,強制執行GC並將所有內容從前一次執行中解放出來?

是否也應該將其設置爲null之前刪除對象的所有私有屬性?也許把一個Thread.sleep()可以在每個循環後強制GC?

+0

也許你第三次運行佔用太多的內存。我會建議將你的大方法分成更小的方法。手動調用GC和Thread.spleep是一種錯誤的方法。 – Admit

回答

0

其實沒有理由在每個循環的結束設定cns爲null。無論如何,你在循環開始時將它設置爲new Console() - 如果通過將其設置爲空來釋放任何東西,則也將通過將其設置爲新對象來釋放它。

你可以嘗試一個System.gc();調用來建議系統做一個垃圾回收,但我不知道這是否會幫助你或使之變得更糟。系統已經在嘗試垃圾收集 - 如果沒有,你不會得到這個錯誤。

你不告訴我們你究竟是如何建立你的字符串,但請記住,+=不是唯一的罪魁禍首。如果你有類似String s = "Hello " + "to the" + " world";的東西,那就像把它放在三條線上並使用+=一樣糟糕。如果這是個問題,StringBuilder可能是你的朋友。

您可以閱讀Error java.lang.OutOfMemoryError: GC overhead limit exceeded的答案就如何避免這種錯誤的一些其他建議。看起來對於一些人來說,當你幾乎但不是完全沒有記憶的時候,它就會被觸發。所以增加可用於Java的內存量可能會(或不會)有所幫助。

+0

感謝您的回答。 StringBuilder技巧幫助了我。另外,在數據庫方面。除了在每條語句之後關閉語句和ResultSet之外,是否偶爾關閉Connection也是一種好習慣?這會節省內存嗎? – hragber

+0

它可能會節省少量的內存,但除非在數據庫調用之間進行重要的處理或等待用戶輸入,否則可能不值得。如果你不斷關閉連接並創建新連接,那隻會意味着更多的垃圾收集。 –

相關問題