Que signifient les valeurs de retour de node.js process.memoryUsage ()?

132

De la documentation officielle ( source ):

process.memoryUsage ()

Renvoie un objet décrivant l'utilisation de la mémoire du processus Node mesurée en octets.

var util = require('util');

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

Cela générera:

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

heapTotal et heapUsed font référence à l'utilisation de la mémoire du V8.

Que signifient exactement rss , heapTotal et heapUsed ?

Cela peut sembler une question triviale, mais j'ai cherché et je n'ai pas pu trouver de réponse claire jusqu'à présent.

Mahn
la source

Réponses:

156

Afin de répondre à cette question, il faut d'abord comprendre le schéma de mémoire du V8.

Un programme en cours d'exécution est toujours représenté par un espace alloué en mémoire. Cet espace est appelé ensemble résident . La V8 utilise un schéma similaire à la machine virtuelle Java et divise la mémoire en segments:

  • Code : le code réel en cours d'exécution
  • Pile : contient tous les types de valeur (primitives comme entier ou booléen) avec des pointeurs référençant des objets sur le tas et des pointeurs définissant le flux de contrôle du programme
  • Heap : un segment de mémoire dédié au stockage des types de référence comme les objets, les chaînes et les fermetures. entrez la description de l'image ici

Maintenant, il est facile de répondre à la question:

  • rss : Taille de l'ensemble des résidents
  • heapTotal : Taille totale du tas
  • heapUsed : tas réellement utilisé

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

timqian
la source
41
Une image peut valoir 1000 mots.
bmacnaughton
8
@bmacnaughton Celui-ci vaut 1013 mots :)
alex
2
[rss, heapTotal, heapUsed] => taille en mégaoctets? kilo-octets? pouvez-vous ajouter cela à votre réponse? sont-ils tous les mêmes unités?
Alexander Mills
Comment heapTotal est-il géré par nœud? Dans mon application, je vois heapTotal augmenter régulièrement (quel que soit le GC) même si heapUsed reste limité. Je n'ai vu aucune explication sur la façon dont heapTotal est géré par nœud ... Je suppose que c'est juste un tas réservé pour les allocations futures, mais est-ce que l'un d'entre eux est déjà publié (s'il n'est pas utilisé)? Qu'est-ce qui le ferait rester élevé?
logidelic
1
il y a une nouvelle propriété "externe" sur process.memoryUsage (), tout le monde sait à ce sujet
39

RSS est la taille de l'ensemble résident , la partie de la mémoire du processus conservée dans la RAM (par opposition à l'espace de swap ou à la partie contenue dans le système de fichiers).

Le tas est la partie de la mémoire à partir de laquelle les objets nouvellement alloués viendront (pensez mallocà C ou newà JavaScript).

Vous pouvez en savoir plus sur le tas sur Wikipedia .

Ray Toal
la source
4
Je ne pense pas que ce soit la mémoire totale. Sur ma machine, la mémoire totale est de 8 Go, mais lorsque j'exécute un processus de nœud simple, le RSS affiche environ 13 Mo, donc je pense que cela montre vraiment la quantité de mémoire conservée dans la RAM par ce processus.
Stefan
1
@Stefan, c'est vrai, je suis tombé sur une sorte de bogue à l'époque, mais RSS me semble désormais fiable.
Mahn
4
Quelle est la différence entre heapTotalet heapUsed?
tiblu
3
@tiblu heapTotalest l'espace de tas total alloué par le moteur V8 sous-jacent, pour les allocations dynamiques. heapUsedest la mémoire utilisée dans cet espace total. Les deux sont gérés par V8 et sont susceptibles de croître / rétrécir chaque fois que nécessaire.
elyas-bhy
4
Une image qui visualise les différents espaces mémoire: apmblog.dynatrace.com/wp-content/uploads/2015/11/DK_2.png
elyas-bhy
7

La doumentation Node.js le décrit comme suit:

heapTotal et heapUsed font référence à l'utilisation de la mémoire du V8. external fait référence à l'utilisation de la mémoire des objets C ++ liés aux objets JavaScript gérés par V8. rss, Resident Set Size , est la quantité d'espace occupé dans le périphérique de mémoire principale (c'est-à-dire un sous-ensemble de la mémoire totale allouée) pour le processus, qui comprend le tas, le segment de code et la pile.

Toutes les valeurs mentionnées sont exprimées en octets. Donc, si vous souhaitez simplement les imprimer, vous souhaitez probablement les redimensionner en Mo:

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

Cela vous donnera une sortie comme:

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

Faisons cela avec un exemple

L'exemple suivant vous montre comment l'augmentation de l'utilisation de la mémoire augmente effectivement la rssetheapTotal

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

Exécuter Ce qui précède vous donnera quelque chose comme ceci:

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

Cela vous montre clairement comment l'utilisation de la variable et l'incrémentation continue de l'espace requis par celle-ci augmente le heapTotal et en conséquence la taille de l'ensemble de résidents ( rss)

Cherag Verma
la source