Java垃圾收集器是否会回收包含对其他对象的引用的非引用对象

Ens*_*der 1 java garbage-collection list

当我学习LinkedList数据结构时,会出现这个问题.假设每个链接(或节点)由一个对象表示,该对象包含两个字段,数据一个链接的下一个点.如果我想删除一个特定节点,显然我将更新前一个Link的下一个字段.但是我应该将删除的链接的下一个字段设置为null,以确保它将被垃圾收集器回收吗?

如果我的描述不清楚,我会尝试概括(或简化)我的问题.假设类A的对象a1具有一个字段,该字段引用同一类的另一个对象a2.如果没有对象a1的引用,它是否有资格获得垃圾收集器?或者我们必须将a1中的引用字段显式设置为null?(不关心对象a2,除了a1中的引用字段之外还有其他引用).

pop*_*shi 5

垃圾收集器理想地收集程序流无法访问的所有对象.即使此对象引用了JVM中的所有内容.
如果程序的所有正在运行的线程都不包含对它的任何直接间接引用,则对象变得无法访问.
直接引用如下所示:

void main(String... args){
  Object a = new Object(); // <- from here main thread of program 
                           //    has reference to object `a`
  ...
}
Run Code Online (Sandbox Code Playgroud)

间接引用如下所示:

void main(String... args){
   List b = new ArrayList();
   b.add(new Object()); // <- here you can't access object by typing `a`
   // as in previous example, but you can get access with `b.get(0);`
   // so that object can be accessed indirectly -> it is reachable.
}
Run Code Online (Sandbox Code Playgroud)

它还处理大型对象的大量情况,这些对象具有相互引用,但不再能从程序流中访问它们.

MyClass a = new MyClass();
MyClass b = new MyClass();
a.field = b;
b.field = a;
// at this point a and b are reachable so they cannot be collected
b = null;
// at this point b's object is reachable indirectly through `a.field`
// so neither a nor b can be collected
a = null;
// at this point you cannot reach neither a nor b
// so a and b can be garbage collected, 
// despite the fact that a is referenced by b and vice versa
Run Code Online (Sandbox Code Playgroud)

UPD:添加了示例,更改了一些单词以使答案更清晰.