【发布时间】:2014-10-07 09:24:23
【问题描述】:
我有一个关于 GC 根的问题。我读到 GC 的根源之一是“实时线程”。这意味着什么?
我一直觉得每个线程都有自己的堆栈,堆栈的局部变量是线程的 GC 根,现在我很困惑。线程表示还有哪些其他类型的对象引用,它们不在帧堆栈或本机堆栈上?
另一个问题是年轻代收集是使用 GC 根,还是仅用于主要算法?
谢谢
更新: 好的,抱歉,为了简单起见:我已经阅读了这篇简短的文章:yourkit.com/docs/java/help/gc_roots.jsp,并且有一个“线程”选项作为 GC 根,这究竟意味着线程是GC 根?什么样的对象被 Thread GC root 引用,而不被它的栈引用?为什么这两个类别不同?
【问题讨论】:
-
您的问题令人困惑。 1)当然只有活线程才算 GC 根。 2)什么是“线程表示”? 3) 静态变量是非堆栈 GC 根。 4) 每个 GC 变体都会考虑 GC 根;不可能不将它们考虑在内。
-
好吧,抱歉,为了简单起见:我读过这篇短文:yourkit.com/docs/java/help/gc_roots.jsp 并且有一个“线程”选项作为 GC 根,这究竟意味着线程是 GC 根? Thread GC root 引用了哪些类型的对象,而它的堆栈没有引用这些对象?为什么这两个类别不同?
-
@MarkoTopolnik 我不认为静态变量是根,否则类加载器永远不会卸载。
-
@alobodzk 您最好将您的评论编辑到问题中,因为它是关键信息。
-
我的猜测:对应于活动线程的
Thread实例是一个 GC 根,即使堆栈或静态变量中没有对它的引用。
标签: java multithreading garbage-collection gc-roots