关于Java中垃圾收集的问题

cap*_*oop 8 java garbage-collection

假设我有一个双重链表.我这样创建它:

MyList list = new MyList();
Run Code Online (Sandbox Code Playgroud)

然后我添加一些节点,使用它然后决定扔掉这样的旧列表:

list = new MyList();
Run Code Online (Sandbox Code Playgroud)

由于我刚刚创建了一个新列表,旧内存区域内的节点仍然指向彼此.这是否意味着旧节点的区域不会被垃圾收集?我是否需要将每个节点指向null以便它们是GC?

Jon*_*eet 12

不,你没有.Java GC处理循环引用就好了.

从概念上讲,每次GC运行时,它都会查看系统中的所有"实时"根引用:

  • 每个堆栈帧中的局部变量
  • "this"引用每个实例方法堆栈帧
  • 实际上,所有静态变量(事实上它们实际上是由Class对象引用的,而这些对象又由ClassLoaders 引用,但暂时忽略它们.)

使用那些"已知的实时"对象,它会检查其中的字段,并添加到列表中.它会递归到那些引用的对象,依此类推,直到找到系统中的每个活动对象.然后,它的垃圾收集,这一切都还没有被认为是活的.

您的循环引用节点彼此引用,但没有活动对象引用它们,因此它们有资格进行垃圾回收.

请注意,这是一个严重的是如何垃圾收集简化概述概念作品.实际上,它们非常复杂,具有代,压缩,并发问题等.