Angular 2 AoT Heep Errors

时间:2016-10-09 16:16:48

标签: angular angular2-routing angular2-directives angular2-services

AoT编译导致“JavaScript堆内存不足”错误

我正在尝试按照angular.io

上提供的AoT指南编译我的项目

下面是aot

的typesccript配置文件

{ "compilerOptions": { "emitDecoratorMetadata": true, "experimentalDecorators": true, "module": "es2015", "moduleResolution": "node", "noImplicitAny": false, "suppressImplicitAnyIndexErrors": true, "noEmitOnError": true, "removeComments": true, "sourceMap": false, "target": "es5", "outDir": "../content/app/" }, "angularCompilerOptions": { "genDir": "aot", "skipMetadataEmit": true }, "exclude": [ "node_modules", "typings/main", "typings/main.d.ts" ] }

我正在使用以下命令进行编译:

D:\MyProject\node_modules\.bin>ngc -p ../../app/tsconfig-aot.json

编译需要一些时间,最后会出现以下错误:

<--- Last few GCs --->

  215225 ms: Mark-sweep 1327.9 (1434.3) -> 1316.1 (1434.3) MB, 1233.5 / 0.0 ms [allocation failure] [GC in old space requested].
  216639 ms: Mark-sweep 1316.1 (1434.3) -> 1316.1 (1434.3) MB, 1413.5 / 0.0 ms [allocation failure] [GC in old space requested].
  217985 ms: Mark-sweep 1316.1 (1434.3) -> 1320.4 (1403.3) MB, 1346.7 / 0.0 ms [last resort gc].
  219337 ms: Mark-sweep 1320.4 (1403.3) -> 1324.6 (1403.3) MB, 1351.5 / 0.0 ms [last resort gc].


<--- JS stacktrace --->

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

Security context: 00000023CEBCFB61 <JS Object>
    1: copyProperties [D:\MyProject\node_modules\typescript\lib\typescript.js:1462] [pc=000001870A3EC95C] (this=000000AAE12C6A41 <an Object with map 00000279F6259FA1>,source=000002E70921E389 <an Object with map 00000279F62D8539>,target=000002ED3C5C7691 <an Object with map 000000D6F40CD1C9>)
    2: objectTypeRelatedTo [D:\MyProject\node_modules\typescript\lib\typescript.js:...

FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory

D:\MyProject\node_modules\.bin>

我正在尝试编译的项目有467个文件。

3 个答案:

答案 0 :(得分:1)

如果您在尝试接受的答案后仍然在Windows上遇到此问题,可以使用以下解决方法(@ angular / compiler-cli 2.2.1):

node --max-old-space-size=8192 node_modules/@angular/compiler-cli/src/main.js -p tsconfig-aot.json

这可能不适用于将来的更新,因为如果您解释./node_modules/.bin/ngc,上述所有内容都指向实际的js文件。

答案 1 :(得分:0)

以下是我最终能够使用ngc编译我的项目的方式(经过一个月的搜索并且每次都失败)

由于某种原因,它不能在Windows上运行,但它可以在mac机器上运行

首先在JIT模式下使用main.ts进行编译

./node_modules/.bin/ngc -p tsconfig-aot.json

然后将main.ts更改为AoT模式并运行

node --max-old-space-size=8192 ./node_modules/.bin/ngc -p tsconfig-aot.json

我确实不得不使用8192(8GB)以免内存不足(我的项目最远为5-6GB)

然后构建汇总包

node --max-old-space-size=8192 node_modules/.bin/rollup -c rollup.js

如果一切顺利,现在你应该有一个生产包。

关于延迟加载的说明 - 我没有使用延迟加载,就像我一样,ngc只是忽略所有延迟加载的模块,并且不为它们生成AoT文件。 我相信只有在您不打算生成生成版本并且将使用像SystemJS或Webpack这样的模块加载器来加载项目时,才会使用延迟加载

我的机器

screen shot 2016-11-03 at 10 29 06 am

答案 2 :(得分:0)

node --max_old_space_size=8192 ./node_modules/@angular/cli/bin/ng [command]

例如node --max_old_space_size=8192 ./node_modules/@angular/cli/bin/ng serve

在我的Windows机器上为我工作