对象准备好垃圾收集,Java

来自http://java.sun.com/docs/books/performance/1st_edition/html/JPAppGC.fm.html#99740示例A3.3说,它表示即使对象可能仍然无法进行垃圾回收可能超出范围。 仅当方法被移除堆栈时,IT才可用。 现在,如果我们考虑以下情况:

void foo(){ Dog a = new Dog(); Dog b = new Dog(); b=a while(true)//loop for long time } 

引用的对象b是否可以立即用于垃圾收集,或者仅在返回foo()方法之后。

堆栈槽保持使用,直到方法退出。 没有与内部}相对应的JVM操作码,因此JVM不知道它已经超出了内部范围。 但它确实知道该方法何时返回。

只要您重新分配变量,狗以前就知道b应该有资格进行垃圾收集。

被称为ab的狗(在重新分配之后)将保留在范围内直到方法结束。

在循环开始之前,原始b (第二个Dog创建)可立即用于垃圾收集,因为没有引用它( ab引用第一个创建的Dog )。

除了已经给出的正确答案,您的测试基本上是有缺陷的。 运行空的while循环将永远不会触发GC,因为它只运行(以简化一点)当你的内存不足而Java需要对旧对象进行一些清理时。