что делают сборки мусора IncrementalMarking и ProcessWeakCallbacks в v8? - PullRequest
0 голосов
/ 11 февраля 2020

Я реализовал обратные вызовы сборки мусора в 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.

Мой вопрос: Инкрементальные маркировки и ProcessWeakCallbacks сборок мусора? А также, почему они всегда вызываются столько же раз, сколько и сборщик мусора MarkSweepCompact (их следует считать частью этого типа сбора)?

1 Ответ

1 голос
/ 11 февраля 2020

(здесь разработчик V8.) Да, «IncrementalMarking» и «ProcessWeakCallbacks» - это не типы G C, а фазы основных циклов G C. (Я не знаю, почему это перечисление называется GCType, вероятно, по историческим причинам.)

Я записываю время, затрачиваемое на сборку мусора, а также подсчет каждого типа

Обратите внимание, что обратные вызовы G C не предназначены и не подходят для измерения времени. В частности, добавочная маркировка (как следует из названия) происходит во многих крошечных пошаговых шагах, но вы получите только один вызов обратного вызова, прежде чем произойдет первый из этих шагов; после этого шаги пошаговой маркировки и выполнения программы будут чередоваться до тех пор, пока маркировка не будет завершена.

Кроме того, обратите внимание, что команда работает над перемещением как можно большей части работы G C в фоновые потоки, что делает Весь вопрос "сколько времени это заняло?" несколько нечетко определено.

В целях расследования в автономном режиме лучше всего ставить флаг --trace-gc, который должен предоставлять точную и полную информацию о сроках.

Для онлайн-бухгалтерии (по состоянию на ). Обратные вызовы сборщика мусора V8 для измерения активности G C , см. Также мой подробный ответ там), боюсь, нет хорошего решения.

...