Что означают возвращаемые значения node.js process.memoryUsage ()?


132

Из официальной документации ( источник ):

process.memoryUsage ()

Возвращает объект, описывающий использование памяти процессом Node, измеренное в байтах.

var util = require('util');

console.log(util.inspect(process.memoryUsage()));

Это сгенерирует:

{ rss: 4935680, heapTotal: 1826816, heapUsed: 650472 }

heapTotal и heapUsed относятся к использованию памяти V8.

Что именно означают rss , heapTotal и heapUsed ?

Это может показаться банальным вопросом, но я искал и пока не смог найти четкого ответа.

Ответы:


156

Чтобы ответить на этот вопрос, сначала нужно понять схему памяти V8.

Работающая программа всегда представлена ​​в виде некоторого пространства, выделенного в памяти. Это пространство называется Resident Set . V8 использует схему, аналогичную виртуальной машине Java, и делит память на сегменты:

  • Код : фактический исполняемый код
  • Стек : содержит все типы значений (примитивы, такие как целое число или логическое значение) с указателями, ссылающимися на объекты в куче, и указателями, определяющими поток управления программой.
  • Куча : сегмент памяти, предназначенный для хранения ссылочных типов, таких как объекты, строки и замыкания. введите описание изображения здесь

Теперь легко ответить на вопрос:

  • rss : Размер резидентского набора
  • heapTotal : общий размер кучи
  • heapUsed : фактически использованная куча

Ссылка : http://apmblog.dynatrace.com/2015/11/04/understanding-garbage-collection-and-hunting-memory-leaks-in-node-js/


41
Картинка может стоить 1000 слов.
bmacnaughton 08

8
@bmacnaughton Этот стоит 1013 слов :)
Alex

2
[rss, heapTotal, heapUsed] => размер в мегабайтах? килобайт? можешь добавить это к своему ответу? они все одинаковые?
Александр Миллс

Как heapTotal управляется узлом? В моем приложении я вижу, что heapTotal неуклонно растет (независимо от GC), хотя heapUsed остается ограниченным. Я не видел никаких объяснений того, как heapTotal управляется узлом ... Я думаю, это просто зарезервированная куча для будущих распределений, но выпущено ли какое-либо из них (если не используется)? Что заставит его оставаться высоким?
logidelic

1
есть новое свойство external для process.memoryUsage (), кто-нибудь знает об этом

39

RSS - это размер резидентного набора , часть памяти процесса, хранящаяся в ОЗУ (в отличие от пространства подкачки или части, хранящейся в файловой системе).

Кучи представляет собой часть памяти , из которого вновь выделенные объекты будут поступать из (думать о mallocв С, или newв JavaScript).

Подробнее о куче можно прочитать в Википедии .


4
Не думаю, что это общая память. На моей машине общая память составляет 8 ГБ, но когда я запускаю простой процесс узла, RSS показывает около 13 МБ, поэтому я думаю, что он действительно показывает, сколько памяти удерживается в ОЗУ этим процессом.
Стефан

1
@Stefan: Верно, тогда я столкнулся с какой-то ошибкой, но сейчас RSS кажется мне надежным.
Ман,

4
В чем разница между heapTotalи heapUsed?
tiblu

3
@tiblu heapTotal- это общее выделенное пространство кучи базовым механизмом V8 для динамического распределения. heapUsed- это память, используемая в этом общем пространстве. Оба управляются V8 и при необходимости могут увеличиваться / уменьшаться.
elyas-bhy

4
Изображение, которое визуализирует различные области памяти: apmblog.dynatrace.com/wp-content/uploads/2015/11/DK_2.png
elyas-bhy 06

7

Документация Node.js описывает это следующим образом:

heapTotal и heapUsed относятся к использованию памяти V8. external относится к использованию памяти объектами C ++, привязанными к объектам JavaScript, управляемым V8. rss, размер резидентного набора , - это объем пространства, занимаемого в устройстве основной памяти (то есть подмножеством общей выделенной памяти) для процесса, который включает кучу, сегмент кода и стек.

Все указанные значения выражены в байтах. Итак, если вы просто хотите их распечатать, вы, вероятно, захотите масштабировать их до МБ:

const used = process.memoryUsage();
for (let key in used) {
  console.log(`Memory: ${key} ${Math.round(used[key] / 1024 / 1024 * 100) / 100} MB`);
}

Это даст вам следующий результат:

Memory: rss 522.06 MB
Memory: heapTotal 447.3 MB
Memory: heapUsed 291.71 MB
Memory: external 0.13 MB

0

Сделаем это на примере

В следующем примере показано, как увеличение использования памяти на самом деле увеличивает rssиheapTotal

const numeral = require('numeral');
let m = new Map();
for (let i = 0; i < 100000; i++) {
    m.set(i, i);
    if (i % 10000 === 0) { 
        const { rss, heapTotal } = process.memoryUsage();
        console.log( 'rss', numeral(rss).format('0.0 ib'), heapTotal, numeral(heapTotal).format('0.0 ib') )
    } 
}

Выполнение приведенного выше даст вам что-то вроде этого:

rss 22.3 MiB 4734976 4.5 MiB
rss 24.2 MiB 6483968 6.2 MiB
rss 27.6 MiB 9580544 9.1 MiB
rss 27.6 MiB 9580544 9.1 MiB
rss 29.3 MiB 11419648 10.9 MiB
rss 29.3 MiB 11419648 10.9 MiB
rss 29.3 MiB 11419648 10.9 MiB
rss 32.8 MiB 15093760 14.4 MiB
rss 32.9 MiB 15093760 14.4 MiB
rss 32.9 MiB 15093760 14.4 MiB

Это ясно показывает вам, как использование переменной и постоянное увеличение требуемого ей пространства увеличивает heapTotal и, соответственно, размер резидентного набора ( rss)

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.