0

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

4 回答 4

5

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

于 2011-08-15T06:40:26.460 回答
2

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

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

于 2011-08-15T06:30:57.487 回答
1

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

于 2011-08-15T06:30:58.807 回答
0

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

于 2011-08-15T06:33:54.360 回答