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

공식 문서에서 ( source ) :

process.memoryUsage ()

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

var util = require('util');

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

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

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

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

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

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



답변

이 질문에 대답하려면 먼저 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/


답변

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

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

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


답변

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


답변

예제로 이것을 해봅시다

메모리 사용량의 증가가 실제로 증가하는 방법 다음 예제를 보여줍니다 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)가 어떻게 증가하는지 명확하게 보여줍니다.


답변