类的 Java 内存泄漏

标签 java memory-leaks multi-layer

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

public class Tree{

     private Bird[] birds;

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

}

我持有一个对 Tree 的类引用,如下所示:

Tree myTree = new Tree();

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

myTree = null;

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

Tree.java 中:

public void deleteBirds{
     birds = null;
}

最佳答案

Will all the 100 allocated Birds be taken care of WITH the tree class by the garbage collector?

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

但是,基本答案是"is"——如果您没有任何其他对象引用该数组,并且没有其他对象引用您可能在其他地方创建的任何 Bird 对象,那么垃圾收集器会处理它们。您几乎可以肯定不应该编写任何类型的“删除”方法。

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

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

关于类的 Java 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23195035/

相关文章:

c# - 追踪 .NET Windows 服务内存泄漏

grails - 将一个grails项目中的域对象用作其他grails项目中的依赖项

python - Pymnet - 创建多层网络可视化

java - X509证书的 DN : any parser available in some commonly used lib?

java - 如果我使用自己的 key ,为什么需要散列?

尝试删除指针链表的第一个元素时发生 C++ 内存泄漏

c++ - C++开发中使用Valgrind?

java - Java中的多层哈希

java - 如何使用 Streams 和 Lambda Java8 将 List<Object[]> 转换为 Map<String,BigInteger>

java - 创建执行功能的按钮