Js GC原理:
找出那些再也不继续使用的变量,而后释放其所占用的内存,垃圾回收器会按照固定的时间间隔周期性地执行这一操做浏览器
Js GC 策略:
JavaScript 内存分配:
- 在定义变量时就完成了内存分配,还能够经过函数调用分配内存,使用值的过程其实是对分配内存进行读取与写入的操做
标记清除法:
- 标记方式:特殊位的反转、维护一个列表
- 原理:垃圾收集器在运行的时候会给存储在内存中的全部变量都加上标记,而后它会去掉环境中的变量已经被环境中变量被标记为引用的变量,在此以后再被标记的变量将被视为准备删除的变量。最后垃圾回收器清除标记的变量,回收它们所占用的内存空间
- 目前主流浏览器都是使用标记清除式的垃圾回收策略,只不过收集的间隔有所不一样
引用计数:
- 原理:每次引用加一,被释放时减一,当这个值的引用次数变成 0 时,就能够将其内存空间回收
- 缺点:循环引用(obj1 和 obj2 经过各自的属性相互引用,也就是说,这两个对象的引用次数都是 2)
IE兼容问题
- 在 IE9 以前,IE 中有一部分对象并非原生 JavaScript 对象。例如,BOM 和 DOM 中的对象就是 C++ 实现的 COM 对象,而 COM 对象的垃圾收集机制采用的是引用计数策略。所以,即便 IE 中的 JavaScript 引擎使用标记清除策略实现,可是 JS 访问的 COM 对象依然是基于引用计数策略的。能够在 IE 中涉及到 COM 对象,就会存在循环引用的问题
- 解决:将变量设置为 null
V8内存机制
- V8 引擎会限制 JavaScript 所能使用的内存大小
-
性能问题:(运行时间间隔)函数
-
V8 的堆构成指针
- 新生区:大多数对象被分配在这里。新生区是一个很小的区域,垃圾回收在这个区域很是频繁,与其余区域相独立。
- 老生指针区:这里包含大多数可能存在指向其余对象的指针的对象。大多数在新生区存活一段时间以后的对象都会被挪到这里。
- 大对象区:这里存放体积超越其余区大小的对象。每一个对象有本身 map 产生的内存。垃圾回收器从不移动大对象。
-代码区:代码对象,也就是包含 JIT 以后指令的对象,会被分配到这里。这是惟一拥有执行权限的内存区(不过若是代码对象因过大而放在大对象区,则该大对象所对应的内存也是可执行的。译注:可是大对象内存区自己不是可执行的内存区)。
-Cell 区、属性 Cell 区、Map 区:这些区域存放 Cell、属性 Cell 和 Map,每一个区域由于都是存放相同大小的元素,所以内存结构很简单
-
分代回收code
- 缘由:绝大多数对象的生存期很短,只有某些对象的生存期较长
- 过程:
一、对象起初会被分配在新生区(一般很小,只有 1-8 MB)在新生区的内存分配很是容易:咱们只需保有一个指向内存区的指针,不断根据新对象的大小对其进行递增便可。当该指针达到了新生区的末尾,就会有一次清理(小周期),清理掉新生区中不活跃的死对象。对象
二、活跃超过 2 个小周期的对象,则需将其移动至老生区老生区在标记-清除或标记-紧缩(大周期)的过程当中进行回收。大周期进行的并不频繁。一次大周期一般是在移动足够多的对象至老生区后才会发生。至于足够多究竟是多少,则根据老生区自身的大小和程序的动向来定。生命周期