java的虚拟机如何判断一个对象是否可被回收呢?
我们都知道jvm有一个自动垃圾回收机制,那么她是如何判断一个对象需要回收呢?下文笔者将一一道来,如下所示
对象是否需要回收的判断方法
引用计数器法:
为每个对象创建一个引用计数器
有对象引用时计数器 +1
引用被释放时计数 -1
当计数器为0时就可以被回收
它有一个缺点不能解决循环引用的问题
可达性分析算法:
当一个对象到GC Roots不可达时
在下一个垃圾回收周期中尝试回收该对象
定义一系列GC ROOT为起点
从起点开始向下开始搜索
搜索走过的路径称为引用链
当一个对象到GC ROOT没有任何引用链相连的话
则对象可以判定是可以被回收
可达性分析算法详解
当不能从GC Root寻找一条路径到达该对象时
将进行第一次标记。
第一次标记后检查对象是否重写了finalize()
和是否已经被调用了finalize()方法
若没有重写finalize()方法或已经被调用,则进行回收。
在已经重写finalize()方法且未调用的情况下
将对象加入一个F-Queue 的队列中,稍后进行第二次检查
在第二次标记之前
对象如果执行finalize()方法并完成自救
对象则不会被回收
否则完成第二次标记,进行回收
值得注意的是finalize()方法并不可靠。
虚拟机默认采用的是可达性分析算法
可以作为 GC ROOT 的对象包括:
栈中引用的对象
静态变量、常量引用对象
本地方法栈 native 方法引用的对象
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


