Cosa significano i valori di ritorno di node.js process.memoryUsage ()?


132

Dalla documentazione ufficiale ( fonte ):

process.memoryUsage ()

Restituisce un oggetto che descrive l'utilizzo della memoria del processo Node misurato in byte.

var util = require('util');

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

Questo genererà:

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

heapTotal e heapUsed si riferiscono all'utilizzo della memoria di V8.

Esattamente cosa fanno rss , heapTotal e heapUsed ?

Potrebbe sembrare una domanda banale, ma ho cercato e finora non sono riuscito a trovare una risposta chiara.

Risposte:


156

Per rispondere a questa domanda, bisogna prima capire lo schema di memoria del V8.

Un programma in esecuzione è sempre rappresentato attraverso uno spazio allocato in memoria. Questo spazio è chiamato Resident Set . V8 utilizza uno schema simile alla Java Virtual Machine e divide la memoria in segmenti:

  • Codice : il codice effettivo in esecuzione
  • Stack : contiene tutti i tipi di valore (primitive come intero o booleano) con puntatori che fanno riferimento a oggetti nell'heap e puntatori che definiscono il flusso di controllo del programma
  • Heap : un segmento di memoria dedicato alla memorizzazione di tipi di riferimento come oggetti, stringhe e chiusure. inserisci qui la descrizione dell'immagine

Ora è facile rispondere alla domanda:

  • rss : Resident Set Size
  • heapTotal : dimensione totale dell'heap
  • heapUsed : heap effettivamente utilizzato

Rif : http://apmblog.dynatrace.com/2015/11/04/understanding-garbage-collection-and-hunting-memory-leaks-in-node-js/


41
Un'immagine può valere 1000 parole.
bmacnaughton,

8
@bmacnaughton Questo vale 1013 parole :)
alex

2
[rss, heapTotal, heapUsed] => dimensione in megabyte? kilobyte? puoi aggiungerlo alla tua risposta? sono tutte le stesse unità?
Alexander Mills,

Come viene gestito heapTotal per nodo? Nella mia app vedo che heapTotal aumenta costantemente (indipendentemente da GC) anche se heapUsed rimane limitato. Non ho visto alcuna spiegazione di come heapTotal è gestito dal nodo ... Immagino sia solo un heap riservato per allocazioni future, ma ne viene mai rilasciato uno (se non utilizzato)? Cosa lo farebbe rimanere alto?
logidelic,

1
c'è una nuova proprietà "esterna" su process.memoryUsage (), tutti ne sono a conoscenza

39

RSS è la dimensione del set residente , la parte della memoria del processo contenuta nella RAM (al contrario dello spazio di swap o la parte contenuta nel filesystem).

L' heap è la porzione di memoria da cui provengono gli oggetti appena allocati (pensate a mallocin C, onew in JavaScript).

Puoi leggere di più sull'heap su Wikipedia .


4
Non penso sia la memoria totale. Sulla mia macchina la memoria totale è di 8 GB, ma quando eseguo un semplice processo nodo l'RSS mostra circa 13 MB, quindi penso che mostri davvero quanta memoria è trattenuta nella RAM da questo processo.
Stefan,

1
@Stefan giusto, allora mi sono imbattuto in una sorta di bug, ma RSS mi sembra affidabile ora.
Mahn,

4
Qual è la differenza tra heapTotale heapUsed?
tiblu,

3
@tiblu heapTotalè lo spazio heap allocato totale dal motore V8 sottostante, per allocazioni dinamiche. heapUsedè la memoria utilizzata all'interno di quello spazio totale. Entrambi sono gestiti da V8 e sono soggetti a crescita / riduzione ogni volta che è necessario.
elyas-bhy,

4
Un'immagine che visualizza i diversi spazi di memoria: apmblog.dynatrace.com/wp-content/uploads/2015/11/DK_2.png
elyas-bhy

7

La documentazione Node.js lo descrive come segue:

heapTotal e heapUsed si riferiscono all'utilizzo della memoria di V8. esterno si riferisce all'utilizzo della memoria degli oggetti C ++ associati agli oggetti JavaScript gestiti da V8. rss, Resident Set Size , è la quantità di spazio occupato nel dispositivo di memoria principale (ovvero un sottoinsieme della memoria allocata totale) per il processo, che include heap, segmento di codice e stack.

Tutti i valori indicati sono espressi in byte. Quindi, se vuoi solo stamparli, probabilmente vorrai ridimensionarli su MB:

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

Questo ti darà un output come:

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

0

Facciamo questo con un esempio

L'esempio seguente mostra come l'aumento dell'utilizzo della memoria aumenterà effettivamente rsseheapTotal

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') )
    } 
}

Esecuzione di quanto sopra ti darà qualcosa del genere:

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

Questo mostra chiaramente come l'utilizzo della variabile e l'incremento continuo dello spazio richiesto da essa aumenta l'heapTotal e di conseguenza la Resident Set Size ( rss)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.