常見的java內存問題整理

1、容器類對象或數組對象不清理,特別是靜態的容器類或數組對象。主要出現場景是緩存的維護。

2、“重”對象沒有顯式釋放或及時釋放,如SWT.Color、SWT.Font;數據庫連接;網絡連接;IO流對象。大體上是因爲此類對象最終調用的是操作系統本地資源,超出了JVM垃圾回收內存管理機制的管轄範圍。相對於SWT的Color等對象,SWING的對應對象就不需要主動釋放,因爲SWING的界面是完全用java技術繪製的,在JVM內存管理範圍內。

3、對象的生命週期太長,沒有及時釋放對無用對象的引用。最常見了。有種情況是addXXXListener()後,在監聽的生命週期結束後不調用對應的removeXXXLitener(),多半後面會導致重複調用addXXXListener()多次的情況,當然系統的體現就是越來越慢了。所以A模塊調用的B模塊的addXXXListener()時,也需要弄清楚B模塊是否有removeXXXListener()方法,畢竟addXXXListener()和setXXXListener()是兩回事。

4、線程池沒資源,有時見到JVM的這種異常報上來或自己設計的線程池沒資源了。這很可能是設計問題,對於一個線程運行中可能導致線程中斷掛起的異常沒有捕獲處理,結果線程中斷掛起了,線程池維護再不那麼智能,很快就會發現無線程可用了。另一種情況是多線程死鎖,鎖得多了很快也會發現沒資源可用了。

5、單線程遞歸(當然多線程更容易出問題),導致超長的遞歸棧。

6、大量的字符串操作,很多時候應該用字符串緩衝StringBuffer和StringBuilder

7、內存的永久區不夠(jdk7據說沒有永久保存區,不知道會是啥樣子),見http://lichen0921.iteye.com/blog/451092

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章