这会被Java垃圾收集释放吗?

时间:2015-08-14 14:27:08

标签: java garbage-collection

如果我有课:

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占用的内存吗?

2 个答案:

答案 0 :(得分:0)

您的示例假定引用计数垃圾回收实现。 Java改为使用标记和扫描。标记和扫描从各种已知的根对象(线程实例,系统对象等)开始,并遍历对象图。访问的每个对象都标记为这样。在遍历之后,收集未标记(死亡)的对象。

在您的示例中,虽然节点相互引用,但无法从程序的任何实时部分访问它们,并且将被释放。

答案 1 :(得分:0)

作为第一个近似,只要周围有参考,对象就不是垃圾。在您的代码中,您删除了MyRecordn1,但n2类中的other字段仍然引用了这两个对象。

如果任何集合中没有对这些对象的引用,在任何实例或静态字段中,在任何包装器类型中,JVM都会检测循环并将对象标记为垃圾