什么触发了Java垃圾收集器

时间:2013-01-11 13:03:13

标签: java garbage-collection jvm

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

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

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

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

现在如果删除列表,节点c d和e应该被垃圾收集。节点e没有对它的引用,节点c和d具有循环引用。

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

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

3 个答案:

答案 0 :(得分:4)

有一组根引用(当前局部变量,静态引用,堆栈帧的操作数堆栈),它们被认为是实时的。从这个根参考集无法访问的任何内容都有资格进行垃圾回收。

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

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

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