angular4 JavaScript內(nèi)存溢出問(wèn)題
最近在寫(xiě)基于angular4的項(xiàng)目的時(shí)候,在build --prod的時(shí)候,突然措手不及的蹦出個(gè)報(bào)錯(cuò),大致錯(cuò)誤如下:
70% building modules 1345/1345 modules 0 active <--- Last few GCs ---> ms: Mark-sweep 703.9 (837.9) -> 701.4 (811.9) MB, 331.3 / 0 ms [allocation failure] [GC in old space requested]. ms: Mark-sweep 701.4 (811.9) -> 701.4 (790.9) MB, 350.5 / 0 ms [allocation failure] [GC in old space requested]. ms: Mark-sweep 701.4 (790.9) -> 698.0 (760.9) MB, 433.7 / 0 ms [last resort gc]. 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:\dev\cobalt_wp\node_modules\webpack\lib\FlagDependencyExportsPlugin.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
注:這里的代碼并不是我的真實(shí)報(bào)錯(cuò)代碼,編譯時(shí)間太長(zhǎng),忘記截取了,大致的錯(cuò)誤基本一樣,如果你遇到了相同的問(wèn)題,恭喜了,往下看能找到答案!
當(dāng)時(shí)我是蒙圈了,一直都編譯的挺好,怎么突然就溢出了呢?
可能的原因有如下:
1.angular4 在編譯的時(shí)候,對(duì)CPU和內(nèi)存的需求比較大,當(dāng)文件數(shù)量很多的時(shí)候,可能會(huì)出現(xiàn)內(nèi)存不足的情況(有可能);
2.當(dāng)代碼出現(xiàn)大量大數(shù)據(jù)的循環(huán)或者死循環(huán)(sever階段并沒(méi)有出現(xiàn)溢出,這個(gè)概率應(yīng)該不大);
3.angular訂閱的數(shù)據(jù)在 ngOnDestroy 階段沒(méi)有被銷(xiāo)毀,造成大量數(shù)據(jù)占用內(nèi)存(有可能)
目前沒(méi)有查到具體是什么原因造成的,哪位大神知道的,請(qǐng)不吝賜教,謝謝!
解決這個(gè)問(wèn)題的過(guò)程很波折,這里就不說(shuō)了,你們估計(jì)也不想知道,下面說(shuō)一下解決方案吧:
核心思路是運(yùn)用v8引擎的舊屬性: --max_old_space_size 來(lái)修改內(nèi)存上線,至于這個(gè)屬性在哪里設(shè),就是一個(gè)磨人的小妖精了!
修改目錄: my-project/node_modules/.bin 找到 ng.cmd :
@IF EXIST "%~dp0\node.exe" ( "%~dp0\node.exe" --max_old_space_size=8192 "%~dp0\..\._@angular_cli@1.0.0@@angular\cli\bin\ng" %* ) ELSE ( @SETLOCAL @SET PATHEXT=%PATHEXT:;.JS;=;% node --max_old_space_size=8192 "%~dp0\..\._@angular_cli@1.0.0@@angular\cli\bin\ng" %* )
修改目錄: my-project/node_modules/.bin 找到 ngc.cmd :
@IF EXIST "%~dp0\node.exe" ( "%~dp0\node.exe" --max_old_space_size=8192 "%~dp0\..\._@angular_compiler-cli@4.0.1@@angular\compiler-cli\src\main.js" %* ) ELSE ( @SETLOCAL @SET PATHEXT=%PATHEXT:;.JS;=;% node --max_old_space_size=8192 "%~dp0\..\._@angular_compiler-cli@4.0.1@@angular\compiler-cli\src\main.js" %* )
看到里面的--max_old_space_size設(shè)置了嗎? 至于數(shù)字設(shè)多少,你們自己看著辦吧,我的項(xiàng)目比較大,設(shè)個(gè)大點(diǎn)的值,以防不測(cè),哈哈!
然后執(zhí)行 ng build --prod ,你以為這樣就行了嗎?這才是關(guān)鍵的地方!
本人親測(cè),如上設(shè)置,再執(zhí)行編譯依然會(huì)報(bào)內(nèi)存溢出,貌似并沒(méi)什么卵用!把當(dāng)前目錄切換到 my-project/node_modules/.bin 然后再執(zhí)行 ng build --prod , 世界一下子就和平了! 本人親測(cè)有效,收好不謝!
如果你想問(wèn),為什么不加 --aot , 這個(gè)就留個(gè)你自己先想想吧!
好了,忙里抽閑,分享一下這個(gè)大坑的填坑方法, 希望對(duì)大家有用!
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
angular2中使用第三方j(luò)s庫(kù)的實(shí)例
下面小編就為大家分享一篇angular2中使用第三方j(luò)s庫(kù)的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-02-02AngularJS實(shí)現(xiàn)星星等級(jí)評(píng)分功能
這篇文章主要為大家詳細(xì)介紹了AngularJS實(shí)現(xiàn)星星等級(jí)評(píng)分功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09AngularJS在IE下取數(shù)據(jù)總是緩存問(wèn)題的解決方法
這篇文章主要介紹了AngularJS在IE下取數(shù)據(jù)總是緩存問(wèn)題的解決方法,分析了問(wèn)題的原因及AngularJS設(shè)置禁止IE對(duì)ajax緩存的實(shí)現(xiàn)方法,需要的朋友可以參考下2016-08-08angular實(shí)現(xiàn)form驗(yàn)證實(shí)例代碼
本篇文章主要介紹了angular實(shí)現(xiàn)form驗(yàn)證實(shí)例代碼,具有一定的參考價(jià)值,有興趣的可以了解一下。2017-01-01Angular 多級(jí)路由實(shí)現(xiàn)登錄頁(yè)面跳轉(zhuǎn)(小白教程)
這篇文章主要介紹了Angular 多級(jí)路由實(shí)現(xiàn)登錄頁(yè)面跳轉(zhuǎn)(小白教程),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11angular4應(yīng)用中輸入的最小值和最大值的方法
這篇文章主要介紹了angular4應(yīng)用中輸入的最小值和最大值的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-05-05