上章讲到了如何去访问堆中的对象,现在我们来看看关于对象是否还活着的判断方式,同样的要判断一个对象是否还活着也会有两种方式,往下看:
1.引用计数法
顾名思义引用计数,引用计数就是当我们的对象被引用是时候对应的计数器就会+1,当引用被释放后对应的计数器就会-1.当计数器等于0的时候,就意味着这个对象没有被引用了,也就是说这个可以被gc进行回收,不再存活。
优缺点:
首先这种判断对象存活的方式很简单,相应的效率也会更高一些。
然而 当对象发生了循环引用时候,那么对应的计数器就永远不会为0,也就永不会被回收
由实际列子所示:当某个对象被循环引用的时候,同样也发生了GC回收,那么也就说明了在Hotspot中并没有使用这种判断对象存活的方式,
那么hotspot用的是哪种方式呢?继续看
2.可达性分析引用(根搜索法)
引用计数器强调的是以计数的方式进行对象存活的判断,那么在可达性分析中,则是通过由点-->面的方式进行对象存活判断。其实很简单,以一个节点GC ROOT(如reference引用的对象)一步一步指向堆中的某个地址,然后再一步一步的关联引用,这样我们就很好的知道有被上下引用的对象说明还活着,而没有被上下引用的"孤单"对象则不再存活。
这样通过可达性分析的方式 就能够很好的弥补引用计数器中循环引用中对象无法归0的情况,而在Hotspot中也正是使用了这种判断对象存活的方式
可作为GC ROOT的对象一般有(包括但不限于)以下几种:
1) 栈(包好虚拟机栈和本地方法栈)中的引用对象
2) 方法区中的静态变量,常量引用的对象