Javascript記憶體溢位,FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory

sayok_why發表於2020-11-11

問題:

        在npm run build的時候,提示報錯,報錯資訊如下:TAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory

FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory
1: node::Abort() [node]
2: 0x11e7fec [node]
3: v8::Utils::ReportOOMFailure(char const*, bool) [node]
4: v8::internal::V8::FatalProcessOutOfMemory(char const*, bool) [node]
5: v8::internal::Factory::NewRawTwoByteString(int, v8::internal::PretenureFlag) [node]
6: v8::internal::String::SlowFlatten(v8::internal::Handle, v8::internal::PretenureFlag) [node]
7: v8::internal::Runtime_StringCharCodeAtRT(int, v8::internal::Object**, v8::internal::Isolate*) [node]

原因:

        報錯CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory堆記憶體不足,這裡說的JavaScript記憶體不足,其實就是 Node。因為 Node 是基於V8引擎,在一般的後端開發語言中,在基本的記憶體使用上沒有什麼限制。但是在 Node 中通過 JavaScript 使用記憶體時只能使用部分記憶體(64位系統下約為1.4 GB,32位系統下約為0.7 GB),這就是我們編譯專案時為什麼會出現記憶體洩露了。因為前端專案如果非常的龐大,webpack 編譯時就會佔用很多的系統資源,如果超出了V8對 Node 預設的記憶體限制大小就會出現上面的報錯。

解決辦法:

        V8提供了選項讓我們使用更多的記憶體。Node 在啟動時可以傳遞 --max-old-space-size 或 --max-new-space-size 來調整記憶體大小的使用限制。如果遇到 Node 無法分配足夠記憶體給 JavaScript 的情況,可以用這個辦法來放寬V8預設的記憶體限制,避免在執行過程中稍微多用了一些記憶體就輕易崩潰。

        傳遞 --max-old-space-size 來調整記憶體大小的使用限制,vue直接在package.json中的命令中的 node 後面寫上 --max_old_space_size=4096 就好了,一般設定記憶體大小是4G就可以了,不過具體的大小可以根據自己的專案情況來進行調整。

"scripts": {
        "dev": "webpack-dev-server  --inline --progress --config build/webpack.dev.conf.js",
        "start": "npm run dev",
        "build": "node --max_old_space_size=4096 build/build.js"
    },

 

相關文章