node.js process.memoryUsage ()의 반환 값은 무엇을 의미합니까?


132

공식 문서에서 ( source ) :

process.memoryUsage ()

바이트 단위로 측정 된 노드 프로세스의 메모리 사용량을 설명하는 객체를 반환합니다.

var util = require('util');

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

이것은 다음을 생성합니다 :

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

heapTotal 및 heapUsed는 V8의 메모리 사용량을 나타냅니다.

정확히 rss , heapTotalheapUsed 는 무엇을 의미합니까?

사소한 질문처럼 보이지만 지금까지 살펴본 결과 지금까지 명확한 답을 찾을 수 없었습니다.

답변:


156

이 질문에 대답하려면 먼저 V8의 메모리 체계를 이해해야합니다.

실행중인 프로그램은 항상 메모리에 할당 된 공간을 통해 나타납니다. 이 공간을 Resident Set 라고 합니다. V8은 Java Virtual Machine과 유사한 체계를 사용하고 메모리를 세그먼트로 나눕니다.

  • 코드 : 실제 코드 실행
  • Stack : 힙의 객체를 참조하는 포인터와 프로그램의 제어 흐름을 정의하는 포인터와 함께 모든 값 유형 (정수 또는 부울과 같은 기본형)을 포함합니다.
  • : 객체, 문자열 및 클로저와 같은 참조 유형을 저장하는 데 사용되는 메모리 세그먼트입니다. 여기에 이미지 설명을 입력하십시오

이제 질문에 대답하기가 쉽습니다.

  • 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] => 크기 (MB)? 킬로바이트? 답변에 추가 할 수 있습니까? 그들은 모두 같은 단위입니까?
Alexander Mills

heapTotal은 노드별로 어떻게 관리됩니까? 내 응용 프로그램에서 heapUsed가 계속 경계를 유지하더라도 heapTotal이 (GC에 관계없이) 꾸준히 올라가는 것을 볼 수 있습니다. heapTotal이 노드에 의해 관리되는 방법에 대한 설명을 보지 못했습니다 ... 향후 할당을 위해 힙을 예약 한 것 같지만 아직 사용되지 않은 적이 있습니까? 무엇이 높은 상태를 유지합니까?
logidelic

1
process.memoryUsage ()에 새로운 "external"속성이 있습니다. 누구나 알고 있습니다

39

RSS상주 세트 크기 (스왑 공간 또는 파일 시스템에 보유 된 부분과 대조적으로) RAM에 보유 된 프로세스 메모리의 일부입니다.

(생각 새로 할당 된 객체에서 온 것입니다있는 메모리 부분입니다 mallocC에서, 또는 new자바 스크립트).

Wikipedia 에서 힙에 대한 자세한 내용을 읽을 수 있습니다 .


4
나는 그것이 총 메모리라고 생각하지 않습니다. 내 컴퓨터에서 총 메모리는 8GB이지만 간단한 노드 프로세스를 실행하면 RSS에 약 13MB가 표시 되므로이 프로세스가 RAM에 얼마나 많은 메모리를 보유하고 있는지 보여줍니다.
Stefan

1
@ 스테판 오른쪽, 그때 나는 일종의 버그를 발견했지만 RSS는 지금 나에게 신뢰할만한 것 같습니다.
Mahn

4
차이 무엇 heapTotalheapUsed?
tiblu

3
@tiblu heapTotal는 동적 할당을 위해 기본 V8 엔진에 의해 할당 된 총 힙 공간입니다. heapUsed해당 총 공간 내에서 사용 된 메모리입니다. 둘 다 V8에 의해 관리되며 필요할 때마다 커지거나 줄어 듭니다.
elyas-bhy

4
다른 메모리 공간을 시각화하는 이미지 : apmblog.dynatrace.com/wp-content/uploads/2015/11/DK_2.png
elyas-bhy

7

Node.js를의 doumentation는 다음과 같이 설명합니다 :

heapTotal 및 heapUsed 는 V8의 메모리 사용량을 나타냅니다. external 은 V8에서 관리하는 JavaScript 객체에 바인딩 된 C ++ 객체의 메모리 사용량을 나타냅니다. 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

예제로 이것을 해봅시다

메모리 사용량의 증가가 실제로 증가하는 방법 다음 예제를 보여줍니다 rssheapTotal

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)가 어떻게 증가하는지 명확하게 보여줍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.