繁体   English   中英

节点 --max_old_space_size 不工作

[英]node --max_old_space_size is not working

节点版本:6.9.x

我的应用程序给了我FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory错误。

所以我尝试使用max_old_space_size标志更改内存分配

在执行我的 server.js 时,我给出了--max_old_space_size=4096参数。

但是,它不断崩溃,并出现与以前相同的错误。 另外,我注意到崩溃时抛出的错误中的数字。 看起来它仍然是 1.4 GB 的默认分配。

这是我的错误信息:

<--- Last few GCs --->

   84567 ms: Mark-sweep 1375.1 (1401.9) -> 1374.7 (1402.9) MB, 88.7 / 0.4 ms (+ 0.8 ms in 3 steps since start of marking, biggest step 0.5 ms) [allocation failure] [GC in old space requested].
   84648 ms: Mark-sweep 1374.7 (1402.9) -> 1374.7 (1402.9) MB, 81.3 / 0.0 ms [allocation failure] [GC in old space requested].
   84734 ms: Mark-sweep 1374.7 (1402.9) -> 1374.3 (1401.9) MB, 86.0 / 0.0 ms [last resort gc].
   84825 ms: Mark-sweep 1374.3 (1401.9) -> 1374.0 (1400.9) MB, 90.9 / 0.0 ms [last resort gc].


<--- JS stacktrace --->

==== JS stack trace =========================================

Security context: 0x1bf641bcfb39 <JS Object>
    1: slowToString [buffer.js:460] [pc=0x2f7049a5d3d5] (this=0x93e46a2d6b1 <an Uint8Array with map 0x13be78e068d9>,encoding=0x1bf641bdd309 <String[4]: utf8>,start=53,end=3522765)
    2: toString [buffer.js:~488] [pc=0x2f70499b77a6] (this=0x93e46a2d6b1 <an Uint8Array with map 0x13be78e068d9>)
    3: arguments adaptor frame: 3->0
    4: deserialize [/opt/myServer/node_modu...

FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory
 1: node::Abort() [node]
 2: 0x10d2fbc [node]
 3: v8::Utils::ReportApiFailure(char const*, char const*) [node]
 4: v8::internal::V8::FatalProcessOutOfMemory(char const*, bool) [node]
 5: v8::internal::Factory::NewRawOneByteString(int, v8::internal::PretenureFlag) [node]
 6: v8::internal::Factory::NewStringFromOneByte(v8::internal::Vector<unsigned char const>, v8::internal::PretenureFlag) [node]
 7: v8::internal::Factory::NewStringFromUtf8(v8::internal::Vector<char const>, v8::internal::PretenureFlag) [node]
 8: v8::String::NewFromUtf8(v8::Isolate*, char const*, v8::String::NewStringType, int) [node]
 9: node::StringBytes::Encode(v8::Isolate*, char const*, unsigned long, node::encoding) [node]
10: node::Buffer::Utf8Slice(v8::FunctionCallbackInfo<v8::Value> const&) [node]
11: v8::internal::FunctionCallbackArguments::Call(void (*)(v8::FunctionCallbackInfo<v8::Value> const&)) [node]
12: 0x9da914 [node]
13: 0x9daffe [node]
14: 0x2f7047a092a7
Aborted (core dumped)

在“最后几次 GC”部分中,提到的内存大小始终在 1404 MB 左右。 我究竟做错了什么?

系统不能再分配内存了吗?

确保将选项放在脚本文件名之前:

  • 正确node --max-old-space-size=10000 index.js
  • 不正确node index.js --max-old-space-size=10000

这个让我有一段时间了。

现在这个标志没用了:

>= 12 的 Node 版本不需要使用 --optimize_for_size 和 --max_old_space_size 标志,因为 JavaScript 堆限制将基于可用内存。

如果您使用较新版本的 NodeJ,您可能不需要它,但它应该使用所有可用的 RAM。 然而,人们仍然达到 2gb 或类似的内存限制。

所以这里是解决方案:

您可以为单个脚本添加标志,但我发现它并不总是有效。 我通常使用一些在 shell 上运行命令的 CI 工具,所以对我来说,在 package.json 脚本部分中没有标志是可以的,它也可能是你的一个选择。 还有2个选项。 所以所有3:

选项 1. 将标志设置为单节点脚本:

node --max-old-space-size=4076 /path/to/script.js

选项 2. 为单壳设置环境变量:

NODE_OPTIONS="--max-old-space-size=4076"
node /path/to/script.js

选项 3. 为这个 shell 和这个 shell 产生的所有进程设置 env 变量:

export NODE_OPTIONS="--max-old-space-size=4076"
node /path/to/script.js

当第一个不起作用时,选项 #3帮助了我很多次:)

确保您一直在使用 64 位 NodeJS。 我有一个类似的问题,毕竟我发现我的问题与 NodeJS 本身有关。 32 位版本的 NodeJS 最多只能给你 2GB 的空间。

尝试使用 --max-old-space-size=4096,如果它不起作用,请查看您是否有空闲内存来分配 4gb。

如果您使用的是 express 生成器,那么在 package.json 更新脚本中

scripts": {

   "start" :"node --max-old-space-size=4076 ./bin/www"

 }

我的解决方案与html有关。 我使用的是 Vue 2,在我的 html 模板上,我在 if 语句中使用了动态数据:

<div>
  {{variableOne
    ?variableOne
    :variableTwo}}
  </div> 

所以我的错误是,您似乎不能在括号内的多行中编写 if 语句,所以我修复了它,只在一行中编写代码:

<div>
  {{variableOne?variableOne:variableTwo}}
  </div> 

在运行 npm 命令之前设置export NODE_OPTIONS="--max-old-space-size=16384"将起作用

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM