一、引用计数算法
- 当有一个地方引用这个对象时,计数器加1
- 当引用失效时,计数器减1
- 当计数器为0时,则对象死亡,等待回收
二、 可达性分析算法
- 若一个对象无法通过引用链接到GC Roots时,则判定该对象为可回收对象(第一次标记)
- 目前java虚拟机采用的就是 可达性分析算法 判断对象是否可回收
- 对于虚拟机判定的可回收对象,还会再次进行标记是否有必要执行finalize()方法
- 该类中没有覆盖finalize()方法,则没有必要执行finalize()方法
- 虚拟机已经调用过一次finalize()方法,则没有必要执行finalize()方法
- 除了上述两种情况,虚拟机都会为对象执行finalize()方法
- 若虚拟机判定对象可回收,则此时将对象放到F-Queue中等待执行finalize()方法
- 若在覆盖的finalize()方法中,将可回收对象赋值给其他变量,则这个对象在第二次标记时被移除出可回收集合