对象准备好垃圾收集,Java

时间:2011-08-15 06:27:32

标签: java garbage

来自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()方法之后。

4 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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