2014-04-21 235 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