什麼樣的java代碼容易memory leak?

 

很多developer知道java也可能memory leak,關於這個主題已經有很多文章了。我這裏只想分享一下自己的memory leak的經驗。

 

說明一下這裏指的memory leak是程序不及時釋放heap導致的OutOfMemoryError.

 

首先一種情況是collection或者是map一直被put數據,沒有機會remove,導致OutOfMemoryError。尤其是當collection或者是map被設計成static變量的時候,它就是個global性質的變量,很可能永遠不會被賦爲null。這也是不建議使用static變量的一個原因。

 

有人會察覺到就算collection賦爲null,元素還是可能未被釋放:


 

原因在於這個o 還是可能被程序reference到。而一般情況下我們遇到的是:

 l.add(new Object ());

在這種情況下,l=null, o也被GC了。

 

我也看到有文章提到在listener的模式下,如果listener一直在註冊register而沒有機會remove也會導致OutOfMemoryError。其實listener也是一個list的結構,本質上是一樣的。很多listener是以匿名類被構造和註冊到被監聽類上面去的, 而被監聽類如果也沒有正確remove註冊的listener的話也會導致OutOfMemoryError。

 

 

發佈了21 篇原創文章 · 獲贊 5 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章