当前位置: 首页 > Web前端 > HTML5

节点内存限制及解决方法

时间:2023-04-04 23:27:03 HTML5

什么是节点内存,为什么需要内存限制32位系统限制0.7GB64位系统限制1.4GB导致的问题:Node不能直接操作大文件对象。比如我要读取一个4g的文件进行处理。即使物理内存有32GB,在单个Node进程中也无法完全使用。我们平时声明一些对象的时候,如果没有Node垃圾回收机制进行回收,就会占用V8限制的内存。为什么会有内存限制?内存限制的主要原因是V8的垃圾回收系统。1.5GB内存的小恢复需要50MS,非增量恢复需要1S以上,这会导致JS线程暂停。所以内存是有限的。如何查看当前使用了多少内存所有的JS对象都是通过堆分配的。process.memoryUsage()>node>process.memoryUsage(){rss:21917696,//rss(residentsetsize)进程的常驻内存heapTotal:7684096,//申请的堆内存heapUsed:5147296,//当前的heapmemoryusedexternal:8655}//如何解决以上单位字节的内存限制可以使用Buffer,因为Buffer不受V8的内存分配机制,1.修改内存限制大小节点--max-old-space-size=1700test.js//单位是MBnode--max-new-space-size=1024test.js//单位是KB2.高效使用内存,少使用全局作用域。全局范围内的变量必须等待程序退出Release,建议使用null或undefined主动释放局部范围内的对象会随着局部范围的销毁而释放,这部分内存会被清理在下一次垃圾收集期间。如果全局作用域中的对象过多,那么这些对象的作用域直到继承退出才会被释放,这些对象最终会停留在老年代内存区域。如果想手动释放一个变量,可以使用delete操作符,但不推荐这样做,会干扰V8引擎的优化。建议通过将对象赋值为null或undefined来手动释放它。3、使用非V8引擎内存Node.js程序使用的内存分为两类:V8内存:数组、字符串等JavaScript内置对象,运行时使用“V8内存”系统内存:Buffer是Node.js的一个扩展对象,使用底层系统内存,不占用V8内存空间。相关的文件系统fs和stream流操作不会占用V8内存。如果程序允许,数据应该保存在Buffer中,而不是转成字符串等JS对象,避免V8内存占用过大。4、使用process.nextTick()防止事件累积process.nextTick()会在当前事件循环结束后立即开始下一个事件循环。这样V8就可以获得内存回收的机会,有效的解决了事件堆积过多导致的内存溢出问题。我们可以使用process.nextTick()方法:forLoops(0);functionforLoops(i){if(i<10000000){varsite={};site.name='内存';site.domain='nodejs.com';//这里是保存或更新等操作setTimeout(()=>{console.log(i,site);},0)process.nextTick(forLoops,i+=1);}}每次循环V8都会回收一次内存,所以内存不会再次溢出。但这样做势必会导致作业效率的降低,应在速度与安全之间取得平衡,控制好安全循环次数。5.拆分进程的官方建议:如果您遇到内存限制,建议您将单个进程拆分为多个worker。(拆分过程)