驻留内存大于 --max-old-space-size 阈值?

wiz*_*z94 3 ubuntu memory-management v8 node.js docker

我正在我的服务器上运行一个 dockerized 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

Run Code Online (Sandbox Code Playgroud)

您可以看到我的应用程序驻留内存 (929M) 远远高于我的max-old-space-size值 (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
Run Code Online (Sandbox Code Playgroud)

jmr*_*mrk 6

V8 开发者在这里。该--max-old-space-size标志并不直接控制整个进程的内存消耗;它对 V8 的托管(即垃圾收集)堆的一部分(最大的部分)进行了限制,该堆是放置所有 JavaScript 对象的内存块。除了这个“旧空间”,V8还有一个(小得多的)“新空间”;除了V8的托管堆之外,进程中还有很多其他的内存消耗者:例如,在V8中,解析器和编译器使用托管堆之外的内存;然后除了 V8 之外,Node 也将一堆东西放入内存中。根据嵌入器(即 Node)和执行代码的具体功能,大字符串和 ArrayBuffer 也可以位于托管堆之外。

简而言之,--max-old-space-size为您提供了一个旋钮来影响将使用多少内存,但您设置的限制并不限制进程的总体内存消耗。(作为比较,在 Chrome 中,渲染器进程内存的大约三分之一通常是 V8 的托管堆,尽管根据网站的做法,两个方向上都有显着的异常值。我不知道 Node 的典型数字。)