javascript垃圾回收机制 - 标记清除法/引用计数/V8机制

栏目: JavaScript · 发布时间: 4年前

  • 原理:找出那些不再继续使用的变量,然后释放其所占用的内存,垃圾回收器会按照 固定的时间间隔周期性 地执行这一操作
  • 策略:标记清除法/引用计数
  • JavaScript 内存分配: 在 定义变量时 就完成了内存分配,还可以通过函数调用分配内存,使用值的过程实际上是对分配内存进行读取与写入的操作
  • 标记清除法:

    • 标记方式:特殊位的反转、维护一个列表
    • 原理:垃圾收集器在 运行的时候 会给存储在内存中的所有变量都 加上标记 ,然后它会 去掉环境中的变量已经被环境中变量被标记为引用的变量 ,在此之后再被标记的变量将被视为准备删除的变量。最后垃圾回收器清除标记的变量,回收它们所占用的内存空间
    • 目前 主流浏览器 都是使用标记清除式的垃圾回收策略,只不过收集的 间隔有所不同
  • 引用计数:

    • 原理:每次引用加一,被释放时减一,当这个值的引用次数变成 0 时,就可以将其内存空间回收
    • 缺点:循环引用(obj1 和 obj2 通过各自的属性相互引用,也就是说,这两个对象的引用次数都是 2)
  • 兼容问题:IE

    • 在 IE9 之前,IE 中有一部分对象并不是原生 JavaScript 对象。例如,BOM 和 DOM 中的对象就是 C++ 实现的 COM 对象,而 COM 对象的垃圾收集机制采用的是引用计数策略。因此,即使 IE 中的 JavaScript 引擎使用标记清除策略实现,但是 JS 访问的 COM 对象依然是基于引用计数策略的。可以在 IE 中涉及到 COM 对象,就会存在循环引用的问题
    • 解决:将变量设置为 null
  • 性能问题:(运行时间间隔)

    • IE7 之前的垃圾收集器是根据 内存分配量 运行的,达到某一个临界值就是启动垃圾回收器

      • 缺点:如果该脚本在其生命周期需要一直保持这么多变量,垃圾回收器就不得不频繁运行。
    • 浏览器可自动触发: window.CollectGarbage()
    • 避免:执行代码中只保留必要的数据,一旦数据不再有用,通过设置为 null 来释放其引用(适用于大多数全局变量和全局对象的属性)
  • V8内存机制

    • V8 引擎会限制 JavaScript 所能使用的内存大小
    • V8 的堆构成

      • 新生区:大多数对象被分配在这里。新生区是一个很小的区域,垃圾回收在这个区域非常频繁,与其他区域相独立。
      • 老生指针区:这里包含大多数可能存在指向其他对象的指针的对象。大多数在新生区存活一段时间之后的对象都会被挪到这里。
      • 大对象区:这里存放体积超越其他区大小的对象。每个对象有自己 map 产生的内存。垃圾回收器从不移动大对象。
        -代码区:代码对象,也就是包含 JIT 之后指令的对象,会被分配到这里。这是唯一拥有执行权限的内存区(不过如果代码对象因过大而放在大对象区,则该大对象所对应的内存也是可执行的。译注:但是大对象内存区本身不是可执行的内存区)。
        -Cell 区、属性 Cell 区、Map 区:这些区域存放 Cell、属性 Cell 和 Map,每个区域因为都是存放相同大小的元素,因此内存结构很简单
    • 分代回收

      • 原因:绝大多数对象的生存期很短,只有某些对象的生存期较长
      • 过程:

        1、 对象起初会被分配在新生区 (通常很小,只有 1-8 MB)在新生区的内存分配非常容易:我们只需保有一个指向内存区的指针,不断根据新对象的大小对其进行递增即可。当该指针达到了 新生区的末尾,就会有一次清理(小周期) ,清理掉新生区中不活跃的死对象。

        2、 活跃超过 2 个小周期的对象,则需将其移动至老生区 老生区在标记-清除或标记-紧缩(大周期)的过程中进行回收。大周期进行的并不频繁。 一次大周期通常是在移动足够多的对象至老生区后才会发生 。至于足够多到底是多少,则根据老生区自身的大小和程序的动向来定。


以上所述就是小编给大家介绍的《javascript垃圾回收机制 - 标记清除法/引用计数/V8机制》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

洞察人心

洞察人心

Steve Portigal / 张振东、蒋晓、戴传庆、孙启玉 / 电子工业出版社 / 2015-10 / 65.00元

用户在哪里,有什么需求?他们为什么会选用竞争对手的产品而不是你的?从大数据中固然能得出一些结论,但是要搞清楚作为地球上顶级复杂生物的人的真实想法,还是走近他们,面对面访谈更直接有效。 用户访谈是一项技能,与一般的交谈有本质上的区别,需要遵从一定的步骤和方法。优秀的采访者用最自然的方式和用户进行交流,看似不经意,而实际上该说什么、何时说、如何说以及什么时候应该沉默,都有精准的权衡,都试图在闲聊......一起来看看 《洞察人心》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具