垃圾回收机制
目的
- 防止页面占用内存过大 引起客户端卡顿 或是无响应
- Node.js 使用V8引擎 内存对后端服务的性能至关重要(因为后端的服务的持久性 容易造成内存溢出
JS的内存机制
- 八种数据类型(String Number Boolean Null Undefined Symbol Bigint Object)
- 原值数据类型保存在栈内存 堆内存保存引用数据类型(Object)
- 每个函数都有自己的执行环境 当执行流进入函数时 函数的环境推入一个环境栈中 当函数执行完后 栈将环境弹出 把控制权返回之前的执行环境(基于这个原理 对内存上采取标记清除
V8回收策略
-
分代回收策略 将内存分成新生代和老生代 对新老生代采取不同的回收策略
-
新生代(1~8M)
- From 使用区 To 空闲区
- 当使用区快要被写满时候 执行一次垃圾回收
- from作为清除
- 1.在From空间和To空间反转的过程中 如果To空间的该对对象在空闲区占用量超过25% 直接将该对象直接晋升老生代
- 2.当一个对象进行多次复制还是存在的话 将移动到老生代
-
老生代
-
老生代内存空间是一个连续的结构
-
标记清除
- 将需要回收的对象进行标记 在垃圾回收时直接释放
-
标记合并(整理)
- 将需要回收对象移动在一边 存活的对象移动到另一边 然后对需要被回收的额对象区域进行整体的垃圾回收
-
V8并行回收
JavaScript是单线程语言 进行垃圾回收会阻塞脚本的执行
新生代空间采用并行回收(负责数据复制移动 清除等等
老生代主要采用并发标记(好比标记清除的效果