内存存储与垃圾回收机制

2020-02-24  本文已影响0人  9吧和9说9话

javascript中的内存模型

javascript 内存模型 图片来源:极客时间
  1. 一般而言,原始数据类型都是存储在栈空间中,引用类型存储在堆空间中。
  2. 栈空间相对而言很小,堆空间可以存储大量数据。
  3. 闭包会存储在堆中,这也是为啥栈执行过后,还能够访问到数据的原因。

javascript的自动垃圾回收机制

  1. 针对栈中的数据,通过推出调用栈(移动内部指针)标记了推出的调用栈已经无效,后面再分配的话 就会进行覆盖。
  2. 针对堆中的数据。

代际假说

  1. 大部分对象在内存中存在的时间很短,简单来说,就是很多对象一经分配内存,很快就变得不可访问;
  2. 不死的对象,会活得更久。

基于上面的假说:

  1. V8 把堆分成两个区域:新生代和老生代, 分别存储生存时间很短的数据和生存时间很久的数据

  2. 新生代区 空间很小 1~8M, 老生代区很大。

  3. 针对两个区域进行了不同的垃圾回收机制:副垃圾回收器,主要负责新生代的垃圾回收; 主垃圾回收器,主要负责老生代的垃圾回收。

  4. 副垃圾回收机制: Scavenge 算法;将新生代分为两个区域,一半对象区和一半空闲区。对象区快满了的时候,进行一次角色对换和复制操作(同时会进行内存碎片整理)


    新生区要划分为对象区域和空闲区域 图片来源:极客时间
  5. 主垃圾回收机制:标记-清除or 标记-整理。


    标记清除过程 图片来源:极客时间
    标记整理过程 图片来源:极客时间
  6. 垃圾回收会占用主线程,阻塞页面。所以主垃圾回收机制把标记-整理的过程,分为多个子过程和js应用逻辑交替进行。


    增量标记 图片来源:极客时间
上一篇 下一篇

猜你喜欢

热点阅读