一、问题描述

执行npm run build之后报错:

报错信息:

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

之前一直是好的,加了以下代码之后出错:
1.dev_server.js中加了一个entry
```
entry: {
...,
"report.phantom.zeus":[
HOT_MIDDLEWARE_ENTRY,
path.resolve(PATHS.app, './views/effect/zeus/report-view/report.phantom.js')
]
}


2.webpack.config.common.js中加了一个entry

entry: {

...,

"report.phantom.zeus":[

path.resolve(PATHS.app, './views/effect/zeus/report-view/report.phantom.js')

]

}


3.webpack.config.prod.js中加了一个plugins

plugins: [

...,

new HtmlwebpackPlugin({

chunks:['report.phantom.zeus', 'vendor'],

hash:true,

template:'build/report-zeus.html',

filename: 'report-zeus.html'

})

]

<br  />
`npm run build`命令实际执行的一串命令集:
<br />

npm run clean:dist & npm run build:config & cross-env BABEL_ENV=production webpack -p --config ./build/webpack.config.prod.js --progress & npm run zip


## 二、原因分析 将`npm run build`命令集进行拆分,可分成四步: - npm run clean:dist
- npm run build:config
- cross-env BABEL_ENV=production webpack -p --config ./build/webpack.config.prod.js --progress
- npm run zip 看报错信息是在第三步报错的。
<br />
报错之前和之后的变化,共三处代码发生变化,经过测试发现是在 webpack.config.common.js 文件中加的 entry 的影响:

entry: {

...,

"report.phantom.zeus":[

path.resolve(PATHS.app, './views/effect/zeus/report-view/report.phantom.js')

]

}


增加一个 entry 意味着 webpack 编译的成本加大,看报错信息:

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

也是JavaScript堆内存溢出,`CALL_AND_RETRY_LAST`这个模块分配失败
<br />
查看下内存使用情况,执行`npm run build`之前内存占用7.87GB,执行之后一直上升直到大概10GB:
<br /> ![](https://img2018.cnblogs.com/blog/296720/201901/296720-20190117164457655-1324565848.png) <br /> ![](https://img2018.cnblogs.com/blog/296720/201901/296720-20190117164506958-1799457014.png) <br /> 看起来机器的内存似乎并没有撑爆,那为什么会内存溢出呢? <br /> Google搜索报错信息:

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


<br /> 搜索到以下比较有用的文章:
https://itbilu.com/nodejs/core/Ey_SnYXnx.html
https://github.com/npm/npm/issues/12741
https://github.com/nodejs/node/issues/10137
https://stackoverflow.com/questions/38558989/node-js-heap-out-of-memory
https://github.com/webpack/webpack/issues/1914 <br /> 提到的解决方案都是在`node`命令后面加`--max-old-space-size=4096`这个参数:
`node --max-old-space-size=4096` <br /> 解决方案截图: <br /> ![](https://img2018.cnblogs.com/blog/296720/201901/296720-20190117164522085-1513529120.jpg) ![](https://img2018.cnblogs.com/blog/296720/201901/296720-20190117164728388-1805966913.jpg) ![](https://img2018.cnblogs.com/blog/296720/201901/296720-20190117164530665-2122299789.jpg) ![](https://img2018.cnblogs.com/blog/296720/201901/296720-20190117164538370-979479307.jpg) <br /> 可是`npm run build`命令集里并没有`node`命令,怎么加呢? <br /> 在前端大神warpig的指点下,了解到`npm`、`webpack`等命令其实缩写命令,实际的命令前面是要加`node`命令的。 <br /> 所以`npm run build`命令中出错的命令:

cross-env BABEL_ENV=production webpack -p --config ./build/webpack.config.prod.js --progress

其实应该是:

cross-env BABEL_ENV=production node webpack -p --config ./build/webpack.config.prod.js --progress


<br /> 但直接运行这个命令会报错,提示`cross-env`这个命令不存在,经查询发现`cross-env`只是为了解决node环境变量的问题。 <br /> 运行`node webpack -p --config ./build/webpack.config.prod.js --progress`,还是报错: <br /> ![](https://img2018.cnblogs.com/blog/296720/201901/296720-20190117164611940-895429283.jpg) <br /> 当前路径下找不到webpack模块,改成:

node node_modules/webpack/bin/webpack.js -p --config ./build/webpack.config.prod.js --progress

就可以。

<br  />

加上指定V8引擎所占用的内存空间的参数`--max-old-space-size=4096`:

node --max-old-space-size=4096 node_modules/webpack/bin/webpack.js -p --config ./build/webpack.config.prod.js --progress

编译成功。

<br  />

在package.json中也加上这个参数,重新执行`npm run build`,打包成功。

<br  />

一句话总结:

> webpack打包时,由于要编译的内容太多,占用了过多内存(大概10GB-7.86GB=`2.14GB`),而在64位操作系统下,V8引擎(node运行环境)默认内存只有大约`1.43GB`(1.4G新生代内存+32MB老生代内存),`2.14GB>1.43GB`,导致内存溢出。

## 三、解决方案

`webpack` &nbsp;改成 &nbsp;`node --max-old-space-size=4096 node_modules/webpack/bin/webpack.js`
<br />
所以`npm run build`执行的是以下命令集:

npm run clean:dist & npm run build:config & cross-env BABEL_ENV=production node --max-old-space-size=4096 node_modules/webpack/bin/webpack.js -p --config ./build/webpack.config.prod.js --progress & npm run zip


## 四、参考资料
https://itbilu.com/nodejs/core/Ey_SnYXnx.html
https://github.com/webpack/webpack/issues/1914

[BUGCASE]Webpack打包报JavaScript堆内存泄漏的错误的更多相关文章

  1. Webpack打包报"JavaScript heap out of memory"错误

    问题 开发项目有一段时间了,随着项目越来越大,打包的时间也相应的变长了,打包时的内存也增多了.这时候产生了一个问题,在发布项目的时候,会出现JavaScript heap out of memory错 ...

  2. webpack打包---报错内存溢出javaScript heap out of memory

    今天, npm run build打包时,又报内存溢出了.所以记录一下,之前查了博客有一些解释. “报错CALL_AND_RETRY_LAST Allocation failed - JavaScri ...

  3. JVM的堆内存泄漏排查-性能测试

    JVM异常说明 https://testerhome.com/articles/24259 一文中已介绍了,JVM每个运行时区域--程序计数器 .Java虚拟机栈.本地方法栈.Java堆.方法区.直接 ...

  4. 性能测试之JVM的故障排查-堆内存泄漏

    JVM异常说明(超链接) 一文中已介绍了,JVM每个运行时区域--程序计数器 .Java虚拟机栈.本地方法栈.Java堆.方法区.直接内存发生OutOfMemoryError的不同原因和不同错误信息. ...

  5. JVM诊断及工具笔记(4) 使用visualvm分析JVM堆内存泄漏

    在这里感谢最近一直阅读我文章的小伙伴,如果觉得文章对你有用,可以帮忙关注转载,需要的时候可以及时找到文章. 背景 今年Q3季度我们在推广业务方使用Iceberg,当时为了让不同业务线的用户可以使用自己 ...

  6. 关于Javascript的内存泄漏问题的整理稿

    写了好长时间javascript小功能模块,从来没有关注过内存泄漏问题.记得以前写C++程序的时候,内存泄漏是个严重的问题,我想是时候关注一下了.网上找了篇文章,Mark一下.原文地址:http:// ...

  7. webpack 打包报错:One CLI for webpack must be installed. These are recommended choices, delivered as separate packages

    webpack 打包报错: One CLI for webpack must be installed. These are recommended choices, delivered as sep ...

  8. [one day one question] webpack 打包报错 Cannot assign to read only property 'exports' of object '#<Object>'

    问题描述: webpack 打包报错 Cannot assign to read only property 'exports' of object '#<Object>',这怎么破? 解 ...

  9. PerfView专题 (第二篇):如何寻找 C# 中的 Heap堆内存泄漏

    一:背景 上一篇我们聊到了如何去找 热点函数,这一篇我们来看下当你的程序出现了 非托管内存泄漏 时如何去寻找可疑的代码源头,其实思路很简单,就是在 HeapAlloc 或者 VirtualAlloc ...

随机推荐

  1. git 出现 error: bad signature fatal: index file corrupt

    一次大改版,提交了很多代码,但再次提交提交不了,也拉不下来仓库的代码 提示error bad signature fatal: index file corrupt 在项目有.git这同级打开Git ...

  2. DES 实现

    原理 加密 置换: IP逆置换: 迭代: PC-1置换: PC-2置换: 子秘钥的生成: 加密函数f: 解密 代码 // C语言实现 #include<stdio.h> #include& ...

  3. python100实例

    实例001:数字组合 题目 有四个数字:1.2.3.4,能组成多少个互不相同且无重复数字的三位数?各是多少? 程序分析 遍历全部可能,把有重复的剃掉. total=0 for i in range(1 ...

  4. Servlet学习笔记(四)

    目录 Servlet学习笔记(四) 一.会话技术Cookie.session 1. 什么是会话技术? 2. 会话技术有什么用? 3. Cookie 3.1 什么是Cookie? 3.2 使用Cooki ...

  5. 第4章 Function语意学

    第4章 Function语意学 目录 第4章 Function语意学 4.1 Member的各种调用方式 Nonstatic Member Function(非静态成员函数) virtual Memb ...

  6. Magicodes.IE 3.0重磅设计畅谈

    总体设计 Magicodes.IE导入导出通用库,支持Dto导入导出.模板导出.花式导出以及动态导出,支持Excel.Csv.Word.Pdf和Html. IE在去年年底重构一次之后,经过这么长时间的 ...

  7. leetcode115:search -insert-position

    题目描述 给出一个有序的数组和一个目标值,如果数组中存在该目标值,则返回该目标值的下标.如果数组中不存在该目标值,则返回如果将该目标值插入这个数组应该插入的位置的下标 假设数组中没有重复项. 下面给出 ...

  8. 虚拟机vbox给vdi增加容量到16G后的一系列操作

    虚拟机vbox给vdi增加容量到16G后的一系列操作windows 下:cmdVbox/bin下1.#VBoxManage modifyhd "cloned.vdi" --resi ...

  9. ssh连接客户端一段时间没响应就断掉的解决办法-保持长连接

    修改(添加)server端的 /etc/ssh/sshd_config #server每隔60秒发送一次请求给client,然后client响应,从而保持连接 ClientAliveInterval ...

  10. ESP32的Linux开发环境搭建

    1. 官网教程地址 https://docs.espressif.com/projects/esp-idf/zh_CN/v4.0.1/get-started/linux-setup.html 2.官网 ...