Java - 当创建类关闭时对象引用是否会被销毁?

标签 java object garbage-collection jvm

假设我有一个类,它加载一个文件,然后调用另一个方法对该文件执行某些操作。例如,计算文件中的单词数。

在 CountWords 类中,创建了许多对象/集合来获取单词数。该方法运行,找到单词数,然后将其返回给调用类。

我的问题是,当控制权返回到调用类时,CountWords 类中创建的所有对象/集合是否都会“销毁”,还是保留在内存中?如果是后者,我是否必须在退出类之前将每个对象设置为 null 以将它们标记为集合?

最佳答案

我们通常不会精确控制 Java 对象何时被销毁。它会在变得不可访问一段时间后被销毁 - 换句话说,当在任何范围内没有进一步引用它时。

如果您创建一个对象,并将对其的引用存储在另一个对象的字段中,则只要具有对该对象的引用的对象可访问,您创建的对象就继续可访问。

如果你有这样的代码

public void run() {
    Foo a = new Foo();
    System.out.println("This method is finished");
}

那么一旦 run 完成,您创建的 Foo 将无法访问,因为没有更多变量引用它。 Foo 将在一段时间后被销毁。当然,除非 Foo 的构造函数做了一些魔法,将自己注册到某个令人讨厌的 static 数据存储中。

因此,一般来说,您不需要将引用设置为 null 来销毁对象。从垃圾收集器的角度来看,让这些引用超出范围就和将它们设置为 null 一样好。

关于Java - 当创建类关闭时对象引用是否会被销毁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47293404/

相关文章:

java - 在 Android 应用程序中实现静音按钮的简单方法

c# - 为什么在这种情况下使用泛型?

java - 如何在 findElement(By.xpath ("//span[contains(text(),' string')]")) 中使用表达式

java - Java 中的字符串比较和字符串驻留

javascript - 如何获取 "uniqueify"一个 JavaScript 对象数组?

java - 在 Java 中强制释放大型缓存对象

c# - 循环引用对象的垃圾回收

java - Java 中的 map 大小不正确。如果我将 Key 和 Value 包装在 WeakReference 中,然后添加到 HashMap 中,打印的大小与预期不同

java - 在抽象方法的签名中省略对象类型

python - 当我们导入一个模块时,我们是否只是让主模块可以访问导入模块的命名空间?