1. 程式人生 > >JAVA記憶體洩漏的幾種情況

JAVA記憶體洩漏的幾種情況

Java記憶體洩漏引起的原因:

  記憶體洩漏是指無用物件(不再使用的物件)持續佔有記憶體或無用物件的記憶體得不到及時釋放,從而造成記憶體空間的浪費稱為記憶體洩漏。

  長生命週期的物件持有短生命週期物件的引用就很可能發生記憶體洩漏,儘管短生命週期物件已經不再需要,但是因為長生命週期持有它的引用而導致不能被回收,這就是Java中記憶體洩漏的發生場景。

造成記憶體洩漏的幾種情況:

1、靜態集合類引起記憶體洩漏

  像HashMap、Vector等的使用最容易出現記憶體洩露,這些靜態變數的生命週期和應用程式一致,他們所引用的所有的物件Object也不能被釋放,因為他們也將一直被Vector等引用著。

2、當集合裡面的物件屬性被修改後,再呼叫remove()方法時不起作用。

3、監聽器

  在釋放物件的時候卻沒有去刪除這些監聽器,增加了記憶體洩漏的機會。

4、各種連線

  比如資料庫連線(dataSourse.getConnection()),網路連線(socket)和io連線,除非其顯式的呼叫了其close()方法將其連線關閉,否則是不會自動被GC 回收的。

5、內部類和外部模組的引用

  內部類的引用是比較容易遺忘的一種,而且一旦沒釋放可能導致一系列的後繼類物件沒有釋放。此外程式設計師還要小心外部模組不經意的引用,例如程式設計師A 負責A 模組,呼叫了B 模組的一個方法如: public void registerMsg(Object b); 這種呼叫就要非常小心了,傳入了一個物件,很可能模組B就保持了對該物件的引用,這時候就需要注意模組B 是否提供相應的操作去除引用。

6、單例模式

  不正確使用單例模式是引起記憶體洩漏的一個常見問題,單例物件在初始化後將在JVM的整個生命週期中存在(以靜態變數的方式),如果單例物件持有外部的引用,那麼這個物件將不能被JVM正常回收,導致記憶體洩漏。