GC(垃圾回收机制)笔记
垃圾:
- 不在需要使用
- 不能在访问到
常见算法:
- 引用计数
- 标记清楚
- 标记整理
- 分代回收
引用计算算法
核心:设置引用计数器是否为0来查看是否回收
通过引用关系改变的时候修改引用数字,当数字为0的时候立马回收
优点:
- 发现垃圾立即回收
- 最大限度减少程序暂停
缺点:
- 时间开销大
- 无法回收循环引用对象
可达对象:从根上出发可以能够找到
标记清除算法
核心:分为两个阶段完成: 标记,清除
- 遍历所有对象找标志活动的对象
- 遍历所有对象清除没有标记对象
- 回收相应的空间(整个方式可能是通过递归的方式)
优点:
- 解决循环引用
缺点:
- 容易产生碎片空间,浪费空间
- 不会立即回收垃圾对象
标记整理算法
- 标记整理可以看做标记清楚的增强
- 标记阶段的操作和标记清楚一致
- 清除阶段会限制性整理,移动对象位置(地址上产生连续)
优点
- 减少碎片化空间
缺点
- 不会立即回收垃圾对象
V8 是什么?
- 一款主流的JavaScript执行引擎
- 即使编译
- 内存设限
V8垃圾回收策略
-
分代回收
-
分为老生代,新生代
V8中常用的GC算法
- 分代回收
- 空间复制
- 标记清楚
- 标记整理
- 标记增量
v8内存分配
新生代:存活时间较短(32M| 16M)
实现: 复制算法+标记整理算法
使用空间为From,空闲空间为To
活动对象存储为From空间
标记整理之后将活动队形拷贝致To
From与To空间完成释放(From释放,To保留)
晋升:将新生代对象移动至老生代(经历一轮GC之后或者To空间使用率超过25%)
**老生代:**存活时间较长的对象(1.4G|700M)