Java 垃圾收集-空引用和引用新对象

Java 垃圾收集-空引用和引用新对象,java,scjp,Java,Scjp,我想了解在第1行中创建的对象何时将被垃圾收集…我假设它在第3行,但我不认为这是我的答案中的一个选项-第4行和第5行是答案的一部分 class MyObject{ public void myMethod(){ System.out.println("Mymethod"); } } public class Test { public static void main(String[] args) { MyObject m = new

我想了解在第1行中创建的对象何时将被垃圾收集…我假设它在第3行,但我不认为这是我的答案中的一个选项-第4行和第5行是答案的一部分

class MyObject{
    public void myMethod(){
        System.out.println("Mymethod");
    }
}


public class Test {

    public static void main(String[] args) {
        MyObject m = new MyObject(); //line1
        m.myMethod();//line2
        m = null;//line3
        m = new MyObject();//line4
        m.myMethod();//line5
    }

}

如果您将引用设置为null,这并不意味着垃圾收集器将启动并为其清理内存

当JVM垃圾收集器启动时,只有合格/标记的对象才会被垃圾收集。垃圾收集器检查所有符合垃圾收集条件的对象,即未从任何位置引用的对象


JVM使用一个称为标记的过程来标记要进行垃圾收集的对象。当GB启动时,它将简单地删除标记的对象。

正确的答案是,无法确定在第1行创建的对象何时将被垃圾收集。您可以肯定地说,它有资格在第3行进行垃圾收集。它可以在第3行之后被垃圾收集,但我们不能说它会被垃圾收集。

你说得对。答案应该是第3行。注意:在第3行之后有资格获得GC,所以第4行可能是答案。它可能永远不会被清理。引用可以准备好进行垃圾收集,但无法确定具体时间。它有资格在赋值为null后被收集。在那之后,没有对它的实时引用。那么它是否真的被收集是由实现定义的。所有这些答案都表明,在第3行之后,当它有资格被收集时,这是我们所知道的最佳答案。所有这些答案都假设myMethod不会导致对m的引用被存储在其他地方。