文章目录

  • 引用计数算法
  • 介绍
  • 问题
  • 根可达性分析算法
  • 介绍
  • GC Root


在 JVM 中,需要检查出还有哪些存活对象(就是哪些对象还在使用),哪些未存活对象,未存活对象又被称之为垃圾对象,只有知道了哪种是垃圾对象,才能进行后续的垃圾回收,下面是两种判断对象存活的算法。



引用计数算法

介绍

引用计数算法的实现方式很简单,就是当有一个引用指向该对象的时候它的计数器就会加一,下面是一个示例图:

java 根可达算法 根可达算法和引用_java


如果某个对象没有被引用,那就说明该对象可以被清除掉了。


问题

那么这种算法的问题也很明显,如果是对象之间相互引用,那么就会出现循环引用的问题,这样的话就没办法判断出该对象是否是垃圾对象,下面是循环引用的示例图:

java 根可达算法 根可达算法和引用_算法_02




根可达性分析算法

介绍

根可达性分析算法为什么被称之为根可达性分析算法,是因为这种算法是从根上寻找,那么什么是根呢?
比如说,我们创建了两个对象,来演示什么是根:

Object o1 = new Object();
Object o2 = new Object();
o2 = null;

通过代码知道,一开始创建了两个Object对象,后面把变量o2的引用指向了null,那么这里的根,分别有o1和o2,而根可达算法则是通过o1和o2的引用去寻找对象,这时候就能看出,通过根可达算法只能找到Object 1对象,而Object 2对象则没有变量引用,就被判定为可回收对象,下面是展示图:

java 根可达算法 根可达算法和引用_算法_03

GC Root

在上述的根可达分析算法中,变量o1和o2又被称之为 GC Root 对象,而在Java语言中,可以作为GC Roots的对象包括:
1、虚拟机栈(栈帧中的局部变量区、操作数栈)、本地方法栈中引用的对象。
2、方法区中类静态属性引用的对象。
3、方法区中常量引用的对象。
4、本地方法栈中JNI(即一般所说的Native方法)引用的对象。






End