线程作为GC根

alo*_*dzk 10 java multithreading garbage-collection gc-roots

我有一个关于GC根的问题.我读到GC的一个根源是"Live thread".那是什么意思?

我总觉得每个线程都有自己的堆栈,堆栈的局部变量是线程的GC根,现在我很困惑.什么其他类型的对象引用,不在帧堆栈或本机堆栈上进行线程表示?

另一个问题是年轻代收集使用GC根,还是仅用于主要算法?

谢谢

更新:好的抱歉,为了保持简单:我读过这篇简短的文章:yourkit.com/docs/java/help/gc_roots.jsp并且有一个"线程"选项作为GC根,这到底意味着什么线程是GC根?Thread GC root引用了哪些对象,它们的堆栈没有引用它们?为什么这两个类别不同?

Ste*_*n C 6

我读到 GC 的根源之一是“Live thread”。这意味着什么?

活动线程是已启动但尚未终止的线程。

线程表示还有哪些不在帧堆栈或本机堆栈上的其他类型的对象引用?

没有任何。

当他们说(活动)线程是 GC 根时,他们指的是(实际上)线程堆栈帧中的所有值

(“帧堆栈”和“本机堆栈”在不同的执行模式下保存本质上相同的信息;即解释与编译。在理解 GC 根时无需区分它们。)

...线程是 GC 根到底意味着什么?

这意味着线程的堆栈是GC根,并且该线程的所有堆栈帧中的所有活动变量的内容都是可达的。

这些事情实际上都在说同一件事


另一个问题是年轻代收集是否使用GC root,还是仅适用于主要算法?

(首先应该注意的是,并非所有 Java GC 都是分代的,并且我们所做的任何概括都可能因新的 GC 技术而变得不正确。)

年轻一代的收藏确实如此。它需要知道所有根中的内容,以避免删除这些根引用的对象。由于GC root可以引用年轻代中的对象,因此年轻代收集器需要使用它们。

从某种意义上说,所有收藏家都使用它们。但从另一种意义上来说,GC root 仅在某些“stop the world”收集阶段直接使用。对于那些在正常线程运行时运行的收集器/阶段,用户线程可能会修改 GC 根。GC 基础设施使用诸如写屏障之类的东西来捕获可能影响可达性的任何更改......以各种方式。