对象已死吗?
在堆里面存放的都是java的对象实例,垃圾收集器在对堆进行回收之前,要判断里面的对象哪些还’活着’,哪些已‘死去’。
判断对象是否活着(有路径使用的对象)的方法:
- 引用计数器法:
给对象添加一个引用计数器,每当有一个地方引用它时,计数器+1。任何时刻计数器为0的对象就是不可能被使用的,这些就会被回收。
优点:实现简单,效率也高。
缺点:无法解决循环依赖的问题。主流的java虚拟机没使用该方法
- 可达性分析算法:
思路:通过一系列称为“GC Roots”的对象作为起始点,从这些节点往下搜索,走过的路径称为引用链。当一个对象到GC Roots没有任何引用链相连接时,则改对象是不可以用的。
(图论叫做从CC Roots到这个对象不可达)
在Java中,可作为GC Roots的对象包括以下几种:
- 虚拟机栈中引用的对象。
- 方法区中类静态属性引用的对象。
- 方法区中常量引用的对象。
- 本地方法栈中Native引用的对象。
生存 or 死亡
即使在可达性分析算法中不可达的对象,也并非是‘非死不可’的,这个时候他们处于“缓刑”中。
要真正宣告死亡至少要经历两次标记过程。