大腿的博客

jvm如何判断一个对象是否存活

字数统计: 438阅读时长: 1 min
2019/03/18 Share

记录看深入理解java虚拟机关于对象是否存活的知识。

算法

引用计数算法

算法思路:当引用一个对象时,设置引用计数器+1。当不再引用一个对象时,引用计数器-1。最后判断计数器是否为0。如果是0说明未被引用。否则说明该对象被引用。
存在问题:对象的循环引用得不到处理。

可达性分析算法

jvm使用的分析算法。
算法思路:设置对象回收的根节点(GC Roots),从根节点向下搜索,搜索到说明对象在使用。如果对象没有达跟节点的使用链,判定为可回收对象。
java中 可作为GC Roots的对象包括

  1. 虚拟机栈中引用的对象。
  2. 方法区中的静态属性引用的对象。
  3. 方法区中常量引用的对象。
  4. 本地方法栈中JNI(即一般说的Native方法)引用的对象。

对象引用类型

参考博客

是否死亡?

在对象找不到GC Roots的情况下,对象也不是必定死亡可以回收空间。它们其实只是被判刑,却还有一次挽回的机会。
对没有GC Roots的对象,进一步判断是否有必要进行finalize()方法的筛选。如果一个对象判断为没有覆盖finalize()方法或者finalize()已经被执行过,那么这个对象基本上确定需要被gc了。如果这个对象有需要进行finalize()的方法,可在finalize()方法内进行对GC Roots节点的链接,实现了自我救赎,否则该对象基本上就需要gc了。
finalize()方法只会执行一次。

原文作者:大腿君的大腿君

原文链接:https://shiyuquan.github.io/2019/03/18/jvm如何判断一个对象是否存活/

发表日期:2019-03-18 17:49:28

更新日期:2019-03-18 18:28:48

版权声明:来自于大腿的许可

CATALOG
  1. 1. 算法
    1. 1.1. 引用计数算法
    2. 1.2. 可达性分析算法
  2. 2. 对象引用类型
  3. 3. 是否死亡?