Node-RED学习笔记 —— http文件传输内存溢出JavaScript heap out of memory

问题描述

利用Node-red实现一个http监听服务,接收post方法发送过来的 multiparty file 文件。在postman通过http请求向nodered传输 .zip 文件时,由于传输的文件较大(大概130Mb),nodered程序直接崩了,开始重启,报错如下:


原因

一开始以为是Node-red默认的http请求最大内存为 5mb,传输的文件过大,导致的内存溢出。于是修改了 /node-red/node_modules/node-red 路径下的 setting.js 文件,apiMaxLength参数默认是 5mb,修改为 4gb,重启后发现问题依然存在。

于是观察了报错信息,理所当然的认为是v8引擎内存回收机制限制了内存大小,于是在启动nodered时通过传参修改了v8引擎内存最大内存上限,结果问题依然没有得到解决。

node --max-old-space-size=4700 red.js     //设置老生代内存空间最大值,单位为MB

最终,通过观察发现Node-red里是在把整个文件都放在内存里,而且想用一个buffer存下来:

而Buffer 的 length 属性被定义为一个32位无符号整型的值,因此当Buffer.length 属性为负数或者大于等于2^32时,会出现Invalid array length的错误。并且观察nodejs中Buffer类的属性,Buffer对象是直接向操作系统申请,不在V8引擎管理的heap里申请,因此不受调整v8引擎内存大小的影响。


解决办法

暂无

猜你喜欢

转载自blog.csdn.net/qq_14997473/article/details/109214752