Как Chrome / V8 работает с большими объектами в javascript? - PullRequest
0 голосов
/ 19 апреля 2020

Я пытаюсь понять поведение сборки мусора, которое вижу при Chrome / V8 на Windows 10. Сценарий состоит в том, что у меня есть небольшая программа, которая получает ~ 1 МБ данных изображения из веб-сокета со скоростью около 60 Гц. Я использую Chrome Версия 81.0.4044.113 (Официальная сборка) (64-разрядная версия) и Windows 10 Pro 1903.

Минимальный код приема выглядит следующим образом:

var connection = new WebSocket('ws://127.0.0.1:31333');

connection.onmessage = message => {
    var dataCopy = new Uint8Array(message.data, 0);
};

Профилирование в Chrome показывает пилообразную массу выделений, растущую до тех пор, пока не произойдет крупный сбор мусора, повторяющийся через регулярные промежутки времени. Выделения всего ровно 176 байтов, что на самом деле не соответствует ожидаемому 1 МБ.

график кучи профиля

Я нашел отличный обзор V8 G C здесь . Если я правильно понимаю, мне кажется немного удивительным, что я вижу крупные события G C, когда второстепенный тип мусора G C мог бы, вероятно, получить эти распределения. Кроме того, как упомянуто выше, распределения, наблюдаемые во время профилирования, не имеют ожидаемого размера 1 МБ.

Дальнейшие исследования показывают, что существует «большое пространство объектов», как описано в этом SO вопросе. , К сожалению, упомянутая вики переместилась с тех пор, как был задан вопрос, и я не могу найти никаких ссылок на «пространство больших объектов» в новом местоположении . Я подозреваю, что распределение в 1 МБ, вероятно, достаточно велико, чтобы квалифицировать его как большой объект, и если да, то я хотел бы подтвердить, каково реальное поведение вокруг них.

Итак, мои вопросы:

  • Почему я наблюдаю такое поведение на основных G C, происходящих регулярно?
  • Почему ассигнования меньше ожидаемых ?
  • Если это связано с обработкой больших объектов, есть ли официальные ресурсы, объясняющие, как обрабатываются большие объекты в Chrome / V8 и каковы ограничения вокруг них?

1 Ответ

1 голос
/ 28 апреля 2020

В конце я подал ошибку для V8 здесь , и ответ заключается в том, что требуются Major GC, потому что объект сообщения расположен в куче Blink, что требует V8 для выполнения Major G C для совместной работы вернуть память. 176-байтовые объекты, вероятно, являются указателями на ArrayBuffer в куче. Существует постоянный проект по созданию поколения Blink G C, которое в конечном итоге изменит это поведение.

...