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,另请参阅我在那里的详细回答),恐怕没有好的解决方案。
我已经实现了 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,另请参阅我在那里的详细回答),恐怕没有好的解决方案。