很多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。