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. 策略:垃圾回收算法
即上面说的几种算法