深入浅出Node(5) 内存控制

摘要:
1) V8垃圾收集机制1.1 V8内存限制1.2 V8垃圾回收机制2)有效使用内存2.1释放内存空间2.2使用堆外内存2.3合理使用内存以防止内存泄漏2.3.1将内存用作缓存时要小心2.3.2注意队列状态2.3大型内存应用程序1)V8垃圾回收机构节点使用Chrome的V8引擎执行javascript,由于浏览器和服务器上运行的场景不同,网页在浏览器中的运行时间相对较长

一)V8垃圾回收机制

  1.1 V8的内存限制

  1.2 V8垃圾回收机制  

二) 高效使用内存

  2.1 内存空间的释放

  2.2 使用堆外内存

  2.3 合理使用内存防止内存泄漏

    2.3.1 慎将内存当缓存

    2.3.2 关注队列状态

  2.3 大内存应用

一)V8垃圾回收机制

  Node使用的是Chrome的V8引擎执行javascript,由于运行在浏览器和服务端的场景不同,浏览器中网页的运行时间较短,随着网页的关闭,相应的内存就会被回收,所以对精细的内存的管理需求度不高,但是在服务器端由于程序处于长时间运行中,为了达到高性能的服务端程序,就需要良好的垃圾回收策略和管理策略(机器和我们本身的控制) 良好的管理策略能更好的使垃圾回收运行,垃圾回收是影响性能的因素之一

  V8的内存限制

  由于V8在内存回收算法的使用的考虑下,V8给系统分配使用的内存是存在一定的限制的

  V8垃圾回收机制

  在垃圾回收机制上,V8主要根据内存中对象在内存中的特征,对内存中的对象进行分区的管理.以下为V8的堆内存的划分

深入浅出Node(5) 内存控制第1张

在新生区的内存空间中,由于新生区内存对象的特征是生存周期短,这部分采用Cheney算法.Cheney算法是一种采用复制方式实现的垃圾回收算法,它将新生代内存空分为两个区域:

处于使用状态的From区域和处于闲置状态的To区域.在分配对象的时候,会现在From区域中进行对象的分配,在进行垃圾回收的时候,将From区域中存活的对象copy到To区域并且将From区域和To区域进行角色互换.

当一个对象在进行多次复制仍然存活,它就会被认为是存活周期较长的对象,它就会被转移到老生区域中.对象从新生区域移动到老生区域的过程称为晋升. 晋升主要有两个条件:

  1. 一个对象时候经历过Scavenge回收(也就是新生区域的垃圾回收)
  2. To空间的内存占比(当To区域已经使用了25%的时候,从From区域复制的对象会直接晋升到老生区域.因为To区域会在接下来转换为From区域供新的内存的分配,需要预留合适大小的空间)

在老生区域主要采用Mark-sweep 和Mark-Compact 和 Incremental Marking等多种方式结合的方式来达到对老生区进行整理的目的

  • Mark-sweep 标记清除 主要分为标记和清除 在标记阶段,垃圾回收器会标记活着的对象,在清除阶段会清除没有被标记的对象
  • Mark-Compact 标记整理  它是在标记清除的基础上的,在进行标记的过程中,将活着的对象往一侧进行移动,这样就消除了内存的间隙,方便后续内存空间的分配
  • Incremental Marking 增量标记 在进行标记的时候,需要将应用程序的逻辑进行暂停,所以产生了增量标记,每次只标志部分,在让位出时间来执行应用程序.

 二)高效使用内存

  2.1 内存空间的释放

  变量是引用的情况下需要主动的释放内存,例如对引用进行重新的赋值,这样在垃圾回收器运行的时候,就会主要回收内存. 

  闭包是外部作用域访问内部作用域中变量的方法,在使用完闭包后,要注意中间函数的释放

  2.2 使用堆外内存

  Buffer对象的内存分配不经过V8的内存分配机制,所以在处理文件I/O的时候可以使用Buffer来达到对堆外内存的使用

  2.3 合理使用内存防止内存泄漏

  造成内存泄漏的原因是我们的操作使得本应在垃圾回收中被回收的内存无法被回收,变成老生区对象.主要有以下几个原因

  • 缓存
  • 队列消费不及时
  • 作用域未释放

2.3.1 慎将内存当缓存

  当我们将一个对象常驻内存中作为缓存使用的时候(老生区),垃圾回收算法每次都会对它进行操作,这就导致垃圾回收在做无用功并且我们对这个缓存对象的大小不做控制的时候,还可能会导致它占用过大的内存空间,导致进程的退出,并且内存作为缓存这种方案无法再各个进程间进行共享,解决方案是使用缓存软件,他们拥有良好的管理策略,能更好的提升应用的性能.

2.3.2 关注队列状态

  在使用队列(数组)来完成特殊的任务请求的时候,当任务的消耗低于生产的时候,就会造成堆积,产生内存泄漏.解决方案是设置警告或者超时响应等

  2.4 大内存应用

  对于大内存应用,例如读取大的文件,可以使用node中的stream模块并且它继承了event模块.

免责声明:文章转载自《深入浅出Node(5) 内存控制》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇NPOI导出EXCEL遇到换行符时,改变单元格的样式~!Qt笔记(二)linux下Qt安装使用下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

用mtrace检查内存泄漏

http://blog.csdn.net/ixidof/article/details/6638066内存泄漏检查方法(for Linux)如果你更想读原始文档, 请参考glibc info的"Allocation Debugging" 一章 (执行info libc);glibc提供了一个检查内存泄漏的方法, 前提是你的程序使用glibc的标准函数 分配...

iOS学习——内存泄漏检查及原因分析

项目的代码很多,前两天老大突然跟我说项目中某一个ViewController的dealloc()方法没有被调用,存在内存泄漏问题,需要排查原因,解决内存泄漏问题。由于刚加入项目组不久,对出问题的模块的代码还不太熟悉,所以刚拿到问题时觉得很棘手,再加上作为一个iOS菜鸟,对内存泄漏的排查方法和原因确实基本上不了解。所以,也借着这样的机会,我研究了一下关于iO...

java内存溢出与内存泄漏

内存溢出(OOM)   内存溢出相对于内存泄漏来说,尽管更容易被理解,但是同样的,内存溢出也是引发程序崩溃的罪魁祸首之一。  由于GC一直在发展,所有一般情况下,除非应用程序占用的内存增长速度非常快,造成垃圾回收已经跟不上内存消耗的速度,否则不太容易出现OOM的情况。  大多数情况下,GC会进行各种年龄段的垃圾回收,实在不行了就放大招,来一次独占式的Ful...

JNI内存使用问题(转载)

程序员在使用 JNI 时应当认识到 JNI 编程中如下的几点弊端,扬长避短,才可以写出更加完善、高性能的代码: 从 Java 环境到 native code 的上下文切换耗时、低效。 JNI 编程,如果操作不当,可能引起 Java 虚拟机的崩溃。 JNI 编程,如果操作不当,可能引起内存泄漏。 1.jni内存泄露从两个方面来说 1)JVM中的java...

深入浅出Node.js(四):Node.js的事件机制

InfoQ: 深入浅出Node.js(四):Node.js的事件机制 深入浅出Node.js(四):Node.js的事件机制Node.js的事件机制 Node.js在其Github代码仓库(https://github.com/joyent/node)上有着一句短短的介绍:Evented I/O for V8 JavaScript。这句近似广告语的句子却...

深入浅出-多租户

ABP的多租户模块提供了创建多租户应用程序的基本功能。 维基百科中是这样定义多租户的: 软件多租户技术指的是一种软件架构,这种架构可以使用软件的单实例运行并为多个租户提供服务。租户是通过软件实例的特定权限共享通用访问的一组用户。使用多租户架构,软件应用为每个租户提供实例的专用共享,包括实例的数据、配置、用户管理、租户的私有功能和非功能属性。多租户与多实例架...