Для чого позначаються повернені значення 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 і розділяє пам'ять на сегменти:

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

Тепер легко відповісти на питання:

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

Посилання : http://apmblog.dynatrace.com/2015/11/04/understanding-garbage-collection-and-hunting-memory-leaks-in-node-js/


41
Малюнок може коштувати 1000 слів.
bmacnaughton

8
@bmacnaughton Цей вартий 1013 слів :)
alex

2
[rss, heapTotal, heapUsed] => розмір у мегабайтах? кілобайт? чи можете ви додати це до своєї відповіді? чи всі вони однакові одиниці?
Олександр Міллс

Як heapTotal управляється вузлом? У своєму додатку я бачу, що heapTotal постійно зростає (незалежно від GC), навіть якщо heapUsed залишається обмеженим. Я не бачив жодного пояснення того, як heapTotal управляється вузлом ... Я думаю, це просто зарезервована купа для майбутніх виділень, але чи будь-яка з них коли-небудь випущена (якщо вона не використовується)? Що б змусило його залишатися високим?
logidelic

1
з'явилася нова властивість "зовнішня" в 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

7

Doumentation Node.js описує його наступним чином :

heapTotal та heapUsed відносяться до використання пам'яті V8. зовнішня - це використання в пам'яті об'єктів C ++, пов'язаних з об'єктами JavaScript, якими управляє V8. rss, Resident Set Size - це кількість місця, яке займає основний пристрій пам'яті (тобто підмножина загальної виділеної пам'яті) для процесу, що включає купу, сегмент коду та стек.

Усі згадані значення виражаються в байтах. Отже, якщо ви просто хочете роздрукувати їх, ви, ймовірно, захочете змінити їх масштаб у MB:

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 і відповідно Resident Set Size ( rss)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.