什么触发了Java垃圾收集器

我对Java中的垃圾收集工作方式有点困惑。

当没有更多的实时引用时,我得到一个对象有资格进行垃圾收集,但是如果它引用了活动对象呢?

假设我有一组节点再次引用更多节点

List 1 -> Node a -> Node b 2 -> Node c -> Node d 3 -> Node d -> Node c 4 -> Node e 5 

现在,如果我删除列表,节点cd和e应该是垃圾收集。 节点e没有更多的引用,节点c和d具有循环引用。

但是Node a怎么样? 它会被垃圾收集吗?

无论节点b是否有外部实时引用,它会有所不同吗? 假设节点b是否有来自不同位置的引用,是否会使节点停留在内存中?

有一组根引用(当前局部变量,静态引用,堆栈帧的操作数堆栈),它们被认为是实时的。 从此根组引用无法访问的任何内容都符合垃圾回收的条件。

节点a没有任何指向它的引用。 因此即使它指的是活动对象,它也有资格获得gc。 由于节点b具有实时引用,因此它不会获得gc’ed。

如果节点B有任何其他引用,则对节点A的垃圾收集无关紧要。 如果节点A没有引用它,它将被垃圾收集。 节点B将保留,因为它仍然有实时参考。

基本上,将收集没有对其进行实时引用的每个对象。 这些对象中包含的任何对象都将受到相同的机制,如果没有其他对它们的引用,它们也将被垃圾收集。 如果存在来自其他对象的实时引用,它们将保留。

GC知道哪些对象是活动的,因为它将所有活动对象复制到新的存储区域,并且下次未覆盖所有未复制的对象。

请注意,这对Oracle VM中GC的当前实现有效。 其他虚拟机可以用另一种方式处理它。