- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
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/
我正在使用 react-native-elements ListItem.Accordion因为我的 React Native 中的所有其他内容 SectionList使用 ListItem s(并且
我是一名优秀的程序员,十分优秀!