2014-04-21 139 views
1

我想知道如果下面的一段代碼是內存泄漏,因爲谷歌只是變得奇怪的例子。基本上,如果我有一個類TreeJava內存泄漏與類

public class Tree{ 

    private Bird[] birds; 

    public Tree(){ 
      birds = new Bird[100]; 
    } 

} 

和我抱着類參照Tree這樣的:

Tree myTree = new Tree(); 

,然後不久之後我設置參考null

myTree = null; 

是否所有100個分配的鳥類都被垃圾列的樹類照顧講師?或者我需要一個delete()方法?我知道Java沒有析構函數,但仍這種多層級的例子讓我困惑:

Tree.java

public void deleteBirds{ 
    birds = null; 
} 

回答

6

將所有的100種鳥類分配所用之樹類的照顧垃圾收集器?

那麼,你的代碼實際上並沒有創建Bird的任何實例。它只是創建一個數組,並且該數組的每個元素將以null開頭。

但是,基本答案是「是」 - 如果您沒有其他人對數組有任何引用,並且沒有其他人可以引用您可能在別處創建的任何Bird對象,則垃圾收集器將會照顧其中。你幾乎可以肯定不應該寫任何一種「刪除」的方法。

你可能不需要你的myTree = null;語句......如果它是一個局部變量超出範圍,或者一個對象中的實例變量無論如何都有資格進行垃圾回收,那麼它就毫無意義。

它可能需要一段時間相對較新的Java程序員學會信任垃圾收集器,讓控制的去...但一旦你這樣做,你的代碼就會簡單得多:)

+0

沒錯這就是當你從C++出來時有時難以信任垃圾收集器。謝謝! – sgtHale