gpt4 book ai didi

java - GC能走多远

转载 作者:搜寻专家 更新时间:2023-11-01 03:57:57 25 4
gpt4 key购买 nike

Java GC 能走多远?假设我有这段代码:

public class MyClass {
private Object myObject = new Object();
public void clear() {
myObject = null;
}
}

public class MyMain {
...
MyClass myClass = new MyClass();
...
myClass.clear();
myClass = null;
}

我是否需要在将 myClass 设置为 null 之前调用 myClass.clear() 以确保 GC 将删除 myClass 中的 myObject?或者是否足以将 myClass 设置为 null 并且 GC 将删除所有嵌套对象?

也许我有点偏执,答案很简单,就像“GC 最终会删除任何正在运行的代码或任何 future 可用代码无法访问的对象”。因此,如果一个创建的对象在任何运行的代码中不可用,或者永远不可用,即使它是嵌套的,它最终也会成为 GC 的受害者,让 C++ 程序员感到害怕?

最佳答案

不,您不需要调用 myClass.clear() .当无法通过实时引用访问对象时,它将有资格进行垃圾收集。这并不意味着它会立即被收集,但它将符合收集条件。

非常为了垃圾回收而将引用设置为 null 很少是合适的 - 这样做会损害代码的可读性。当然也有异常(exception)——例如 ArrayList<T>将其内部缓冲区的一个元素设置为 null当不再需要它时,为了避免意外地阻止对象被垃圾收集 - 但通常只要对象本身是必需的,对象中的字段就有效且有用。简而言之,我几乎永远不会MyClass.clear()这样的方法。 , 更不用说调用它了。

也不值得将局部变量设置为 null。您在 MyMain 中的代码不清楚,因为它在方法之外无效...如果您的意思是 所有 代码都在方法中,那么您不需要设置 myClass也为空。当该方法结束时,该变量将不再作为它引用的对象的 GC 根 - 当然,如果 其他 GC 根存在,该对象仍然没有资格进行垃圾收集.但是,在方法结束时将局部变量设置为 null 是没有意义的。

关于java - GC能走多远,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4249410/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com