jvm中判断对象是否存活的方法
1、引用计数
2、可达性分析
1、什么是引用计数?
每个对象自身持有一个计数器,每当对象被一个地方引用,计数器便+1;当引用失效时,计数器-1。当对象的计数器为0时,该对象便是一个不被使用的对象,即“死亡”。
引用计数器实现简单,效率高。然而难以解决对象之间相互循环引用的问题(两个失效对象相互保存了对方的指针)。故JVM判定对象是否存活,并没有使用引用计数器,而是使用可达性分析算法。
2、什么是可达性分析
可达性分析算法即:有一系列“GCRoots”起点,从这些点开始向下搜索,走过的路径称为“引用链”。若一个对象没有任何引用链可到达GC Roots,那么该对象就是不可用的,即使该对象还与其他对象相关联。
经可达性分析算法所标记出的对象,会进行一次筛选(根据finalize方法)。若经过筛选,判定可回收,那么就会立即回收;若判定没有必要回收,那么就将对象放入F-Queue队列中,进行二次筛查。二次筛查会执行对象的finalize()方法。若对象在这个过程重新与引用链上的任何一个对象建立关联,那么该对象就会从回收集合中移除。否则,对象会被回收。
3、哪些对象可以作为GCRoots的起点呢?
要了解这个问题首先需要了解一下JMM是怎么回事。
从JMM中不难发现Head区主要是保存实例对象的区域,那么哪些地方会引用这些对象呢?
答案呼之欲出了,那就是其区域中含有引用对象地方,这些地方是,栈中引用的对象(包括虚拟机栈和本地方法栈),方法区中的一些静态属性引用的对象 ,常量引用的对象。
综上所述,可作为GC Roots的对象包含:
① 虚拟机栈中引用的对象
② 方法区中类静态属性引用的对象
③ 方法区中常量引用的对象
④ 本地方法栈中引用的对象