如何判断对象是否已经死亡

判断对象是否已经死亡的方法有两种

1.引用计数算法

介绍:给对象添加一个引用计数器,没当有一个地方引用它的时候,计数器加1,当引用失效时,计数器就减一,当计数器为0的对象就是不可能被使用的。
优缺点:判断对象是否存活的效率高,但是无法解决对象之间的循环引用问题。

2.根搜索算法
介绍:通过一系列名为GC Roots的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链,说明不可达,则可以回收。
也就是说如果GC ROOt对象没有引用这些对象,则这些对象可以回收
优缺点:可以解决循环引用问题,缺点是判定对象是否已死的速度较慢

GC Roots
1.虚拟栈,即栈帧中的本地变量表( 局部变量表)中的引用对象。(我觉得是方法内部对象)
2.方法区的类静态变量引用的对象
3.方法区中的常量引用的对象
4.本地方法中引用的对象

一般我们引用中存着堆中对象的地址或者句柄地址

生存还是死亡
1.当被jvm 第一次标记不可达的时候会被标记依次,并看起示范需要执行finalize()方法,当对象没有覆盖这个方法或者这个方法已经被调用了,虚拟机都视为不需要执行。不需要执行则第二次标记的时候直接回收
2.如果需要执行,jvm会把该对象放入F-Queue队列,并启动一个优先级很对的finalizer线程去执行这个方法,但是是否执行还看具体情况,jvm不承诺一定执行。
3.如果我们在finalize()方法重新把对象和gcroot挂钩则对象,不会被回收

回收方法区
1.回收废弃常量,只要没有GC ROOt 引用
2.回收无用的类条件:该类所有的实例都被回收,加载该class的classloader 已经被回收,该类的class对象没有在任何地方引用,即无法在任何地方通过反射获取该类的方法

你可能感兴趣的:(如何判断对象是否已经死亡)