如果没有引用变量,java GC 如何工作?

wz3*_*366 4 java garbage-collection

我知道如果指向对象的引用变量手动设置为 null 或设置为指向另一个对象,java GC 可以销毁堆上的对象:

TestObject test = new TestObject();
test.dosomething();
test = null;
Run Code Online (Sandbox Code Playgroud)

我的问题是,如果我在创建对象时没有给它一个名称(引用变量),那么在我使用完对象后如何释放该对象占用的内存:

(new TestObject()).dosomething();
Run Code Online (Sandbox Code Playgroud)

在程序结束之前,这个对象会永远存在于堆上吗?

Ada*_*old 5

在创建对象new并对其调用方法后dosomething(),就没有剩余的引用,因此它可以进行垃圾回收。

即使您创建了两个通过引用相互指向的对象,并且它们不再与根引用建立连接,它们也将符合 gc 的条件(jvm 可以在没有根连接的情况下检测到此循环引用)。

因此,要回答你的问题:没有,在你的第二个例子中的物体将是GC-ED之后您调用dosomething就可以了。

请注意:在实践中,您不需要null引用(我实际上几乎从不这样做),如果您将它们保留在本地范围内就足够了,因此当您离开时,本地变量会被清除。