垃圾回收的区域
- 堆:Java 中绝大多数的对象都存放在堆中,是垃圾回收的重点
- 方法区:此中的 GC 效率较低,不是重点
由于虚拟机栈的生命周期和线程一致,因此不需要 GC
对象判活
在垃圾收集器对堆进行回收之前,首先要做的就是判断对象是否还存活,哪些已经成为垃圾。判活算法主要有两种:
- 引用计数法
- 可达性分析算法
前者基本没有什么应用,不过 Python 还在使用。JVM 使用的都是可达性分析算法
引用计数法
给对象添加一个引用计数器,当对象增加一个引用时计数器加 1,引用失效时计数器减 1。引用计数为 0 的对象可被回收
- 优点:原理简单、效率高
- 缺点:对象之间循环引用(A.instance = B, B.instance = A),很难判断
可达性分析算法
通过一系列的称为 GC Roots 的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到 GC Roots 没有任何引用链相连时,则证明此对象是不可用的。从图论的角度来说,就是 GC Roots 到这些对象是不可达的。所以此算法叫做可达性分析算法,如下图所示:
01-17 03:49