我有关于GC根的问题。我读到GC的一个根源是" Live thread"。那是什么意思?
我总觉得每个线程都有自己的堆栈,堆栈的局部变量是线程的GC根,现在我很困惑。什么其他类型的对象引用,不在帧堆栈或本机堆栈上的线程表示?
另一个问题是年轻代收集是使用GC根,还是仅适用于主要算法?
由于
更新: 对不起,为了简单起见:我已经阅读了这篇简短的文章:yourkit.com/docs/java/help/gc_roots.jsp,并且有一个"线程"选项作为GC根,这究竟是什么意味着该线程是GC根? Thread GC root引用了哪些对象,它们的堆栈没有引用它们?为什么这两个类别不同?
答案 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)
运行的第一个线程以及从该线程启动的所有线程,减去无法访问或完成的线程。