【JVM】JVM 判断对象存活算法(引用计数算法与根可达性分析算法)

52 阅读2分钟

@[TOC]

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


引用计数算法

介绍

引用计数算法的实现方式很简单,就是当有一个引用指向该对象的时候它的计数器就会加一,下面是一个示例图: 在这里插入图片描述 如果某个对象没有被引用,那就说明该对象可以被清除掉了。


问题

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



根可达性分析算法

介绍

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

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

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

在这里插入图片描述

GC Root

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





End