jvm-判断对象是否存活的算法

来源:互联网 发布:java基础数据类型长度 编辑:程序博客网 时间:2024/05/22 14:33

一、引用计数算法

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()方法只会执行一次。