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

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

  • 原理:找出那些不再继续使用的变量,然后释放其所占用的内存,垃圾回收器会按照 固定的时间间隔周期性 地执行这一操作
  • 策略:标记清除法/引用计数
  • 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机制》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

Fluent Python

Fluent Python

Luciano Ramalho / O'Reilly Media / 2015-8-20 / USD 39.99

Learn how to write idiomatic, effective Python code by leveraging its best features. Python's simplicity quickly lets you become productive with it, but this often means you aren’t using everything th......一起来看看 《Fluent Python》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

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

Base64 编码/解码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具