Node.js 为什么与脚本所需的内存相比,nodejs在操作系统中占用的虚拟内存要多得多?

Node.js 为什么与脚本所需的内存相比,nodejs在操作系统中占用的虚拟内存要多得多?,node.js,linux,virtual-memory,Node.js,Linux,Virtual Memory,我正在运行一个5k loc express应用程序,其中包含许多其他依赖项,包括express。该应用程序说它需要大约60MB的内存。但是当查看我的linux机器上的实际RAM使用情况时,top告诉我它使用了约1200 MB的VIRT内存,而只占用了约60 MB的RES(RSS)内存 然后我编写了一个简单的test.js脚本来隔离这个案例: setInterval(() => { console.log(JSON.stringify(process.memoryUsage())); }

我正在运行一个5k loc express应用程序,其中包含许多其他依赖项,包括express。该应用程序说它需要大约60MB的内存。但是当查看我的linux机器上的实际RAM使用情况时,
top
告诉我它使用了约1200 MB的VIRT内存,而只占用了约60 MB的RES(RSS)内存

然后我编写了一个简单的
test.js
脚本来隔离这个案例:

setInterval(() => {
  console.log(JSON.stringify(process.memoryUsage()));
} , 1000);
并使用:
node test.js

它告诉我它使用了大约30 MB的RAM:

{"rss":30097408,"heapTotal":6537216,"heapUsed":3829224,"external":8272}
再次查看
top
命令中的内存,它显示了30 MB的分辨率,但大约470 MB的VIRT使用量

PID  USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
8498 ted       20   0  485948  29928  23540 S   0,3  0,8   0:00.44 node
这样看来,NodeJS并不轻量级

我的NodeJS应用程序(不是测试应用程序)的宿主为该应用程序永久性地授予我大约600 MB的内存,但由于内存使用率高,在几秒钟后终止了我的节点进程。高虚拟内存使用率(提到的1200/3800 MB)是一个触发因素。因此,我的问题是:

为什么应用程序的虚拟内存使用率比实际需要的内存高?记忆是用来做什么的?


我是否可以限制NodeJS的虚拟内存(是否使用过?)

您的主机是否根据虚拟内存使用情况终止应用程序?也许你应该向他们解释,虚拟内存本身基本上是免费的、无限的,不符合RAM的使用,他们应该转而关注rss。写下这个问题后,我也想到了这个想法。因为我从来没有完全理解过虚拟内存,所以我首先想收集一些关于它的知识。我之前的结论是,当他们写道他们确实使用虚拟内存作为触发器时,我只是理解错了。由于
内存过度使用
交换内存
被禁用,他们说这是要使用的值。不过,我不能把这和你说的话结合起来。我不确定这是否有道理。如果你映射一个1GB的文件,虚拟内存的使用会增加1GB,但它是由磁盘而不是RAM支持的。只有当你有一个交换分区时,它才由磁盘支持。它们不是。非私有内存映射文件始终由磁盘支持。