构建 Angular 项目导致内存不足

Posted

技术标签:

【中文标题】构建 Angular 项目导致内存不足【英文标题】:Building Angular project lead to heap out of memory 【发布时间】:2018-12-26 18:36:30 【问题描述】:

尝试在带有 -aot 标志的 Linux 服务器上构建 Angular 项目时,出现错误。我尝试将我的实例升级到更高的 CPU 内核、更多的 RAM 并打开 SWAP 分区,但错误仍然发生得更快。

这里是在尝试从终端以及带有我使用的标志的命令构建时。

ng build --target=production --environment=prod --aot
Your global Angular CLI version (1.7.2) is greater than your local
version (1.4.7). The local Angular CLI version is used.

To disable this warning use "ng set --global warnings.versionMismatch=false".
 10% building modules 5/5 modules 0 activeTemplate parse warnings:                 
The <template> element is deprecated. Use <ng-template> instead ("
[WARNING ->]<template [ngIf]="!isClosed">
  <div [class]="'alert alert-' + type" role="alert" [ngClass]="classes""): ng:///****************node_modules/ngx-bootstrap/alert/alert.component.d.ts.AlertComponent.html@1:0
 92% chunk asset optimization                                                             
<--- Last few GCs --->

  133611 ms: Mark-sweep 1302.6 (1435.2) -> 1297.8 (1435.2) MB, 1112.6 / 0.0 ms [allocation failure] [GC in old space requested].
  134724 ms: Mark-sweep 1297.8 (1435.2) -> 1297.7 (1435.2) MB, 1112.7 / 0.0 ms [allocation failure] [GC in old space requested].
  135854 ms: Mark-sweep 1297.7 (1435.2) -> 1302.7 (1406.2) MB, 1129.8 / 0.0 ms [last resort gc].
  136983 ms: Mark-sweep 1302.7 (1406.2) -> 1307.9 (1406.2) MB, 1128.8 / 0.0 ms [last resort gc].


<--- JS stacktrace --->

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

Security context: 0xb8bacacfb39 <JS Object>
    1: find_variable [0xb8baca04381 <undefined>:~3539] [pc=0xbdb4151ee32] (this=0xa9144042161 <an AST_Function with map 0xd6ccb950f99>,name=0x1f852792bb29 <String[12]: DOMException>)
    2: visit [0xb8baca04381 <undefined>:3449] [pc=0xbdb4151d969] (this=0x3da6d780b621 <a TreeWalker with map 0xd6ccb9394c9>,node=0x2f9919fb8e91 <an AST_SymbolRef with map 0xd6ccb9628c9>,descend=0x2e68ca83edd1 <JS Fu...

FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - javascript heap out of memory
 1: node::Abort() [ng]
 2: 0x109bf8c [ng]
 3: v8::Utils::ReportApiFailure(char const*, char const*) [ng]
 4: v8::internal::V8::FatalProcessOutOfMemory(char const*, bool) [ng]
 5: v8::internal::Factory::NewInternalizedStringImpl(v8::internal::Handle<v8::internal::String>, int, unsigned int) [ng]
 6: v8::internal::StringTable::LookupString(v8::internal::Isolate*, v8::internal::Handle<v8::internal::String>) [ng]
 7: v8::internal::LookupIterator::PropertyOrElement(v8::internal::Isolate*, v8::internal::Handle<v8::internal::Object>, v8::internal::Handle<v8::internal::Object>, bool*, v8::internal::LookupIterator::Configuration) [ng]
 8: v8::internal::Runtime::GetObjectProperty(v8::internal::Isolate*, v8::internal::Handle<v8::internal::Object>, v8::internal::Handle<v8::internal::Object>) [ng]
 9: 0xed3501 [ng]
10: v8::internal::Runtime_KeyedGetProperty(int, v8::internal::Object**, v8::internal::Isolate*) [ng]
11: 0xbdb262092a7
Aborted (core dumped)

我尝试了这里提到的解决方案,https://www.npmjs.com/package/increase-memory-limit 但还是没有运气

【问题讨论】:

【参考方案1】:

对于产品构建,运行以下命令:

node --max_old_space_size=4096 node_modules/@angular/cli/bin/ng build --目标生产

更多优化标志,如下命令:

它有内置的缓存清除和其他好东西:

node --max_old_space_size=4096 node_modules/@angular/cli/bin/ng build --target production --build-optimizer --vendor-chunk

【讨论】:

只是出于好奇,它必须以您编写的相同语法使用。不能像我上面用的那样直接使用ng build? 它对我不起作用。我的 PC RAM 是 16 GB,11 GB 是免费的【参考方案2】:

尝试运行

节点 --max-old-space-size=8192

其中 8192 是以 MB 为单位的大小

【讨论】:

我什么时候应该尝试 ng build?在我运行之后?【参考方案3】:

按照angular-cli repository 中的Filipe Silva 建议,在package.json 文件的scripts 部分添加一个新条目:

"ng-high-memory": "node --max_old_space_size=8000 ./node_modules/@angular/cli/bin/ng",

并以这种方式使用它:

npm run ng-high-memory -- 

您必须记住在参数前使用双破折号,否则可能无法正确解析:

npm run ng-high-memory -- serve

【讨论】:

【参考方案4】:

这看起来不像是硬件限制问题,可以通过升级内存或处理器来解决。 我曾经有一个构建耗尽内存,但结果证明有一个循环引用,其中源文件 A 需要源文件 B,然后 B 也需要 A。这当然是代码设计问题。

我建议你先尝试一个简单的构建并检查它是否顺利。

ng build

此外,Angular 文档提到,当使用 ng build --prod(而不是 --target=production)时,它会执行 AOT 编译等:

https://angular.io/guide/deployment

--prod 元标志使用以下优化功能。

Ahead-of-Time (AOT) 编译:预编译 Angular 组件模板。

生产模式:部署启用生产模式的生产环境。

您可能想要安装最新版本的 Angular CLI,看看是否有帮助。

【讨论】:

如果不提前编译到问题,它工作正常,问题仅在使用 -aot 标志时发生。 您是否尝试仅使用ng build --prod 命令。正如我上面提到的,文档声明这也将进行 AOT 编译。它完成了生产模式所需的一切,因此您无需使用任何其他标志。【参考方案5】:

我在 Angular 4 项目中遇到了同样的问题。问题是我的 Node Js 版本与 Angular 4 不兼容,我安装了 Node Js v6.17.1 并为我解决了问题。

有关 Angular 和 Node Js 兼容性的更多详细信息,您可以访问此链接:Is there a compatibility list for Angular / Angular-CLI and Node.js?

【讨论】:

【参考方案6】:

我遇到了同样的问题。作为添加交换文件的解决方案对我有用。

【讨论】:

请在您的回答中提供更多详细信息。正如目前所写的那样,很难理解您的解决方案。

以上是关于构建 Angular 项目导致内存不足的主要内容,如果未能解决你的问题,请参考以下文章

Azure 构建上的 JavaScript 堆内存不足

glDrawArrays 导致内存不足

虚拟大小导致程序内存不足

linux 部署项目过多,服务器内存又不足,导致部分项目被迫挂掉解决方法

在构建角度cli时做错误做什么 - 内存不足问题

如何避免由于太多ajax调用而导致浏览器内存不足错误