В V8 (среда выполнения JS, которую использует Node.js) для кучи предварительно выделяется установленный размер.Это heapTotal
вы видите.Когда V8 подозревает, что вам понадобится больше места, он увеличит общий размер кучи.
С вашим примером кода получается, что в куче выделяется много небольших объектов.Это отражено в heapUsed
и является фактическим объемом памяти, который используется вашим кодом.Когда куча заполняется, выполняется сбор мусора (GC), освобождая место.Так что, если вы построите график heapUsed
при увеличении i
, вы увидите, что он поднимается и поднимается до тех пор, пока не сработает GC, и он не упадет обратно.Я сделал для очень длинного пробега!

Вы можете ясно видеть, что куча никогда не позволяла получить такую большую раньшеGC включается.
Для дальнейшей проверки этого мы можем вручную запустить GC в нашем коде, если мы запустим следующее, используя node --expose_gc
async function run() {
for (let i = 0; i < 10000000000; i++) {
await new Promise(async resolve => {
if (i % 10000000 === 0) {
global.gc();
console.log(`${i}, ${(process.memoryUsage().heapUsed / 1024 / 1024).toFixed(2)}mb`);
}
resolve();
});
}
}
run();
Из этоговы получите следующий вывод для v7.9.0
0, 3.12mb
10000000, 2.77mb
20000000, 2.78mb
30000000, 2.78mb
40000000, 2.78mb
50000000, 2.78mb
60000000, 2.78mb
Различные версии узлов
Что очень интересно, если мы запустим тест на разных версиях узла!

Как вы можете видеть, существует огромное различие в профиле памяти для pre-v8.2.0 и последующих версий node.js.Если мы посмотрим на журнал изменений для v8.3.0, то увидим, почему!
Движок V8 был обновлен до версии 6.0, в которой значительно изменился профиль производительности.
Это версия V8, включающая Turbofan , которая реализует море узлов и включала множество улучшений производительности для GC.
Более подробное представление о том, как работает V8 GC, доступно в репозитории v8-perf Торстена Лоренца.