npm build 给出“接近堆限制分配失败的无效标记压缩”

Posted

技术标签:

【中文标题】npm build 给出“接近堆限制分配失败的无效标记压缩”【英文标题】:npm build gives "Ineffective mark-compacts near heap limit Allocation failed" 【发布时间】:2019-10-14 16:23:31 【问题描述】:

我有一个 reactjs/typescript 项目,在 Windows 10 上运行。我正在尝试使用 ts-scripts 构建

"rimraf ../wwwroot/* && react-scripts-ts build && copyfiles ./build/**/* ../wwwroot/ -u 1

这之前工作正常,但是当我删除 node_modules-folder 时,重新运行 npm install-command 然后上面的命令我收到错误消息

致命错误:在堆限制分配附近标记压缩无效 失败 - javascript 堆内存不足

我不知道为什么。谷歌搜索后我看到了

NODE_OPTIONS="–max-old-space-size=2048" 但我不知道该放在哪里

完整的错误信息

最后几次 GC

[11376:0000024682F49880]    60039 ms: Mark-sweep 2034.1 (2085.2) -> 2033.7 (2085.2) MB, 1029.4 / 0.0 ms  (average mu = 0.073, current mu = 0.006) allocation failure scavenge might not succeed
[11376:0000024682F49880]    61094 ms: Mark-sweep 2034.4 (2085.2) -> 2034.1 (2085.7) MB, 1047.7 / 0.0 ms  (average mu = 0.039, current mu = 0.007) allocation failure scavenge might not succeed


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

    0: ExitFrame [pc: 000001CDF84DC5C1]
Security context: 0x007044b9e6e1 <JSObject>
    1: bindChildrenWorker(aka bindChildrenWorker) [000001AD1C0ACD59] [C:\Users\robcar\source\repos\Boost\Boost.Web\ClientApp\node_modules\typescript\lib\typescript.js:~27657] [pc=000001CDF8FA47CA](this=0x03da79d826f1 <undefined>,node=0x034b8724ab71 <NodeObject map = 000000660468F931>)
    2: bind(aka bind) [000001AD1C0AE2D9] [C:\Users\robcar\source\repos\B...

FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
 1: 00007FF6B5EA121A v8::internal::GCIdleTimeHandler::GCIdleTimeHandler+4810
 2: 00007FF6B5E7A5B6 node::MakeCallback+4518
 3: 00007FF6B5E7AFA0 node_module_register+2160
 4: 00007FF6B610B3EE v8::internal::FatalProcessOutOfMemory+846
 5: 00007FF6B610B31F v8::internal::FatalProcessOutOfMemory+639
 6: 00007FF6B6649304 v8::internal::Heap::MaxHeapGrowingFactor+11476
 7: 00007FF6B663FA67 v8::internal::ScavengeJob::operator=+25543
 8: 00007FF6B663DFDC v8::internal::ScavengeJob::operator=+18748
 9: 00007FF6B6646F57 v8::internal::Heap::MaxHeapGrowingFactor+2343
10: 00007FF6B6646FD6 v8::internal::Heap::MaxHeapGrowingFactor+2470
11: 00007FF6B61E9DD7 v8::internal::Factory::NewFillerObject+55
12: 00007FF6B6281ABA v8::internal::WasmJs::Install+29530
13: 000001CDF84DC5C1

【问题讨论】:

【参考方案1】:

我遇到了类似的问题,虽然是在 Mac 电脑上。 设置环境变量对我有用。这样,您的节点进程将获取该值并独立于您正在运行的脚本使用它。

export NODE_OPTIONS=--max_old_space_size=4096

再次运行您的命令。祝你好运!

【讨论】:

嗨 eespejel。感谢您的回复并指导我了解环境变量。我已经在 Windows 上测试了这个(通过菜单),但它没有工作:/。如果任何其他 Windows 用户让它工作,请在下面发表评论。 在我的情况下,我正在编写的代码存在内存泄漏,修复代码解决了这个问题。【参考方案2】:

我在 Windows 上遇到了同样的问题。解决方案是在运行 npm run build 之前设置 NODE_OPTIONS 变量。要设置这个变量,只需运行set NODE_OPTIONS=--max_old_space_size=8192

【讨论】:

这有助于解决问题。如果问题在任何依赖库中,其他选项将不起作用。【参考方案3】:

我已经面临这个问题一段时间了。该问题很可能是由大型 .js 文件的依赖项或组件引起的。我目前正在使用this package 成功解决此问题。

你基本上是全局安装的:

npm install -g increase-memory-limit

然后从你的项目根目录中运行:

increase-memory-limit

这将在您的node_modules/.bin/* 文件内的所有节点调用中附加--max-old-space-size=4096

【讨论】:

这不是解决问题,而是破坏了我的运行时间。必须删除和 npm install 才能解决问题。 这是一个非常危险的解决方案。设置 NODE_OPTIONS 传递参数 是的,对我来说也是如此。打破一切【参考方案4】:

我使用的解决方案是将node js版本从v10升级到v12


命令export NODE_OPTIONS=--max_old_space_size=4096 有效但有限制,例如你的机器上应该有足够的内存来运行生产版本。

【讨论】:

【参考方案5】:

我不认为解决方案是增加内存限制。这样,问题总是会被推迟。

我遇到过两次这个问题。我已经解决了,每次:

    使用特定版本的nodev12.11.1react v16.13.1react-scripts v3.2.0); 从npm 切换到yarnnode v12.11.1react v16.13.1react-scripts v3.4.1)。

此外,检查您的package.json,删除package-lock.json,删除node-modules 文件夹并尝试再次安装您的依赖项。

接下来尝试构建您的项目。

【讨论】:

这在我的情况下不起作用。当我们执行npm install 时,它会显示漏洞并且不允许我们使用旧版本的react-script。我使用了--max-old-space,并将我的VM内存增加到2GB 我同意这个答案。增加内存限制只会推迟崩溃。【参考方案6】:

我在增加节点 max_old_space 后得到了修复。这是修复。

而不是运行 npm start 或 ng start。运行以下命令

node --max_old_space_size=8048 ./node_modules/@angular/cli/bin/ng serve

您也可以在package.json 文件中添加命令

"start": "node --max_old_space_size=8048 ./node_modules/@angular/cli/bin/ng serve"

【讨论】:

【参考方案7】:

问题的根本原因是源文件过大。

您可以分两步解决问题。

    首先尝试增加空间大小并检查应用程序。如果问题是由您的源代码引起的,则可以通过增加节点堆大小来解决,如下所示,
"start": "react-scripts --max_old_space_size=4096 start",
"build": "react-scripts --max_old_space_size=4096 build"
    第二步是设置环境变量。 如果问题出在您的依赖项中,您可能需要全局增加节点堆分配来解决问题。 对于 Windows:set NODE_OPTIONS=--max_old_space_size=4096 对于 Linux:export NODE_OPTIONS=--max_old_space_size=4096

另请注意,如果您使用的是 512MB 等非常低的内存,则必须将其升级到至少 2GB 以获得更好的结果。

这里我使用了 4096MB = 4GB 大小,但是您可以根据您的机器配置特别是 RAM 来更改它。您可以将其设置为 2GB 或 1GB 并检查应用程序。

【讨论】:

【参考方案8】:

这是我在 package.json 运行命令中写的

“脚本”: “构建”:“节点--max_old_space_size=4096 build/build.js”

基本上,您必须在实际构建命令之前运行 --max_old_space_size=4096

【讨论】:

【参考方案9】:

我在Nuxt.js 环境中也一直在努力解决这个问题。

正如每个人在这里所说,应用 --max_old_space_size=size 并提供大量提供似乎对我有用。但是,由于我对我的 Nuxt.js 应用程序堆栈进行了一些额外的修复,因此再次出现了相同的症状......

此外,我还尝试了 Node.js 选项 --heapsnapshot-near-heap-limit=number 并且它似乎可以工作,而不是持久。

不管怎样,除了通过here 或其他地方搜索另一个修复程序外,我还打算进行线路审查,以便我可以预期我们的应用程序堆栈中是否存在冗余。

【讨论】:

以上是关于npm build 给出“接近堆限制分配失败的无效标记压缩”的主要内容,如果未能解决你的问题,请参考以下文章

vue中Npm run build 根据环境传递参数方法来打包不同域名

前端项目打包后压缩工具npm-build-zip

前端项目打包后压缩工具npm-build-zip

关于vue的npm run dev和npm run build

npm 在 windows 上安装 windows-build-tools

搭建npm私有镜像仓库,天下苦于npm build久矣