对象存活的两种判断
- 引用计数法 (缺陷:循环引用)
- 根可达算法,从GC Roots 对象开始查找没有任何引用的对象
GC Roots 对象
- 虚拟栈中引用的对象
- 本地方法栈JNI引用对象
- 本地方法静态类属性引用对象
- 方法区常量池引用的对象
垃圾回收算法
-
标记清除算法 (效率低,空间碎片多)
a. 从跟节点标记所有可达对象 b. 清除未被标记对象 -
标记整理算法 (效率低,没有空间碎片)
a. 从跟节点标记所有可达对象 b. 移动所有可达对象到一端 c. 清除边界外的所有对象 -
复制算法 (效率高,没有空间碎片,但是耗内存,对象存活过多,会有太多对象进行复制,影响效率,只适用于少数对象复制的场景)
a.从根节点标记所有可达对象 b. 复制所有可达对象到另一块内存 c.清除前面内存整个空间
由于上述的几种算法各有优缺点,所以使用分代算法去合理利用上面的3中算法
分代算法
- 年轻代 ,Eden , S0, S1, =年轻代存活对象相对较少,可以使用复制算法提高效率和解决空间碎片问题
- 老年代, 老年代存活对象过多,使用标记整理算法
- 永久代,永久代基本很少被清理,使用标记整理算法
垃圾回收器有哪些
- Serial 收集器 (复制算法) 新生代收集器 单线程收集器
- Serial old 收集器(标记整理算法)老年代收集器 单线程收集器
- ParNew收集器(复制算法)新生代收集器 多线程收集器
- Parallel Scavenge (复制算法)新生代收集器, 追求高吞吐量
- Parallel Old收集器(标记整理算法)老年代收集器 吞吐量优先
- CMS(Concurrent Mark Sweep)收集器(标记清楚算法)老年代并行收集器,追求最短GC停顿
- G1收集器(标记整理算法)