GC(Garbage Collection)
在垃圾回收领域有一个代际假说的概念,大致意思就是数据分为生命周期短的和长久的。
根据代际假说,v8对堆的数据保存分为 新生代区域
, 老生代区域
两大块。这两区域的垃圾回收是不同的,分别为 副垃圾回收器
和 主垃圾回收器
。
- 新生代区域
存储空间小,不能存放大对象
- 老生代区域
空间大,存活时间长。新生代经过2次GC仍存活的的变量
- 副垃圾回收器
通过将新生代区域平分为2块区域: 对象区
、 空闲区
。当 活动区
中内存满时启动垃圾回收,遍历对象进行垃圾标记,将 活动
的对象复制到 空闲区
,移动到 空闲区
的对象是按顺序来的,因此不用去整理。处理完后,将 对象区
与 空闲区
翻转,完成垃圾回收。复制操作需要时间成本,因此为了效率,空间一般设置的很小。空间小,容易填满,因此又采用了 对象晋升策略
,经过两次垃圾回收依然存活的对象就会被移动到老生区
- 主垃圾回收器
采用 标记-清除(Mark-Sweep)
的算法进行垃圾回收。解决 标记-清除
空间不连续引入 标记-整理(Mask-Compact)
,标记完后,先将所有存活的对象向一端移动,然后直接清理掉这一端以外的内存。
引用计数类型 (Reference GC)
**引用计数(reference-counting)**
:每个对象配置一个计数器
,用于记录指向该对象的引用个数,GC触发时会回收计数为 0 的对象。追溯类型 (Tracing GC)
**标记-清除(mark-sweep)**
:扫描整个heap
,标出可到达
对象,然后执行sweep
操作回收不可到达对象
。**标记-压缩(mark-compact)**
:扫描整个heap
,标出可到达
对象,然后执行compact
(重新安排可达到对象,再更新指向可达对象的指针) 操作回收。**复制(Copying)**
:同**stop-copy**
,把所有可到达对象移动到一个区域,heap 中剩余的空间全部清除。-
增量类型 (incremental GC)
**垃圾回收的线程**
分多个小批次执行。这样每次造成的**应用程序的线程**
停顿都很小。分代类型(Generational GC)
对于大多数应用来说,多数对象在创建不久即会成为垃圾。因此,需要针对不同
age
的对象来划分不同区域,并采用不同的回收策略。一般情况下,可以简单的分为两个代:**younger**
、**older**
。**younger**
: 存放活跃的对象,需要经常进行垃圾回收**older**
: 存放不活跃的独享,回收频率低。
晋升
: 在一定条件下,将处在新生代的对象转移到老生代的过程
。