node 内存管理相关

为何在node中要担忧node内存管理

使用JavaScript进行前端开发时几乎彻底不须要关心内存管理问题,对于前端编程来讲,V8限制的内存几乎不会出现用完的状况,v8在node中有着内存的限制(64位1.4GB;32位0.7GB),因为后端程序每每进行的操做更加复杂,而且长期运行在服务器不重启,若是不关注内存管理,致使内存泄漏,node对内存泄露十分敏感,一旦线上应用有成千上万的流量,哪怕是一个字节的内存泄露都会形成堆积,直到内存溢出。前端

查看内存使用状况与垃圾回收

咱们可使用process.memoryUsage() 能够查看内存的使用状况,有rss、heapTotal、heapUsed三个值,他们分别表明常驻内存、堆中总共申请内存、目前堆中使用的内存量。要注意,rss包括但不只限于堆内存,咱们知道在js中堆储存者对象等..rss中还有栈、代码运行内存、堆外内存。在node中对内存的分配和内存回收主要值得是堆内存,它把堆内存分区(新生代、老生代),新生代的对象为存活时间较短的对象,老生代的对象为存活时间较长或常驻内存的对象。而且对这两种分区采用不一样的算法进行垃圾回收,新生代空间较小,将它分为from/to两个部分,每次检查会将from中的存活对象复制到to中,而后释放剩下的对象资源,以后再转换from和to的角色。当新生代中的对象屡次被复制则将其晋升到老生代,若to中内存使用超过25%也会将后续对象直接晋升。老生代中对象存活期较长,空间较大,采用这种算法不只浪费较多并且耗时长,在老生代中采用标记法实现垃圾清除。另外还有一种算法可整合不连续的空间(耗时较长)node

咱们应该怎么高效使用内存?

  • 主动释放(跟js中的方法同样)
  • 慎用闭包(跟js中缘由同样)
  • 尝试使用堆外内存,由于v8对内存的限制是对堆内存的限制,那么咱们能够尝试去使用堆外内存
    • 使用Buffer,它不通过v8分配,是有C++申请分配的,也不须要被V8垃圾回收,必定程度上节省了V8资源,也没必要在乎堆内存限制。
  • 当咱们须要操做大文件,应该利用Node提供的stream以及其管道方法,防止一次性读入过多数据,占用堆空间,增大堆内存压力。(须要在学习)

内存泄露部分(后续补充)

相关文章
相关标签/搜索