【发布时间】:2012-11-28 03:39:30
【问题描述】:
这是一个面试问题,但我不太确定正确答案。假设我们有一些类:
public class A {
public Object link;
public A() {
link = null;
}
}
然后我们创建两个实例:
A a1 = new A();
A a2 = new A();
a1.link = a2;
a2.link = a1;
然后我们发布引用:
a1 = null;
a2 = null;
那么问题来了:因为JVM会使用GC机制。它将如何处理这种情况?它会在运行时立即删除这两个实例,还是只是对内存空间进行签名并让它们不理会?如果我有 100 万个这样的实例形成一个循环并且没有外部引用怎么办?清理会不会让 GC 线程挂起?
【问题讨论】:
-
简短回答:不,不会。([标准] JVM 不是引用计数;它检查对象可达性 只有这样循环才不会导致问题。)
-
标准的 Java mark and sweep GC 不会有这些问题。
-
查看这个相关问题 - stackoverflow.com/questions/4891133/…
-
嗯,第二个问题实际上是在问:一次性删除 100 万个实例的过程是否会出现性能相关问题?