v8 的 IncrementalMarking 和 ProcessWeakCallbacks 垃圾回收有什么作用?

what do v8's IncrementalMarking and ProcessWeakCallbacks garbage collections do?

我已经实现了 v8 的垃圾收集回调(序言和结尾),并且正在记录垃圾收集所花费的时间以及每种类型的计数。我在 v8 上阅读的所有内容都在讨论主要 GC (Mark/Sweep/Compact) 和次要 GC (Scavenge)。但是还有另外两种类型也会生成回调。来自 v8 代码:

enum GCType {
  kGCTypeScavenge = 1 << 0,
  kGCTypeMarkSweepCompact = 1 << 1,
  kGCTypeIncrementalMarking = 1 << 2,
  kGCTypeProcessWeakCallbacks = 1 << 3,
  kGCTypeAll = kGCTypeScavenge | kGCTypeMarkSweepCompact |
               kGCTypeIncrementalMarking | kGCTypeProcessWeakCallbacks
};

关于 IncrementalMarking 和 ProcessWeakCallbacks 的一件奇怪的事情是它们的回调总是被调用与 MarkSweepCompact 回调完全相同的次数。

我的问题是什么是 IncrementalMarking 和 ProcessWeakCallbacks 垃圾回收?而且,为什么它们总是被调用与 MarkSweepCompact 垃圾收集相同的次数(它们应该被视为该收集类型的一部分)?

(此处为 V8 开发人员。)是的,"IncrementalMarking" 和 "ProcessWeakCallbacks" 不是 GC 的类型,而是主要 GC 周期的阶段。 (我不知道为什么那个枚举恰好被称为 GCType,可能是出于历史原因。)

I am recording the time taken by garbage collection as well as the counts of each type

请注意,GC 回调既不适合也不适合时间测量。特别是,增量标记(顾名思义)发生在许多微小的增量步骤中,但在这些步骤中的第一个步骤发生之前,您只会调用一次回调;之后,增量标记步骤和程序执行将交错进行,直到标记完成。

此外,请注意,该团队正在努力将尽可能多的 GC 工作转移到后台线程中,这使得 "how much time did it take?" 的整个问题有些不明确。

为了离线调查目的,最好的选择是 --trace-gc 标志,它应该提供准确和完整的计时信息。

在线记账(如V8 garbage collector callbacks for measuring GC activity,另请参阅我在那里的详细回答),恐怕没有好的解决方案。