node批量请求导致“heapoutofmemory”的解决方法messages.forEach((message)=>{request({url:url,method:'POST',json:true,body:JSON.stringify(message),}).on('end',()=>{server.logger.info('End');}).on('error',(err)=>{server.logger.error(`Error:${err.toString()}`);});});分析原因node内存不足,message对象没有尽快释放,request还没有结束,body中的内容没有及时释放解决方法是尝试node--max_old_space_size=4096main.js来增加内存。经过测试,找到的程序确实可以占用更多内存,运行时间更长,但最后还是崩溃了。尝试提出JSON.stringify(message),存放在temp中,然后将message置为null,希望gc能提前回收message。测试后发现效果不明显,程序还是闪退。将请求的超时设置为1秒。经测试可以回收内存,程序运行,但是python收不到消息。重构python的flaskrestfulapi,使用tornado和flask的混合方式,让python先返回结果,再执行任务。经测试,程序内存保持稳定,运行完美。想想如果内存不是持续增长,而是某个时刻需要比较大的内存,可以试试上面的方案#1;如果内存继续增长,就需要分析是什么原因引起的,是因为内存没有及时释放,还是因为内存泄漏,比如闭包、定时器等,然后对症下药。想想#3中可能遇到的问题。首先,如果网络不好,python返回慢还是会有问题。如果要解决,应该用stream把消息一起传给python。但是因为现在处于封闭开发阶段,没有时间去重构。
