G1 GC 中如何管理栈根

How roots from stack are managed in G1 GC

Java如何在 G1 垃圾收集器中管理来自堆栈的 Root 对象?它是否在垃圾收集(年轻阶段或混合阶段)时遍历所有 mutator 线程的堆栈,或者是否有一些其他类似记忆集的数据结构(用于保留代际指针的引用)以节省时间? 有没有相同的文档。

始终扫描线程堆栈,不仅在G1;但是在 JVM 上实现的所有其他垃圾收集器中都是 afaik。 GC 必须从一些 已知的 根开始,以便找出什么是活的,什么不是。在任何 java 的 GC 的情况下,这些根由各种部分组成,其中包括:线程堆栈。

在每个周期,这些都会被扫描;毕竟它们 发生变化,并且在每个周期中可能会有所不同。痛苦的部分是 until this is implemented,这是一个 stop-the-world 阶段。由于安全点轮询或线程数,STW 阶段可能会变大。在现实生活场景中(至少在我所涉及的场景中),这不是问题;这是一个快速的过程(Shenandoah 2.0,我看到最多 15 ms 暂停)。

remembered sets 以某种方式实现 .