標籤:標準 生命週期 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記憶體泄露問題