Java內存泄漏的幾種可能

Java內存泄漏引發的緣由:程序員

  內存泄漏是指無用對象(再也不使用的對象)持續佔有內存或無用對象的內存得不到及時釋放,從而形成內存空間的浪費稱爲內存泄漏。數據庫

  長生命週期的對象持有短生命週期對象的引用就極可能發生內存泄漏,儘管短生命週期對象已經再也不須要,可是由於長生命週期持有它的引用而致使不能被回收,這就是Java中內存泄漏的發生場景。網絡

 

形成內存泄漏的幾種狀況:socket

一、靜態集合類引發內存泄漏對象

  像HashMap、Vector等的使用最容易出現內存泄露,這些靜態變量的生命週期和應用程序一致,他們所引用的全部的對象Object也不能被釋放,由於他們也將一直被Vector等引用着。生命週期

二、當集合裏面的對象屬性被修改後,再調用remove()方法時不起做用。內存

三、監聽器rem

  在釋放對象的時候卻沒有去刪除這些監聽器,增長了內存泄漏的機會。get

四、各類鏈接io

  好比數據庫鏈接(dataSourse.getConnection()),網絡鏈接(socket)和io鏈接,除非其顯式的調用了其close()方法將其鏈接關閉,不然是不會自動被GC 回收的。

五、內部類和外部模塊的引用

  內部類的引用是比較容易遺忘的一種,並且一旦沒釋放可能致使一系列的後繼類對象沒有釋放。此外程序員還要當心外部模塊不經意的引用,例如程序員A 負責A 模塊,調用了B 模塊的一個方法如: public void registerMsg(Object b); 這種調用就要很是當心了,傳入了一個對象,極可能模塊B就保持了對該對象的引用,這時候就須要注意模塊B 是否提供相應的操做去除引用。

六、單例模式

  不正確使用單例模式是引發內存泄漏的一個常見問題,單例對象在初始化後將在JVM的整個生命週期中存在(以靜態變量的方式),若是單例對象持有外部的引用,那麼這個對象將不能被JVM正常回收,致使內存泄漏。

相關文章
相關標籤/搜索