node.js process.memoryUsage()的返回值代表什么?


132

从官方文档(来源):

process.memoryUsage()

返回一个对象,该对象描述以字节为单位的Node进程的内存使用情况。

var util = require('util');

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

这将产生:

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

heapTotal和heapUsed是指V8的内存使用情况。

究竟是什么做RSSheapTotalheapUsed立场?

这似乎是一个琐碎的问题,但我一直在寻找,到目前为止,我还没有找到明确的答案。

Answers:


156

为了回答这个问题,必须先了解V8的Memory Scheme。

始终通过内存中分配的某些空间来表示正在运行的程序。该空间称为居民集。V8使用类似于Java虚拟机的方案,并将内存分为以下几部分:

  • 代码:正在执行的实际代码
  • Stack:包含所有值类型(基元,如整数或布尔值),其指针引用堆上的对象,而指针则定义程序的控制流
  • :专用于存储引用类型(如对象,字符串和闭包)的内存段。 在此处输入图片说明

现在很容易回答这个问题:

  • rss:居民集大小
  • heapTotal:堆的总大小
  • heapUsed:实际使用的堆

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


41
一幅图片可能值1000字。
bmacnaughton '16

8
@bmacnaughton这个值1013字:)
Alex

2
[rss,heapTotal,heapUsed] =>大小以兆字节为单位?千字节?您可以将其添加到答案中吗?它们都是相同的单位吗?
亚历山大·米尔斯

如何通过节点管理heapTotal?在我的应用程序中,即使heapUsed仍然有界,我仍然看到heapTotal稳定增长(与GC无关)。我还没有看到关于节点如何管理heapTotal的任何解释……我想它只是为将来的分配保留的堆,但是有没有释放过(如果不使用的话)?是什么导致它保持高位?
logidelic

1
在process.memoryUsage()上有一个新属性“ external”,任何人都知道

39

RSS驻留集大小,它是进程内存在RAM中保留的部分(与交换空间或文件系统中保留的部分相对)。

所述是从新近分配的对象将来自存储器的所述部分(认为的malloc在C,或new在JavaScript)。

您可以在Wikipedia上了解有关堆的更多信息。


4
我不认为这是总的记忆。在我的机器上,总内存为8GB,但是当我运行一个简单的节点进程时,RSS大约显示13MB,因此我认为它实际上显示了此进程在RAM中保留了多少内存。
Stefan

1
@Stefan对,那时候我遇到了某种错误,但是RSS现在对我来说似乎是可靠的。
Mahn 2014年

4
heapTotal和之间有什么区别heapUsed
tiblu

3
@tiblu heapTotal是基础V8引擎用于动态分配的总分配堆空间。heapUsed是该总空间内使用的内存。两者均由V8管理,并且在必要时会增加/缩小。
elyas-bhy 2015年

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)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.