node.js - 常驻内存大于 --max-old-space-size 阈值?

标签 node.js docker ubuntu memory-management v8

我正在我的服务器上运行一个 dockerised node.js 应用程序,使用 --max-old-space-size限制应用程序堆大小的选项。以下输出由 htop 给出:

  PID USER      PRI  NI  VIRT   RES   SHR S CPU% MEM%   TIME+  Command
10158 root       20   0  4284   720   644 S  0.0  0.0  0:00.00 sh -c node --max-old-space-size=512 ./dist/www.js
10159 root       20   0 1841M  929M 29592 S  0.0  3.0  1h31:16 node --max-old-space-size=512 ./dist/www.js
10160 root       20   0 1841M  929M 29592 S  0.0  3.0  0:00.00 node --max-old-space-size=512 ./dist/www.js
10161 root       20   0 1841M  929M 29592 S  0.0  3.0  7:27.13 node --max-old-space-size=512 ./dist/www.js
10162 root       20   0 1841M  929M 29592 S  0.0  3.0  7:26.96 node --max-old-space-size=512 ./dist/www.js
10163 root       20   0 1841M  929M 29592 S  0.0  3.0  7:26.99 node --max-old-space-size=512 ./dist/www.js
10164 root       20   0 1841M  929M 29592 S  0.0  3.0  7:26.64 node --max-old-space-size=512 ./dist/www.js

您可以看到我的应用程序常驻内存 (929M) 远高于我的 max-old-space-size。值(value)(512MB)那么为什么会看到这个?此时应用程序不应该中止吗?
系统信息
Docker version: 19.03.5
node image version: 11.13.0

uname -v
#31~18.04.1-Ubuntu SMP Tue Nov 17 10:48:34 UTC 2020

最佳答案

V8 开发人员在这里。 --max-old-space-size flag 不直接控制整个进程的内存消耗;它限制了 V8 托管(即垃圾收集)堆的一部分(最大部分),这是放置所有 JavaScript 对象的内存块。除了这个“旧空间”,V8 还有一个(小得多的)“新空间”;而且除了V8的托管堆之外,进程中还有很多其他的内存消费者:例如,在V8中,解析器和编译器使用托管堆之外的内存;然后除了 V8 之外,Node 还把一堆东西放在了内存中。根据嵌入器(即 Node )和执行代码的确切作用,大字符串和 ArrayBuffers 也可以存在于托管堆之外。
简而言之,--max-old-space-size给你一个旋钮来影响将使用多少内存,但你设置的限制不是进程整体内存消耗的限制。 (相比之下,在 Chrome 中,通常大约三分之一的渲染器进程的内存是 V8 的托管堆,尽管取决于网站所做的两个方向都有明显的异常值。我不知道 Node 的典型数字。)

关于node.js - 常驻内存大于 --max-old-space-size 阈值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66433965/

相关文章:

docker - 如何将elasticsearch模板与docker镜像捆绑在一起?

node.js - 如何从在 docker 容器中运行的应用程序连接在我的机器上运行的 redis

ubuntu - Guacamole Guacd 安装 Ubuntu

javascript - 将前导零添加到 moment.js 时间

node.js - npm 找不到 js 文件

docker - 使用私有(private) docker 镜像部署 gcloud 应用程序

apache - 站点文件夹的 www-data 和组读取问题

python - 如何在开发机器上强制 ImportError? (密码模块)

node.js - 像Instagram一样使用mongodb和node js的社交网络

javascript - 在 javascript string.replace(from, to, index form) 中替换特定索引后的字符串