內(nèi)存泄漏是指也給不在被程序使用的對象或變量還在內(nèi)存中占有存儲空間。主要有兩種情況:
- 在堆中申請的空間沒有被釋放;
- 是對象已不再被使用,但還仍然在內(nèi)存中保留著。
容易引起內(nèi)存泄漏的原因主要有以下幾個方面:
- 靜態(tài)集合類,例如HashMap和Vector。如果這些容器為靜態(tài),由于它們的生命周期與程序一致,那么容器中的對象在程序結束之前將不能被釋放,從而造成內(nèi)存泄漏。
- 各種連接,例如數(shù)據(jù)庫連接、網(wǎng)絡連接以及IO連接等。在對數(shù)據(jù)庫進行操作的過程中,首先需要建立與數(shù)據(jù)庫的連接,當不再使用時,需要調(diào)用close()方法來釋放與數(shù)據(jù)庫的連接。只有連接關閉后,垃圾回收器才會回收對應的對象。否則,如果在訪問數(shù)據(jù)庫的過程中,對Connection、Statement或ResultSet不顯示地關閉,將會造成大量的對象無法被回收,引起內(nèi)存泄漏。
- 監(jiān)聽器。在Java中,通常也給應用中會用到多個監(jiān)聽器,但是在釋放對象的同時往往沒有相應地刪除監(jiān)聽器,這也可能導致內(nèi)存泄漏。
- 變量不合理的作用域。如果一個變量定義的作用范圍大于它的使用范圍,很可能會造成內(nèi)存泄漏,另一方面如果沒有及時地把對象設置null,很可能導致內(nèi)存泄漏。
- 單例模式可能造成內(nèi)存泄漏。