一、引用计数算法
1、给每一个对象添加一个引用计数器,当有引用指向对象时,计数器加一,引用移除时,计数器减一,当计数器为0时,说明对象未被引用,可以回收。
2.存在问题:两个对象互相引用,此时不会被回收。
3、优点:简单高效
4、java虚拟机不采用
二、根搜索算法
1、通过一系列的名为“GC Roots”的对象作为起点,从这些节点向下搜索,经过的路径称为引用链,当一个对象没有引用链即是可回收状态。
2、java语言中的GC Roots
虚拟机栈中的引用对象
方法区中的类静态属性引用的对象
方法区常量引用的对象
本地方法栈中JNI的引用对象
3、java虚拟机采用
三、对象的死亡过程
1、一个对象真正死亡至少要经过两次标记。
2、第一次标记:经过根搜索发现没有与GC Roots相链接,
标记条件:是否有必要执行finalize()方法,对象没有覆盖finalize()方法,或finalize()方法已经被虚拟机执行被视为没有必要执行。
3、被标记的对象将获得重生的机会,会放入一个F-Queue队列中,
4、第二次标记:GC对F-Queue进行第二次小规模标记,这个过程中对象重新与引用链上,获得重生,否则死亡。
注意:所有对象的finalize()方法只会执行一次。