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

这会被Java垃圾收集释放吗?,java,garbage-collection,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; n1和n1占用的内存是否会被Java垃圾收集释放?您的示例假设使用引用计数垃圾收集实现。Java使用标记和扫描。标记和扫描从各种已知的根对象(线程实例、系统对象等)开始,并遍历对象图。每个访问的

如果我有课:

class node {
    int i; 
    node other;
}
然后在我的程序中执行以下步骤

n1 = new node();
n2 = new node();
n1.other = n2;
n2.other = n1;
n1 = null;
n2 = null;

n1和n1占用的内存是否会被Java垃圾收集释放?

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


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

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


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

作为第一近似值,只要周围有引用,对象就不是垃圾。在代码中,您将
n1
n2
设为空,但
节点
类中仍有
其他
字段引用这两个对象


如果在任何集合、任何实例或静态字段、任何包装器类型中没有对这些对象的更多引用,JVM将检测循环并将这些对象标记为垃圾,作为第一近似值,只要周围有引用,对象就不是垃圾。在代码中,您将
n1
n2
设为空,但
节点
类中仍有
其他
字段引用这两个对象


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

为什么您认为会这样?为什么你认为不会?为什么你认为会?你为什么认为不会呢?