Quais são os valores de retorno de node.js process.memoryUsage ()?


132

A partir da documentação oficial ( fonte ):

process.memoryUsage ()

Retorna um objeto que descreve o uso da memória do processo do Nó medido em bytes.

var util = require('util');

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

Isso irá gerar:

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

heapTotal e heapUsed referem-se ao uso de memória da V8.

Exatamente o que rss , heapTotal e heapUsed representam?

Pode parecer uma pergunta trivial, mas tenho procurado e não consegui encontrar uma resposta clara até agora.

Respostas:


156

Para responder a essa pergunta, é preciso entender primeiro o esquema de memória do V8.

Um programa em execução é sempre representado através de algum espaço alocado na memória. Esse espaço é chamado Conjunto Residente . A V8 usa um esquema semelhante à Java Virtual Machine e divide a memória em segmentos:

  • Código : o código real sendo executado
  • Pilha : contém todos os tipos de valor (primitivos como número inteiro ou booleano) com ponteiros que referenciam objetos na pilha e ponteiros que definem o fluxo de controle do programa
  • Heap : um segmento de memória dedicado ao armazenamento de tipos de referência, como objetos, strings e fechamentos. insira a descrição da imagem aqui

Agora é fácil responder à pergunta:

  • rss : tamanho do conjunto residente
  • heapTotal : tamanho total da pilha
  • heapUsed : heap realmente usado

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


41
Uma imagem pode valer 1000 palavras.
precisa saber é o seguinte

8
@bmacnaughton Este vale a pena 1013 palavras :)
alex

2
[rss, heapTotal, heapUsed] => tamanho em megabytes? kilobytes? você pode adicionar isso à sua resposta? são todas as mesmas unidades?
Alexander Mills

Como o heapTotal é gerenciado por nó? No meu aplicativo, vejo o heapTotal subindo constantemente (independentemente do GC), embora o heapUsed permaneça limitado. Não vi nenhuma explicação de como heapTotal é gerenciado por nó ... Acho que é apenas heap reservado para alocações futuras, mas alguma delas já foi lançada (se não estiver sendo usada)? O que faria com que ficasse alto?
logidelic 28/09/18

1
existe uma nova propriedade "externa" em process.memoryUsage (), alguém sabe sobre isso #

39

RSS é o tamanho do conjunto residente , a parte da memória do processo mantida na RAM (em oposição ao espaço de troca ou a parte mantida no sistema de arquivos).

A pilha é a parte da memória da qual os objetos recém-alocados virão (pense mallocem C ou newem JavaScript).

Você pode ler mais sobre a pilha na Wikipedia .


4
Eu não acho que é a memória total. Na minha máquina, a memória total é de 8 GB, mas quando executo um processo simples de nó, o RSS mostra cerca de 13 MB, então acho que realmente mostra quanta memória é mantida na RAM por esse processo.
Stefan

1
@ Stefan certo, me deparei com algum tipo de bug naquela época, mas o RSS parece ser confiável para mim agora.
Mahn

4
Qual é a diferença entre heapTotale heapUsed?
tiblu

3
@tiblu heapTotalé o espaço total de heap alocado pelo mecanismo V8 subjacente, para alocações dinâmicas. heapUsedé a memória usada dentro desse espaço total. Ambos são gerenciados pelo V8 e estão sujeitos a aumentar / diminuir sempre que necessário.
Elyas-bhy

4
Uma imagem que visualiza os diferentes espaços de memória: apmblog.dynatrace.com/wp-content/uploads/2015/11/DK_2.png
elyas-BHY

7

A duplicação do Node.js descreve da seguinte maneira:

heapTotal e heapUsed referem-se ao uso de memória da V8. external refere-se ao uso de memória de objetos C ++ vinculados a objetos JavaScript gerenciados pelo V8. rss, tamanho do conjunto residente , é a quantidade de espaço ocupado no dispositivo de memória principal (que é um subconjunto da memória total alocada) para o processo, que inclui a pilha, o segmento de código e a pilha.

Todos os valores mencionados são expressos em bytes. Portanto, se você quiser imprimi-los, provavelmente precisará redimensioná-los para o MB:

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

Isso lhe dará uma saída como:

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

0

Vamos fazer isso com um exemplo

O exemplo a seguir irá mostrar como o aumento no uso de memória vai realmente aumentar a 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') )
    } 
}

Executando A descrição acima, você terá algo assim:

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

Isso mostra claramente como o uso de variável e o incremento contínuo do espaço necessário aumentam o heapTotal e, correspondentemente, o tamanho do conjunto residente ( rss)

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.