线程作为GC根
我有一个关于GC根源的问题。 我读到GC的根源是“Live thread”。 那是什么意思? 我总是有印象,每个线程都有自己的堆栈,堆栈的局部变量是线程的GC根,现在我很困惑。 线程表示具有哪些其他类型的对象引用,它们不在帧堆栈或本地堆栈上?
其他问题是年轻一代收集使用GC根源,还是仅用于主要算法?
谢谢
更新:好的抱歉,为了保持简单:我读过这篇简短的文章:yourkit.com/docs/java/help/gc_roots.jsp,并且有一个“Thread”选项作为GC根,究竟是什么意思?是GC根? 什么样的对象被Thread GC根引用,它没有被堆栈引用? 为什么这两个类别不同?
我读到GC根源之一是“实时线程”。 那是什么意思?
活动线程是一个已启动并且尚未终止的线程。
线程表示具有哪些其他类型的对象引用,它们不在帧堆栈或本地堆栈上?
没有。
当他们说一个(活)线程是一个GC根,他们的意思是(实际上)所有线程的堆栈帧的值。
(“帧堆栈”和“本地堆栈”是一回事。)
......这究竟意味着该线程是否是GC根?
这意味着线程的堆栈是一个GC根,并且所有线程的堆栈帧中所有活动变量的内容都是可访问的。
这些东西都是有效地说同样的事情。
想象一下,当方法退出对象消失时(引用超出范围并且任何堆分配了符合GC的内存)时,将使用java线程对象local new'ed的方法。 如果使用相同的方法启动线程,则现在该线程对象的实时时间以及它引用的任何内容都与活动线程的运行时间相关联。 在线程退出之前,仍然从正在运行的线程引用的内存不符合GC的要求,并且该线程被称为GC根目录。
线程可以通过堆栈或堆以两种不同的方式分配内存。 堆栈存储不是GC'ed,但在当前堆栈帧解开时回收。 当您在代码中使用“新”时,堆存储通常会被分配(请注意,新并不总意味着堆存储参见“转义分析”)。 堆是GC'ed。
了解更多关于GC根的一个好方法是将正在运行的Java应用程序的堆转储并加载到Visual VM或Eclipse MAT中,从那里您应该能够检查GC根。
年轻一代收集将使用GC根源,GC根不符合GC的条件,但根据给定的算法进行谈话会更好。
JVM分割其线程,其中一些专门用于垃圾收集,一些用于其他内部JVM任务,一些用于执行用户提供的可执行文件部分。
在这种情况下,可达意味着用户执行线程可以访问。 这包括绑定从public static void main(String[] args)
运行的第一个线程和从该线程启动的所有线程,减去那些无法访问或完成的线程。
上一篇: Thread as a GC root