Java内存泄漏了类

sgt*_*ale 1 java memory-leaks multi-layer

我想知道下面这段代码是否是内存泄漏,因为谷歌只是出现了奇怪的例子.基本上,如果我有一个班级Tree:

public class Tree{

     private Bird[] birds;

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

}
Run Code Online (Sandbox Code Playgroud)

我持有Tree类似这样的类引用:

Tree myTree = new Tree();
Run Code Online (Sandbox Code Playgroud)

然后不久我将该引用设置为null:

myTree = null;
Run Code Online (Sandbox Code Playgroud)

垃圾收集器是否会将所有100个已分配的鸟类与树类一起处理?或者我需要一个delete()方法?我知道Java没有析构函数,但这个多层类示例仍然让我困惑:

里面Tree.java:

public void deleteBirds{
     birds = null;
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 6

垃圾收集器是否会将所有100个已分配的鸟类与树类一起处理?

好吧,你的代码实际上并没有创建任何实例Bird.它只是创建一个数组,该数组的每个元素都将null从头开始.

但是,基本答案是"是" - 如果你没有其他任何东西都有对数组的引用,并且其他任何东西都没有引用Bird你可能在其他地方创建的任何对象,那么垃圾收集器将处理它们.你几乎肯定不应该写任何一种"删除"方法.

你可能不需要你的myTree = null;语句......如果它是一个超出范围的局部变量,或者一个对象中的实例变量无论如何都有资格进行垃圾收集,那么它就没有意义了.

相对较新的Java程序员可能需要一段时间才能学会信任垃圾收集器,并放开控制......但是一旦你这样做,你的代码就会简单得多:)