正在设置--旧空间大小的最大值,但节点仍然超过限制,不会导致任何错误



我将最大大小设置为>512mb,但它似乎没有引起任何错误,它超过了限制并上升了1.3GB//em>。我知道节点在接近限制时会尝试GC,在超过设置限制时会出错。我正在运行测试,我希望不超过512mb的限制

OS:Ubuntu 20.04.2 LTS
节点版本:10.19.0

node --max-old-space-size=512 Server.js

我只需要知道这是否是正常行为

不,不是。

它使标志变得毫无意义。

通过一个简单的演示程序,标志可以按预期工作:

$ cat demo.js
let big = [];
while (true) {
big.push(new Array(10000));
}
$ node --version
v16.3.0
$ node --max-old-space-size=512 demo.js 
<--- Last few GCs --->
[20343:0x563cd38c25a0]     1112 ms: Mark-sweep 477.8 (523.7) -> 477.5 (525.7) MB, 158.4 / 0.0 ms  (average mu = 0.124, current mu = 0.011) allocation failure scavenge might not succeed

<--- JS stacktrace --->
FATAL ERROR: Reached heap limit Allocation failed - JavaScript heap out of memory
1: 0x563ccf1a6680 node::Abort() [node]
2: 0x563ccf0b28e9 node::FatalError(char const*, char const*) [node]
3: 0x563ccf332082 v8::Utils::ReportOOMFailure(v8::internal::Isolate*, char const*, bool) [node]
...

请注意,Node的命令行标志解析依赖于顺序。例如,如果运行node demo.js --max-old-space-size=512,则该标志将不适用于demo.js的执行。


如果这不能回答你的问题,那么请更清楚地说明你测量了什么。例如,如果您查看进程的总体内存使用情况,则预计会大于512MB,因为";旧空间";只是过程中的一部分——这是最可控的部分。根据你的应用程序的功能,可能会有其他内存消费者。虽然我会发现额外的800MB令人惊讶,但任何事情都是可能的,只要你不提供一个repro,或者更多关于你测量了什么以及如何测量的细节。

相关内容

最新更新