上章讲到了如何去访问堆中的对象,现在我们来看看关于对象是否还活着的判断方式,同样的要判断一个对象是否还活着也会有两种方式,往下看:

1.引用计数法

JVM(五):怎么去判断对象是否还活着?

顾名思义引用计数,引用计数就是当我们的对象被引用是时候对应的计数器就会+1,当引用被释放后对应的计数器就会-1.当计数器等于0的时候,就意味着这个对象没有被引用了,也就是说这个可以被gc进行回收,不再存活。

优缺点:

首先这种判断对象存活的方式很简单,相应的效率也会更高一些。

然而  当对象发生了循环引用时候,那么对应的计数器就永远不会为0,也就永不会被回收

 

JVM(五):怎么去判断对象是否还活着?

由实际列子所示:当某个对象被循环引用的时候,同样也发生了GC回收,那么也就说明了在Hotspot中并没有使用这种判断对象存活的方式,

那么hotspot用的是哪种方式呢?继续看

 

2.可达性分析引用(根搜索法)

JVM(五):怎么去判断对象是否还活着?

引用计数器强调的是以计数的方式进行对象存活的判断,那么在可达性分析中,则是通过由点-->面的方式进行对象存活判断。其实很简单,以一个节点GC ROOT(如reference引用的对象)一步一步指向堆中的某个地址,然后再一步一步的关联引用,这样我们就很好的知道有被上下引用的对象说明还活着,而没有被上下引用的"孤单"对象则不再存活。

这样通过可达性分析的方式  就能够很好的弥补引用计数器中循环引用中对象无法归0的情况,而在Hotspot中也正是使用了这种判断对象存活的方式

 

可作为GC ROOT的对象一般有(包括但不限于)以下几种:

1) 栈(包好虚拟机栈和本地方法栈)中的引用对象

2) 方法区中的静态变量,常量引用的对象

 

 

 

 

 

 

相关文章: