java – GC会走多远
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最终将删除任何正在运行的代码或任何未来可用代码无法访问的任何对象”一样简单.因此,如果创建的对象不可用,或者永远不可用,在任何正在运行的代码中,它最终会成为GC的受害者,即使它被嵌套并让C程序员害怕? 解决方法
不,你不需要调用myClass.clear().当无法通过实时引用到达对象时,它将有资格进行垃圾回收.这并不意味着它会被立即收集,但它将有资格收集.
为了垃圾收集,很少将引用设置为null – 这会损害代码的可读性.当然也有例外 – 例如,ArrayList< T>将不再需要的时候将其内部缓冲区的元素设置为null,以避免意外地阻止对象被垃圾收集 – 但通常只要对象本身是必需的,对象内的字段就是有效且有用的.简而言之,我几乎从不编写类似MyClass.clear()的方法,更不用说调用它了. 将局部变量设置为null也很少值得.您在MyMain中的代码不清楚,因为它在方法之外无效…如果您将所有代码都放在方法中,那么您也不需要将myClass设置为null.当方法完成时,变量将不再作为它所引用的对象的GC根目录 – 当然,如果存在其他GC根,则该对象仍然不符合垃圾收集的条件.但是,在方法结束时将局部变量设置为null是没有意义的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |