javascript
中的内存模型
![](https://img.haomeiwen.com/i11434708/b73ab5e023664cfb.png)
- 一般而言,原始数据类型都是存储在栈空间中,引用类型存储在堆空间中。
- 栈空间相对而言很小,堆空间可以存储大量数据。
- 闭包会存储在堆中,这也是为啥栈执行过后,还能够访问到数据的原因。
javascript
的自动垃圾回收机制
- 针对栈中的数据,通过推出调用栈(移动内部指针)标记了推出的调用栈已经无效,后面再分配的话 就会进行覆盖。
- 针对堆中的数据。
代际假说
- 大部分对象在内存中存在的时间很短,简单来说,就是很多对象一经分配内存,很快就变得不可访问;
- 不死的对象,会活得更久。
基于上面的假说:
-
V8
把堆分成两个区域:新生代和老生代, 分别存储生存时间很短的数据和生存时间很久的数据 -
新生代区 空间很小 1~8M, 老生代区很大。
-
针对两个区域进行了不同的垃圾回收机制:副垃圾回收器,主要负责新生代的垃圾回收; 主垃圾回收器,主要负责老生代的垃圾回收。
-
副垃圾回收机制: Scavenge 算法;将新生代分为两个区域,一半对象区和一半空闲区。对象区快满了的时候,进行一次角色对换和复制操作(同时会进行内存碎片整理)
新生区要划分为对象区域和空闲区域 图片来源:极客时间
-
主垃圾回收机制:标记-清除or 标记-整理。
标记清除过程 图片来源:极客时间
标记整理过程 图片来源:极客时间
-
垃圾回收会占用主线程,阻塞页面。所以主垃圾回收机制把标记-整理的过程,分为多个子过程和js应用逻辑交替进行。
增量标记 图片来源:极客时间
网友评论