如果我有课:
class node {
int i;
node other;
}
然后我在我的程序中执行以下步骤。
n1 = new node();
n2 = new node();
n1.other = n2;
n2.other = n1;
n1 = null;
n2 = null;
Java垃圾收集会释放n1和n1占用的内存吗?
答案 0 :(得分:0)
您的示例假定引用计数垃圾回收实现。 Java改为使用标记和扫描。标记和扫描从各种已知的根对象(线程实例,系统对象等)开始,并遍历对象图。访问的每个对象都标记为这样。在遍历之后,收集未标记(死亡)的对象。
在您的示例中,虽然节点相互引用,但无法从程序的任何实时部分访问它们,并且将被释放。
答案 1 :(得分:0)
作为第一个近似,只要周围有参考,对象就不是垃圾。在您的代码中,您删除了MyRecord
和n1
,但n2
类中的other
字段仍然引用了这两个对象。
如果任何集合中没有对这些对象的引用,在任何实例或静态字段中,在任何包装器类型中,JVM都会检测循环并将对象标记为垃圾