java記憶體泄露問題

來源:互聯網
上載者:User

標籤:標準   生命週期   public   instance   single   cti   儲存   程式   hash   

記憶體泄露是指一個不再被程式使用的對象或變數還在記憶體中佔用儲存空間。

  在Java語言中,判斷一個記憶體空間是否符合記憶體回收的標準有兩個:

①給對象賦予了空值null,以後再沒有使用過;

②給對象賦予了新值,重新分配了記憶體空間。

  記憶體泄露有兩種情況:

①在堆中申請的空間沒有被釋放;(記憶體回收機制可以有效解決該問題)

②對象已不再被使用,但還仍然在記憶體中保留著。(Java中的記憶體泄露主要是該情況)

 

  容易引起記憶體泄露的原因主要有以下幾種:

1)靜態集合類,如HashMap和Vector。如果這些容器為靜態,由於他們的生命週期與程式一致,那麼容器中的對象在程式結束之前將不能被釋放,從而造成記憶體泄露。

如下所示:

Vector v=new Vector(10);for(int i=0;i<10;i++){Object o=new Object();v.add(o);}

2)各種串連,例如資料庫連接、網路連接以及IO串連等。

在對資料庫進行操作的過程中,需要建立與資料庫的串連(Connection,Statement,Resultset),當不再使用時,需要調用close方法來釋放串連,只有串連關閉後,記憶體回收行程才會回收相應的對象。

3)監聽器

4)變數不合理的範圍

如果一個變數定義的作用範圍大於其使用範圍,很可能造成記憶體泄露;另一方面,如果沒有及時的把對象設定為null,也可能造成記憶體泄露的發生。

5)單例模式可能造成記憶體泄露

class BigClass{       //class body}class Singleton{private BigClass bc;private static Singleton instance =new Singleton(new BigClass());private Singleton(BigClass bc){this.bc=bc;}public Singleton getInstance(){return instance}}

 

java記憶體泄露問題

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.