【原创】GC/垃圾回收简介

GC简介html

 

1 GC机制算法

1.1 对象post

从计算机的角度,装有数据的内存空间spa

1.2 做用htm

将内存垃圾的释放自动化对象

1.3 本质blog

将已经引用不到的对象视为死亡,将死亡的对象找出来而且做为垃圾进行回收递归

 

2 GC算法内存

2.1 跟踪回收get

2.1.1 原理

从根开始扫描判断对象的生死

2.1.2 标记清除

(1)过程

  1. 第一次扫描:以变量或运行栈做为根,从根开始将可能被引用的对象进行标记,将没被标记的对象进行垃圾回收
  2. 第二次扫描:将所有对象进行扫描,对没有被标记的对象进行垃圾回收,扫描的同时还须要将存活的对象的标记去除

(2)缺点

  1. 处理时间与对象数量相关,在大量对象且极少存活的状况下,效率不明显
  2. 由复制收集解决这一问题

2.1.3 复制收集

(1)过程

  1. 扫描一遍:将根对象复制到新开辟的内存空间,再用复制的对象所能引用的对象进行递归复制
  2. 清除旧空间

(2)优缺点

  1. 扫描一遍就至关于标记清除的标记阶段,清除阶段开销极小
  2. cache局部性,复制收集按照引用将关联的对象复制到新空间,在内存空间里距离较近,效率会提升
  3. 在存活对象大比列存在的状况下,复制对象的开销会加大

2.2 引用计数

2.2.1 原理

当对象引用发生变化时,利用引用计数更新对象的状态,判断对象的生死

2.2.2 引用计数

(1)过程

  在对象内部保持一个对该对象的引用计数,当引用发生增减时进行更新

(2)优缺点

  1. 可以作到当即释放垃圾,中断时间短
  2. 没法释放循环引用的对象
  3. 在并行环境下,须要对计数操做进行加锁互斥,开销较大

2.3 跟踪回收和引用计数的结合

2.3.1 分代回收

(1)原理

  大部分对象在短期里会成为垃圾,而通过必定时间仍然存活下来的每每拥有较长的寿命,因此增长新生的对象的扫描,减小老生对象的扫描

(2)过程

  1. GC小回收:利用复制收集,将新空间标记为老生代或利用标记清除方式将存活对象标记为老生代,清除死亡对象
  2. GC大回收(偶尔进行):以所有区域为对象进行GC操做

(3)记录集

  1. 在对象引用发生改变时,若是老生代对象引用到了新生代对象,则将引用记录加入到记录集
  2. 须要时刻保持更新,新生代被老生代引用的瞬间就必须更新

(4)写屏障

  须要将添加到记录集的操做嵌入到对象修改的地方,对全部涉及修改对象的地方进行保护

(5)优缺点

  1. 减小了须要扫描的对象,缩短GC时间
  2. 算法受到程序行为,分代数量,大回收的触发条件的影响

2.3.2 增量回收

(1)原理

  1. 将GC操做分为多个阶段进行
  2. 与分代回收类似,须要增长写屏障,防止存活的对象被清除,而该清除的对象没被清除

(2)优缺点

  中断时间取决于对象的数量,在牺牲总GC时间的状况下,缩短中断时间

2.3.3 并行回收

(1)原理

  1. 程序运行和GC同时进行
  2. 须要写屏障对状态进行实时更新

(2)特色

  1. 在GC的某个阶段仍是须要暂停程序的运行,没法彻底与程序并行
  2. 将来趋势

2.4 GC大一统理论

  全部的GC算法都是跟踪回收和引用计数的结合,二者相互独立,对其中一方进行改善的技术之中必然存在对另外一方的改善技术,而其结果只是两种的结合

 

3 思惟导图

本文连接:http://www.cnblogs.com/cposture/p/4845189.html

相关文章
相关标签/搜索