node学习笔记--- v8的垃圾回收机制

        以下内容基本 摘自《深入浅出Node.js》
        v8作为JavaScript引擎是非常优异的,在浏览器的应用场景中是绰绰有余的,但是其固有的内存限制(64位系统下约1.4GB,32位系统下约0.7GB)不利于node服务器层面的开发。所有JavaScript对象都是通过堆来进行分配的。但是可以利用堆外内存突破内存限制的问题,buffer对象是典型,它不同于其他对象,不经过v8的内存分配机制,不会有内存大小限制。
         v8的垃圾回收策略主要基于分代式垃圾回收机制。在v8中,主要将内存分为新生代和老生代。新生代的对象为存活时间较短的对象,老生代的对象是存活时间较长或常驻内存的对象。不同代的对象采用不同的算法进行垃圾回收。新生代采用scavenge算法,老生代采用mark-sweep&mark-compact算法
         scavenge算法具体实现采用了Cheney算法,这是一种用复制的方式实现的垃圾回收算法。它将堆内存分为两部分,from空间和to空间。分配对象内存时在from空间进行,to空间处于闲置状态。当开始垃圾回收时复制from空间中的存活对象到to空间去,非存活对象占用的空间会被释放掉。完成后,两个空间角色互换。很显然,这是一种典型的牺牲空间换取时间的算法。新生代对象的生命周期较短且存活对象只占少部分,因此这个算法很适合新生代。


         mark-sweep算法就是一般意义上的标记清除,标记阶段标记存活的对象,清除阶段清除没有被标记的对象。这个算法最大的问题就是内存碎片问题,mark-compact就是为了解决这个问题而提出的,即标记整理。标记整理,顾名思义就是说在标记后整理存活的对象,将其往一端移动,移动完成后,清理掉死亡对象。
         上述3种算法的执行都需要将应用逻辑暂停下来,等到垃圾回收执行完再恢复应用逻辑,这样的行为称为全停顿(stop-the-world)。这样的操作应用于新生代垃圾回收时影响不大,但是老生代就不一样了,内存配置得大,存活对象也多,全堆垃圾回收时造成应用的停顿就会比较长了。改善方法有增量标记(incremental marking)、延迟清理(lazy sweeping)和增量式整理(incremental compaction),同时还有并行标记和并行清理,这是利用多核进行性能优化。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值