线程作为GC根

时间:2014-10-07 09:24:23

标签: 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引用了哪些对象,它们的堆栈没有引用它们?为什么这两个类别不同?

3 个答案:

答案 0 :(得分:3)

  

我读到GC根源之一是" Live thread"。那是什么意思?

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

  

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

无。

当他们说某个(实时)线程是GC根时,它们意味着(实际上)所有线程的堆栈帧中的值。

("框架堆栈"以及"本机堆栈"是相同的。)

  

......究竟是什么意味着该线程是GC根?

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

这些都是有效的说法

答案 1 :(得分:0)

想象一个带有java线程对象本地new的方法,当方法退出对象时消失(引用超出范围,任何堆分配的内存都符合GC的条件)。如果在相同的方法中启动线程,那么现在该线程对象的实时时间及其引用的任何内容也与live \ running线程的生命周期相关联。在线程退出之前,仍然从正在运行的线程引用的任何内存都不符合GC的条件,并且该线程称为GC根。

线程可以通过堆栈或堆以两种不同的方式分配内存。堆栈存储不是GC,而是在当前堆栈帧展开时回收。堆存储通常在您使用' new'在你的代码中(注意new并不总是意味着堆存储请参见Escape Analysis)。堆是GC&#39。编辑。

了解GC根的更多信息的一个好方法是对正在运行的java应用程序进行堆转储并将其加载到Visual VM或Eclipse MAT中,从那里你应该能够检查GC根。

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

答案 2 :(得分:0)

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

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