并发的可达性分析
jvm如何判断对象是否应该回收
- 引用计数算法
在对象中添加一个引用计数器,每当一个地方引用它时,计数器就加一;当引用失效时,计数器值就减一;任何时刻计数器为零的对象就是不可能再被使用的。
但是,引用计数法不能解决循环依赖问题。
Object 1和Object 2其实都可以被回收,但是它们之间还有相互引用,所以它们各自的计数器为1,则还是不会被回收。
所以,Java虚拟机没有采用引用计数法。它采用的是可达性分析算法。 - 可达性分析算法
可达性分析算法的思路就是通过一系列的“GC Roots”,也就是根对象作为起始节点集合,从根节点开始,根据引用关系向下搜索,搜索过程所走过的路径称为引用链,如果某个对象到GC Roots间没有任何引用链相连。
用图论的话来说就是从GC Roots到这个对象不可达时,则证明此对象是不可能再被使用的。所以此对象就是可以被回收的对象。
并发的可达性分析容易出现的问题
并发标记线程进行标记时,用户修改了某些对象引用导致对象引用图状结构发生变更,会带来以下两种问题:
- 原本可回收对象标记为不可回收
虽然是错