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