Java 作为GC根的线程

Java 作为GC根的线程,java,multithreading,garbage-collection,gc-roots,Java,Multithreading,Garbage Collection,Gc Roots,我有一个关于GC根的问题。我读到其中一个GC根是“活动线程”。这是什么意思 我一直认为每个线程都有自己的堆栈,而堆栈的局部变量是线程的GC根,现在我感到困惑。线程表示还有哪些不在框架堆栈或本机堆栈上的其他类型的对象引用 另一个问题是,年轻一代的集合是使用GC根,还是只用于主要算法 谢谢 更新: 好的,对不起,为了简单起见:我读了这篇短文:yourkit.com/docs/java/help/gc_roots.jsp,有一个“Thread”选项作为gc root,这到底意味着Thread是gc r

我有一个关于GC根的问题。我读到其中一个GC根是“活动线程”。这是什么意思

我一直认为每个线程都有自己的堆栈,而堆栈的局部变量是线程的GC根,现在我感到困惑。线程表示还有哪些不在框架堆栈或本机堆栈上的其他类型的对象引用

另一个问题是,年轻一代的集合是使用GC根,还是只用于主要算法

谢谢

更新:
好的,对不起,为了简单起见:我读了这篇短文:yourkit.com/docs/java/help/gc_roots.jsp,有一个“Thread”选项作为gc root,这到底意味着Thread是gc root吗?什么类型的对象由线程GC根引用,而不是由其堆栈引用?为什么这两个类别不同?

想象一个方法有一个java线程对象local new'ed,当该方法退出时,该对象就消失了(引用超出范围,任何堆分配的内存都符合GC的条件)。如果使用相同的方法启动线程,那么现在该线程对象及其引用的任何对象的生存时间也与活动\运行线程的生存时间相关联。在线程退出之前,仍然从运行线程引用的任何内存都不符合GC的条件,并且该线程被称为GC根

线程可以通过堆栈或堆以两种不同的方式分配内存。当前堆栈帧展开时,堆栈存储不是GC存储,而是回收。堆存储通常是在代码中使用“new”时分配的(注意new并不总是意味着堆存储,请参阅转义分析)。堆是GC'ed的

了解更多GC根的一个好方法是获取正在运行的java应用程序的堆转储并将其加载到VisualVM或EclipseMat中,从那里您应该能够检查GC根


年轻一代收集将使用GC根,因为具有GC根的对象不符合GC条件,但最好根据给定的算法进行讨论。

JVM对其线程进行分区,有些专门用于垃圾收集,有些用于其他内部JVM任务,有些执行用户提供的可执行文件部分

在此上下文中,reachable意味着用户执行线程可以访问。这包括绑定从
publicstaticvoidmain(String[]args)
运行的第一个线程,以及从该线程启动的所有线程,减去无法访问或完成的线程

我读到其中一个GC根是“活动线程”。这是什么意思

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

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

没有

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

(框架堆栈和本机堆栈是相同的。)

。。。这到底意味着线程是GC根吗

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


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

你的问题令人困惑。1) 当然,只有活动线程才算GC根。2) 什么是“线程表示”?3) 静态变量是非堆栈GC根。4) 每个GC变体都考虑了GC根;不考虑它们是不可能的。好吧,对不起,简单一点:我读了这篇短文:有一个“线程”选项作为GC根,这到底意味着线程是GC根吗?什么类型的对象由线程GC根引用,而不是由它的堆栈引用?为什么这两个类别不同?@MarkoTopolnik我不认为静态变量是根,否则类加载器将永远不会卸载。@alobodzk你最好将你的注释编辑到问题中,因为它是关键信息。我猜:与活动线程对应的
线程
实例是GC根,即使在堆栈或静态变量中没有对它的引用。谢谢澄清!我怀疑yourkit的分类是武断的。它们肯定有这些区别。帧堆栈用于解释代码,本机堆栈由解释器本身和JIT编译的代码使用。@MarkoTopolnik-如果您查看本文链接的页面,它根本没有提到“本机堆栈”。分类不是你的…也许是误会。。。我心目中的区别是YourKit中单独的“活动线程”类别。关于stacks的评论与此无关(OP提到了这两个)。这两个不是通过你的装备来区分的,我想很难区分它们。