我想知道下面这段代码是否是内存泄漏,因为谷歌只是出现了奇怪的例子。基本上,如果我有一个班级Tree
:
public class Tree{
private Bird[] birds;
public Tree(){
birds = new Bird[100];
}
}
我持有Tree
的类引用,如下所示:
Tree myTree = new Tree();
然后不久我将该引用设置为null
:
myTree = null;
垃圾收集器是否会使用树类处理所有100个已分配的Bird?或者我需要delete()
方法吗?我知道Java没有析构函数,但这个多层类示例仍让我感到困惑:
在Tree.java
内:
public void deleteBirds{
birds = null;
}
答案 0 :(得分:6)
垃圾收集器是否会在树类中处理所有100个已分配的Bird?
好吧,您的代码实际上并没有创建Bird
的任何实例。它只是创建一个数组,该数组的每个元素都将以null
开头。
然而,基本答案是“是” - 如果你没有其他任何东西都有对数组的引用,并且没有别的东西引用你可能在其他地方创建的任何Bird
对象,那么垃圾收集器会照顾他们。你几乎肯定不应该编写任何类型的“删除”方法。
你可能不需要你的myTree = null;
语句......如果它是一个超出范围的局部变量,或者一个对象中的实例变量,无论如何都有资格进行垃圾收集,那么它就是没有意义的。
相对较新的Java程序员可能需要一段时间才能学会信任垃圾收集器,并放开控制......但是一旦你这样做,你的代码就会简单得多:)