美文网首页
Node内存限制与解决方案

Node内存限制与解决方案

作者: 夏夏夏夏顿天 | 来源:发表于2020-03-23 16:20 被阅读0次

什么是node内存,为什么需要内存限制

  • 在32位系统限制 0.7GB
  • 64位系统限制 1.4GB

导致的问题: Node 无法直接操作大文件对象。

例如我想读取一个 4g 的文件来处理,即使物理内存有 32GB,在单个 Node 进程中也是不能完全的使用的。

我们平常在声明一些对象的时候,要是没有Node垃圾回收机制回收 ,就会占用V8限制的内存

为什么有内存限制

内存限制主要原因是v8的垃圾回收制度。1.5GB内存做一次小的回收需要50MS,做一次非增量性回收需要1S以上,并且这会使JS线程暂停。因此限制内存。

如何查看目前使用多少内存

所有的 JS 对象都是通过堆来进行分配的。

process.memoryUsage()
> node
> process.memoryUsage()

{
    rss: 21917696, // rss (resident set size) 进程的常驻内存
    heapTotal: 7684096, // 已申请到的堆内存
    heapUsed: 5147296, // 当前使用的堆内存
    external: 8655
}

// 以上单位 字节

如何解决内存限制

可以使用Buffuer,因为Buffer不受V8的内存分配机制,

1.修改内存限制大小

node --max-old-space-size=1700 test.js // 单位为MB 
node --max-new-space-size=1024 test.js // 单位为KB 

2.高效使用内存

  • 少用全局作用域,全局作用域的变量要等程序退出,才释放,建议使用null或undefined主动释放

在某个局部作用域中的对象会随着局部作用域的销毁而被释放,在下次垃圾回收的时候就会清理掉这部分内存,如果全局作用域中的对象过多,那么这些对象存在的作用域直到继承退出才会被释放,这些对象也会最终停留在老生代内存区域中。
如果你想手动释放一个变量,可以使用delete操作符,但是并不推荐这样做,这样做会干扰V8引擎的优化,推荐使用将对象赋值为null或undefined来手动释放它。

3.使用非V8引擎内存

Node.js程序所使用的内存分为两类:

  • V8内存:数组、字符串等JavaScript内置对象,运行时使用“V8内存”
  • 系统内存Buffer是一个Node.js的扩展对象,使用底层的系统内存,不占用V8内存空间。与之相关的文件系统fsStream流操作,都不会占用V8内存。

在程序允许的情况下,应该将数据保存在Buffer中,而不是转换成字符串等JS对象,这样可以避免V8内存的过多占用。

4.使用process.nextTick()防止事件堆积

process.nextTick()会在本次事件循环结束后,立即开始下次事件循环。这样可以使V8获得内存回收的机会,有效解决过多事件堆积造成的内存溢出。

我们可以使用process.nextTick()方法处理:

forLoops(0);

function forLoops(i) {
  if(i<10000000)
  {
    var site = {};
    site.name = '内存';
    site.domain = 'nodejs.com';

    // 这里是一个保存或更新等操作
    setTimeout(()=>{
      console.log(i, site);
    }, 0)
    process.nextTick(forLoops, i+=1);
  }
}

每次循环V8都会回收内存一次,因此内存不会再溢出。但这样做必然会造成运行效率的降低,而应该在速度在安全之间平衡,控制好循环的安全次数。

5.拆分进程

官方建议:it is recommended that you split your single process into several workers if you are hitting memory limits. (拆分进程)


相关文章

  • Node内存限制与解决方案

    什么是node内存,为什么需要内存限制 在32位系统限制 0.7GB 64位系统限制 1.4GB 导致的问题: N...

  • FATAL ERROR: Reached heap limit

    实测生效方案: 解决方案:使用 increase-memory-limit 插件,增加node服务器内存限制

  • 内存机制

    Node内存由V8进行分配的部分和Node自行分配的部分。 V8的垃圾回收机制与内存限制 V8的内存限制   因为...

  • Node之内存管理

    V8的垃圾回收机制与内存限制 一般的后端开发语言中,基本的内存使用上没有什么限制,然而在Node中通过Javasc...

  • 《深入浅出Node.js》内存控制

    依托 V8 的 NODE 在使用内存时是有大小限制的,具体大小与系统类型、版本、NODE 版本相关(64 位系统 ...

  • Node 内存泄漏排查

    在Node中,由于V8的对内存大小的限制,他对内存泄漏非常敏感。 node-heapdump工具。 示例代码: c...

  • 5. node-内存控制-垃圾回收

    V8内存限制 Node与其他语言不同的一个地方,就是其限制了JavaScript所能使用的内存(64位为1.4GB...

  • Node.js的内存控制

    内存限制 Node基于V8构建,所以存在一定的内存限制(64位系统下约为1.4GB, 32位系统下约为0.7GB)...

  • Node大内存应用

    在Node中,不可避免地还是会存在操作大文件的场景。由于Node的内存限制,操作大文件也需要小心,好在Node提供...

  • js的内存和垃圾回收机制

    内存和垃圾回收 1. v8内存大小限制 在Node中如果通过JavaScript使用内存操作时会发现实际只能使用部...

网友评论

      本文标题:Node内存限制与解决方案

      本文链接:https://www.haomeiwen.com/subject/hzxwyhtx.html