判断对象是否存活
引用计数算法
给对象添加一个引用计数器,每当被引用时,计数器值加1,当引用失效时,计数器值减1.为0时则没有被引用
难以解决对象之间相互循环使用的问题
objA.instance = objB;
objB.instance = objA;
objA = null;
objB = null;
可达性分析算法
通过一系列称为”GC Roots”的对象作为起始点,向下搜索,走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的,可回收
垃圾收集算法
标记-清除算法(Mark-Sweep)
先标记后清除
存在效率问题和空间问题
复制算法
将可用内存容量划分为大小相等的两块,每次使用其中一块,用完后复制存活对象到另一块,然后全部清除正在使用的内存块
标记-整理算法
让所有存活的对象都向一端移动,然后直接清理掉端边界外的内存
分代收集算法
根据存活周期的不同将内存划分为几块
新生代对象存活率低,复制算法
老年代对象存活率高,”标记-清理”或”标记-整理”算法
垃圾收集器
Serial收集器
单线程收集器,简单而高效
ParNew收集器
多线程收集
Parallel Scavenge收集器
新生代收集器,使用复制算法
目标是达到一个可控制的吞吐量,”吞吐量优先”
不能与CMS收集器配合使用
Serial Old收集器
Serial收集器的老年代版本
Parallel Old收集器
Parallel Scavenge收集器的老年代版本,
CMS收集器(Concurrent Mark Sweep)
以获取最短回收停顿时间为目标的收集器,老年代
G1收集器(Garbage-First)
每次根据允许的收集时间,优先回收价值最大的Region
新生代和老年代
内存分配与回收策略
- 对象优先在Eden分配
- 大对象直接进入老年代
- 长期存活的对象将进入老年代
新生代GC (Minor GC):发生在新生代的垃圾收集动作,速度快
老年代GC (Major GC/ Full GC):发生在老年代的GC,速度慢