java - 线程作为 GC 根

标签 java multithreading garbage-collection gc-roots

我有一个关于 GC 根的问题。我读到 GC 根之一是“Live thread”。那是什么意思?

我一直觉得每个线程都有自己的堆栈,堆栈的局部变量是线程的 GC 根,现在我很困惑。线程表示还有哪些不在帧堆栈或 native 堆栈上的其他类型的对象引用?

另一个问题是新生代收集是使用 GC 根,还是仅用于主要算法?

谢谢

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

最佳答案

I read that one of GC roots is "Live thread". What does that mean?

Activity 线程是已经启动但尚未终止的线程。

What other types of object references, which are not on frame stack or native stack does thread representation have?

没有。

当他们说( Activity 的)线程是 GC 根时,他们指的是(实际上)线程栈帧中的所有值。

(“帧堆栈”和“ native 堆栈”在不同的执行模式下持有基本相同的信息;即解释与编译。在理解 GC 根时无需区分它们。)

... what exactly does that mean that thread is a GC root?

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

这些东西都在有效地表达同一件事


Another question is does young generation collection use GC roots, or it's only for major algorithms?

(首先应该注意的是,并非所有 Java GC 都是分代的,并且我们所做的任何概括都可能被新的 GC 技术渲染为不正确的。)

年轻一代的 Collection 品确实如此。它需要知道所有根中的内容,以避免删除这些根引用的对象。由于GC根可以引用新生代中的对象,所以新生代收集器需要使用它们。

从某种意义上说,所有 Collection 家都在使用它们。但从另一个意义上说,GC roots 仅在某些“stop the world”收集阶段直接使用。对于那些在正常线程运行时运行的收集器/阶段,用户线程可能会修改 GC 根。 GC 基础设施使用诸如写屏障之类的东西来捕获任何可能影响可达性的变化......以各种方式。

关于java - 线程作为 GC 根,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26232733/

相关文章:

Node.js:如何从内存中释放 Mongoose 模型? (内存泄漏)

javascript - 我是否需要在窗口卸载时显式销毁 JavaScript 对象?

java - 如果我不 shutdown() quartz 调度程序会发生什么

vb.net - 句柄与 AddHandler

java - 使用 SwingWorker 后清理

python - 使用 webpy 线程化特定数据

c++ - Qt从另一个成员函数并发运行成员函数

在自己的线程中执行的线程之间的 C# 事件(如何)?

java - 如何为 MortarActivityScope @Provide 一个 Activity,而不会在方向更改时泄漏 Activity?

java - 线程初学者 : What's the point in using a super() method within the sub class's(extending Thread class) constructor?