《GC算法》

GC 算法、垃圾收集器

在 Java 中有两个最基本的回收算法:复制算法和标记清理算法

复制算法

两个区域 A 和 B,初始对象在 A,继续存活的对象被转移到 B。为新生代最常用的算法

标记清理算法

一块区域,标记可达对象(可达性分析),然后回收不可达对象。

标记 - 整理算法

通过标记清理算法回收会,会出现碎片,通过碎片整理算法,整理出更大的内存存放更大的对象

新生代和年老代

新生代:初始对象,生命周期短

永久代:长时间存在的对象

整个 Java 的垃圾回收是 新生代和年老代的协作,被称为 分代回收。


Serial New 收集器,是针对新生代的收集器,采用的是复制算法

Parallel New 并行收集器,新生代采用复制算法,年老代采用标记整理

Parallel Scavenge 并行收集器,针对新生代,采用复制收集算法

Serial Old 串行收集器,新生代采用复制,年老代采用标记整理

CMS 收集器,基于标记清理

G1 收集器,整体上基于标记整理,局部采用复制

  • 新生代基本采用复制算法,年老代采用标记整理算法,CMS 采用标记清理

如何判断对象已死?

1. 引用计数法

通过一个计数器记录该对象被引用的次数,简单高效。

弊端:无法解决循环引用问题。例如 A 包含指向 B 的引用,B 包含指向 A 的引用,但是没有引用指向 A 和 B,此时 AB 的引用次数都为 1,都不会被回收。

2. 根搜索

通过选取一些 根对象 作为起始点,开始向下搜索,如果一个对象到跟对象不可达时,则说明此对象没有被引用,可以回收。

可作为 根对象 的有:栈中变量引用的对象,类静态属性引用对象,常量引用对象等。

3. 策略:垃圾回收算法

即上面说的几种算法

文章作者: koral
文章链接: http://luokaiii.github.io/2018/10/11/后端/java/GC算法/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自