Java 华侨华人华侨华人华侨华人华侨华人华侨华人华侨华人华侨华人华侨华人华侨华人华侨华人华侨华人华侨华人华侨华人华侨华人华侨华人华侨华人华侨华人华侨华人华侨华人

Java 华侨华人华侨华人华侨华人华侨华人华侨华人华侨华人华侨华人华侨华人华侨华人华侨华人华侨华人华侨华人华侨华人华侨华人华侨华人华侨华人华侨华人华侨华人华侨华人,java,garbage-collection,Java,Garbage Collection,鉴于: 调用doSomething方法时,在第5行中创建的对象位于哪一行之后 可以进行垃圾收集吗 我认为答案应该在第7行之后。bt答案在第8行之后。请说明我错在哪里。只有当对象变得无法访问时,才能对其进行垃圾收集。在第7行之后的代码中。您仍然可以访问(到达)第5行上创建的对象。通过this.o字段 第8行之后this.o==null因此在第5行创建了对象。变得遥不可及 可达性规则: 第5行中的对象o是方法doSomething()的局部变量 在执行第8行之后,它将成为孤立的 因为本地和全局引

鉴于:

调用doSomething方法时,在第5行中创建的对象位于哪一行之后 可以进行垃圾收集吗


我认为答案应该在第7行之后。bt答案在第8行之后。请说明我错在哪里。

只有当对象变得无法访问时,才能对其进行垃圾收集。在第7行之后的代码中。您仍然可以访问(到达)第5行上创建的对象。通过
this.o
字段

第8行之后
this.o==null
因此在第5行创建了对象。变得遥不可及

可达性规则:


第5行中的对象o是方法
doSomething()
的局部变量

在执行第8行之后,它将成为孤立的

因为本地和全局引用将不再引用对象

编辑:

虽然现在已经很晚了,但我希望有一天它能帮助别人

您可以通过使用我正在开发的名为的库来接收此类事件。它在对象孤立时以及在对象的实际垃圾收集之后提供事件


欢迎对库中的任何改进建议。

对于对象,对GC可用并不能确保立即对对象进行GC。这实际上取决于GC的实现

因为您谈论的是Java,所以它还取决于正在运行的程序的状态。程序可以被解释,也可以被JIT'ed


如果正在对它进行解释,我认为当您将它设置为null时,它将在第8行对GC可用。如果它是JIT'ed,它可以(逻辑上)在第7行被垃圾收集,因为新创建的对象将不会被使用。

请删除数字并格式化代码。此链接将帮助您。实际上,我的疑问是-在方法doSomething中,局部变量o当前正在存储它在第5行中创建的对象的地址。现在在第7行中,我们在第5行中创建的同一参考变量正在存储同一对象的地址,或者它正在第7行中存储某个新创建对象的地址?如果它没有在第5行中存储同一对象的地址,那么现在没有任何引用变量在第5行中具有该对象的地址,因此它准备在第7行之后进行垃圾收集?请告诉我哪里错了?@user2789395您是对的,局部变量
o
在第7行之后不再存储对对象的引用。但是方法
doSomethingElse
存储您在字段
o
中传递的任何内容(注意这不是局部变量
o
)。因此,在第7行之后,变量仍然存储在
这个.o
字段中。@user2789395很高兴能提供帮助!我无法发布que…我该怎么办?它要求格式化que,我已经格式化了,但仍然是一样的。请帮助。我应该如何发布que。我迫切需要解释que。。
public class GC {
    private Object o;
    private void doSomethingElse(Object obj) { o = obj; }
    public void doSomething() {
        Object o = new Object(); // line 5
        doSomethingElse(o);
        o = new Object(); // line 7
        doSomethingElse(null);
        o = null;
    }
}