使用webpack-dev-server时NodeJS可用内存配置调整

使用webpack-dev-server时NodeJS可用内存配置调整

现象

使用webpack-dev-server开发时内存可能占用比较多,导致部分场景下内存溢出而退出.

<--- Last few GCs --->                                                                                                                                                             
[29268:01873668]   185036 ms: Mark-sweep 677.4 (717.1) -> 677.4 (717.1) MB, 272.1 / 0.0 ms  allocation failure GC in old space requested                                         
[29268:01873668]   185311 ms: Mark-sweep 677.4 (717.1) -> 673.3 (711.8) MB, 274.7 / 0.0 ms  last resort GC in old space requested                                                
[29268:01873668]   185591 ms: Mark-sweep 673.3 (711.8) -> 673.3 (711.8) MB, 280.1 / 0.0 ms  last resort GC in old space requested                                                                                                                                                
<--- JS stacktrace --->                                                                                                                                                          
                                                                                                                                                                                 
==== JS stack trace =========================================                                                                                                                                                         
Security context: 03C961D9 <JSObject>                                                                                                                                            
    2: replace(this=132AEB25 <Very long string[2481434]>,23B9B665 <String[32]: var HTML_WEBPACK_PLUGIN_RESULT =>,39E84255 <String[0]: >)                                         
    3: evaluateCompilationResult [E:\xxxxxxxxxxx\node_modules\html-webpack-plugin\index.js:240] [bytecode=23B9B859 offset=40](this=044A0B41 <HtmlWebpackPlugin map = 2F
DDBB81>,compilation=18568E7D <Tapable map = 2FDC4C8D>,source=132AEB25 <Very long string[24...                                                                                    
                                                                                                                                                                                 
FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory                                                                                               
 1: node_module_register                                                                                                                                                         
 2: v8::internal::Factory::NewRawTwoByteString                                                                                                                                   

原因分析

Node的运行期内存大小有限制(指V8的内存管理,使用new Buffer()等方式直接开辟的内存不在这个范畴内). V8内存限制(默认值)为: 64位环境1.4G, 32位环境0.7G。这个限制是V8决定的,如果使用的Node的版本是32位,操作系统为64位,则按照32位处理。
内存溢出主要是V8管理的内存不足导致。内存在做回收时有新旧space拷贝交换,期间内存占用会比较大。

webpack-dev-server在打包过程中会将部分文件解析到内存,造成内存使用量大。且任意文件变化均会触发相关受影响模块的编译,在此期间会有大量的内存回收进行,如果回收不及时,会造成内存溢出而退出。

处理方法

由于webpack-dev-server是开发期间使用的,暂不考虑内存使用优化等方面的改进,简单粗暴采用配置Node内存的方式进行。

配置old-space内存大小为2G,格式如下

node --max-old-space-size=2000 test.js

对于项目上,由于采用webpack-dev-server,直接在package.json的对应启动项中增加参数即可

{//package.json
    ......
	"scripts": {
    "server": "webpack-dev-server --env.server --max-old-space-size=2000"
    }
}

另外,使用的Node要采用64位版本.
查看当前Node的版本的脚本如下

node -p "process.arch"

如果输出结果为x64,说明node为64位版本;如果是ia32,说明是32位版本

其他说明

使用较大内存时,需要排查下是否使用的webpack插件本身有问题,建议在允许的前提下尽量使用较新版本,或基于较新版本进行测试来排查问题.

你可能感兴趣的:(JavaScript,杂项)