浅谈JavaScript垃圾回收机制

1、为什么要垃圾回收?

程序在执行的时候,会在内存中占用一系列的资源,例如js里的变量,函数,对象等等。这些占用内存却没有再次使用的,我们称之为“垃圾”,而对“垃圾”占用的内存的回收,就是垃圾回收。如果没有垃圾回收,那么只能人工去做清除,这样很容易导致内存泄漏等问题。

2、什么是标记清除?

早在C语言诞生之前的1960年,图灵奖得主John McCarthy就在Lisp语言中实现了自动垃圾回收算法。算法本身其实非常简单,标记那些程序访问不到的数据,回收它们的内存空间。但是,垃圾回收算法把程序员从硬件层(内存管理)解放出来了,这种理念还是很先进的。分别是:“标记清除”、“引用计数”、“复制算法”,后续的垃圾回收算法,都是基于这三大算法做的组合与优化。JavaScript常用的垃圾回收机制有两种:标记清除法、引用计数法,这里主要弄懂目前主流的“标记清除法”。顾名思义,标记清除法一定会有两个阶段,标记阶段与清除阶段。

3、标记阶段

首先从根节点出发,线性遍历所有可达对象,在活动的对象头打上活动的标记。此处的根节点root对象,从js引擎的角度作者认为应当是包括全局对象以及程序当前的执行堆栈(大家可以在留言区讨论一下标记清楚法中的“根节点”是什么?)。

4、清除阶段

再次遍历对象,检查对象头,对于没有活动标记的对象,将其内存空间释放;对于有活动标记的对象,去掉标记。

5、优缺点是什么?

优点:代替了人工释放内容,极大的优化了操作,思路简单,实现简单

缺点:标记时要暂停整个程序,大型应用会比较明显卡顿。内存出现碎片化。

6、V8的垃圾回收模块Orinoco:

  • 采用多线程的方式进行垃圾回收,尽量避免对JavaScript本身的代码执行造成暂停;
  • 利用浏览器渲染页面的空闲时间进行垃圾回收;
  • 根据The Generational Hypothesis,大多数对象的生命周期非常短暂,因此可以将对象根据生命周期进行区分,生命周期短的对象与生命周期长的对象采用不同的方式进行垃圾回收;
  • 对内存空间进行整理,消除内存碎片化,最大化利用释放的内存空间;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值