zoukankan      html  css  js  c++  java
  • angular4 JavaScript内存溢出问题 (FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed

    最近在写基于angular4的项目的时候,在build --prod的时候,突然措手不及的蹦出个报错,大致错误如下:

    70% building modules 1345/1345 modules 0 active
    <--- Last few GCs --->
    
      317945 ms: Mark-sweep 703.9 (837.9) -> 701.4 (811.9) MB, 331.3 / 0 ms [allocation failure] [GC in old space requested].
      318296 ms: Mark-sweep 701.4 (811.9) -> 701.4 (790.9) MB, 350.5 / 0 ms [allocation failure] [GC in old space requested].
      318730 ms: Mark-sweep 701.4 (790.9) -> 698.0 (760.9) MB, 433.7 / 0 ms [last resort gc].
      319058 ms: Mark-sweep 698.0 (760.9) -> 692.7 (751.9) MB, 328.7 / 0 ms [last resort gc].
    
    
    <--- JS stacktrace --->
    
    ==== JS stack trace =========================================
    
    Security context: 00000298510373A9 <JS Object>
        1: /* anonymous */(aka /* anonymous */) [D:devcobalt_wp
    ode_moduleswebpacklibFlagDependencyExportsPlugin.js:77] [pc=0000026F721B51D6] (this=0000029851004131 <undefined>,dep=00000150FC6162C9 <a NormalModule with map 0000025741730C01>)
        2: arguments adaptor frame: 3->1
        3: InnerArrayForEach(aka InnerArrayForEach) [native array.js:~924] [pc=0000026F71EE3DCD] (this=000002985100413...
    
    FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - process out of memory

    注:这里的代码并不是我的真实报错代码,编译时间太长,忘记截取了,大致的错误基本一样,如果你遇到了相同的问题,恭喜了,往下看能找到答案!

    当时我是蒙圈了,一直都编译的挺好,怎么突然就溢出了呢?

    可能的原因有如下:

    1.angular4 在编译的时候,对CPU和内存的需求比较大,当文件数量很多的时候,可能会出现内存不足的情况(有可能);

    2.当代码出现大量大数据的循环或者死循环(sever阶段并没有出现溢出,这个概率应该不大);

    3.angular订阅的数据在 ngOnDestroy 阶段没有被销毁,造成大量数据占用内存(有可能)

    目前没有查到具体是什么原因造成的,哪位大神知道的,请不吝赐教,谢谢!

    解决这个问题的过程很波折,这里就不说了,你们估计也不想知道,下面说一下解决方案吧:

    核心思路是运用v8引擎的旧属性: --max_old_space_size 来修改内存上线,至于这个属性在哪里设,就是一个磨人的小妖精了!

    修改目录:  my-project/node_modules/.bin  找到 ng.cmd :

    @IF EXIST "%~dp0
    ode.exe" (
      "%~dp0
    ode.exe" --max_old_space_size=8192  "%~dp0..._@angular_cli@1.0.0@@angularcliin
    g" %*
    ) ELSE (
      @SETLOCAL
      @SET PATHEXT=%PATHEXT:;.JS;=;%
      node --max_old_space_size=8192  "%~dp0..._@angular_cli@1.0.0@@angularcliin
    g" %*
    )

    修改目录: my-project/node_modules/.bin  找到 ngc.cmd :

    @IF EXIST "%~dp0
    ode.exe" (
      "%~dp0
    ode.exe" --max_old_space_size=8192  "%~dp0..._@angular_compiler-cli@4.0.1@@angularcompiler-clisrcmain.js" %*
    ) ELSE (
      @SETLOCAL
      @SET PATHEXT=%PATHEXT:;.JS;=;%
      node --max_old_space_size=8192  "%~dp0..._@angular_compiler-cli@4.0.1@@angularcompiler-clisrcmain.js" %*
    )

    看到里面的--max_old_space_size设置了吗? 至于数字设多少,你们自己看着办吧,我的项目比较大,设个大点的值,以防不测,哈哈!

    然后执行 ng build --prod ,你以为这样就行了吗?这才是关键的地方!

    本人亲测,如上设置,再执行编译依然会报内存溢出,貌似并没什么卵用!把当前目录切换到 my-project/node_modules/.bin 然后再执行 ng build --prod , 世界一下子就和平了! 本人亲测有效,收好不谢!

    如果你想问,为什么不加 --aot , 这个就留个你自己先想想吧!

    好了,忙里抽闲,分享一下这个大坑的填坑方法, 希望对大家有用!

    原创不易,如需转载,请注明出处! 谢谢!

  • 相关阅读:
    SpringMVC+Spring3+hibernate4 开发环境搭建以及一个开发实例教程
    SpringMVC 理论与实用技术(二)文件上传
    导入导出封装工具类(二) jXLS Excel报表生成工具类
    导入导出封装的工具类 (一) 利用POI封装
    eclipse 鲜为人知的调试技巧,你用过多少
    前端框架(二)DIV多选复选框框的封装和MySql数据库存取
    WPF/Silverlight Layout 系统概述——Arrange(转)
    WPF/Silverlight Layout 系统概述——Measure(转)
    Border绘制虚线框(转)
    ImageSource使用心得(转)
  • 原文地址:https://www.cnblogs.com/liugang-vip/p/6857595.html
Copyright © 2011-2022 走看看