¿Qué significan los valores de retorno de node.js process.memoryUsage ()?

132

De la documentación oficial ( fuente ):

process.memoryUsage ()

Devuelve un objeto que describe el uso de memoria del proceso Nodo medido en bytes.

var util = require('util');

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

Esto generará:

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

heapTotal y heapUsed se refieren al uso de memoria de V8.

¿Qué significan exactamente rss , heapTotal y heapUsed ?

Puede parecer una pregunta trivial, pero he estado buscando y no he podido encontrar una respuesta clara hasta ahora.

Mahn
fuente

Respuestas:

156

Para responder a esta pregunta, primero hay que entender el esquema de memoria de V8.

Un programa en ejecución siempre se representa a través de un espacio asignado en la memoria. Este espacio se llama Conjunto Residente . V8 utiliza un esquema similar a la máquina virtual Java y divide la memoria en segmentos:

  • Código : el código real que se está ejecutando
  • Pila : contiene todos los tipos de valores (primitivos como entero o booleano) con punteros que hacen referencia a objetos en el montón y punteros que definen el flujo de control del programa
  • Montón : un segmento de memoria dedicado a almacenar tipos de referencia como objetos, cadenas y cierres. ingrese la descripción de la imagen aquí

Ahora es fácil responder la pregunta:

  • rss : Tamaño de conjunto residente
  • heapTotal : tamaño total del montón
  • HeapUsed : Heap realmente utilizado

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

timqian
fuente
41
Una imagen puede valer 1000 palabras.
bmacnaughton
8
@bmacnaughton Esto vale 1013 palabras :)
alex
2
[rss, heapTotal, heapUsed] => tamaño en megabytes? kilobytes? ¿Puedes agregar eso a tu respuesta? ¿son todas las mismas unidades?
Alexander Mills
¿Cómo se gestiona heapTotal por nodo? En mi aplicación veo que heapTotal sube constantemente (independientemente de GC) aunque heapUsed permanece acotado. No he visto ninguna explicación de cómo heapTotal es administrado por el nodo ... Supongo que es solo un montón reservado para futuras asignaciones, pero ¿alguna de ellas se lanza alguna vez (si no se usa)? ¿Qué haría que se mantuviera alto?
logidelic
1
hay una nueva propiedad "externa" en process.memoryUsage (), alguien lo sabe
39

RSS es el tamaño del conjunto residente , la parte de la memoria del proceso almacenada en la RAM (en oposición al espacio de intercambio o la parte almacenada en el sistema de archivos).

El montón es la porción de memoria de la que provendrán los objetos recién asignados (piense mallocen C o newen JavaScript).

Puede leer más sobre el montón en Wikipedia .

Ray Toal
fuente
44
No creo que sea la memoria total. En mi máquina, la memoria total es de 8 GB, pero cuando ejecuto un simple proceso de nodo, el RSS muestra alrededor de 13 MB, por lo que creo que realmente muestra cuánta memoria se mantiene en la RAM por este proceso.
Stefan
1
@Stefan bien, me encontré con algún tipo de error en ese entonces, pero RSS parece ser confiable para mí ahora.
Mahn
44
¿Cuál es la diferencia entre heapTotaly heapUsed?
tiblu
3
@tiblu heapTotales el espacio de almacenamiento dinámico total asignado por el motor V8 subyacente, para asignaciones dinámicas. heapUsedes la memoria utilizada dentro de ese espacio total. Ambos son administrados por V8 y están sujetos a crecimiento / reducción cuando sea necesario.
elyas-bhy
44
Una imagen que visualiza los diferentes espacios de memoria: apmblog.dynatrace.com/wp-content/uploads/2015/11/DK_2.png
elyas-bhy
7

La doumentation de Node.js lo describe de la siguiente manera:

heapTotal y heapUsed se refieren al uso de memoria de V8. externo se refiere al uso de la memoria de objetos C ++ vinculados a objetos JavaScript administrados por V8. rss, Tamaño de conjunto residente , es la cantidad de espacio ocupado en el dispositivo de memoria principal (que es un subconjunto de la memoria total asignada) para el proceso, que incluye el montón, el segmento de código y la pila.

Todos los valores mencionados se expresan en bytes. Por lo tanto, si solo desea imprimirlos, probablemente desee reescalarlos a MB:

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

Eso te dará una salida como:

Memory: rss 522.06 MB
Memory: heapTotal 447.3 MB
Memory: heapUsed 291.71 MB
Memory: external 0.13 MB
bvdb
fuente
0

Hagamos esto con un ejemplo

El siguiente ejemplo le mostrará cómo el aumento en el uso de memoria aumentará realmente el rssyheapTotal

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

Ejecutar lo anterior le dará algo como esto:

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

Esto muestra claramente cómo el uso de variables y el incremento continuo del espacio requerido aumenta el heapTotal y, en consecuencia, el tamaño del conjunto residente ( rss)

Cherag Verma
fuente