对象准备好垃圾收集,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
应该有资格进行垃圾收集。
被称为a
和b
的狗(在重新分配之后)将保留在范围内直到方法结束。
在循环开始之前,原始b
(第二个Dog
创建)可立即用于垃圾收集,因为没有引用它( a
和b
引用第一个创建的Dog
)。
除了已经给出的正确答案,您的测试基本上是有缺陷的。 运行空的while
循环将永远不会触发GC,因为它只运行(以简化一点)当你的内存不足而Java需要对旧对象进行一些清理时。