一、判断对象是否可被回收
1.1 引用计数法
缺点:无法解决对象之间循环依赖的问题
1.2 可达性分析算法
当一个对象GC Roots 没有任何引用链相连,说明此对象不可达。
GC Roots 对象包括以下几种:
- 栈帧中的局部变量表引用的对象
- 方法区中类静态属性引用的对象
- 方法区中常量引用的对象
- Native方法引用的对象
二、垃圾回收算法
- 标记-清除算法
缺点:效率低,且会产生碎片 - 复制算法
Eden:Survivor = 8:1
如果另一块survivor空间不足以存放上一次新生代存活的对象,这些对象将通过【分配担保】进入老年代。
-标记-整理算法
-分代收集算法(主流)
新生代 -> 复制算法(对象存活率低)
老年代 -> 标记-整理算法(对象存活率高)
三、内存分配与回收策略
Min GC: 发生在新生代的垃圾回收
Major GC/ Full GC: 发生在老年代的垃圾回收,出现Full GC,至少伴随一次 Min GC
- 对象优先在** Eden区**分配,如果空间不够,触发一次Min GC
- 大对象直接进入老年代(虚拟机参数控制)
- 长期存活的对象进入老年代
- 动态对象年龄判断
- 空间分配担保