来自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()方法之后。
答案 0 :(得分:4)
堆栈槽保持使用,直到方法退出。没有与内部}相对应的JVM操作码,因此JVM不知道它已经超出了内部范围。但它确实知道该方法何时返回。
答案 1 :(得分:2)
一旦你重新分配变量,狗以前就知道b
应该有资格进行垃圾收集。
被称为a
和b
的狗(在重新分配之后)将保留在范围内直到方法结束。
答案 2 :(得分:1)
原始的b
(第二个Dog
创建的)在循环开始之前立即可用于垃圾收集,因为没有引用它(a
和{{1引用第一个 b
创建的。)
答案 3 :(得分:0)
除了已经给出的正确答案外,您的测试基本上是有缺陷的。运行空while
循环将永远不会触发GC,因为它只在内存不足时运行(以简化一点)并且Java需要对旧对象进行一些清理。