什么触发了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化。


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

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


GC知道哪些对象处于活动状态,因为它将所有活动对象复制到新的内存区域,并且下次所有未复制的对象都将被覆盖。

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

链接地址: http://www.djcxy.com/p/19885.html

上一篇: What triggers the java Garbage Collector

下一篇: C# Garbage Collection Active Roots