垃圾回收的区域

  • 堆:Java 中绝大多数的对象都存放在堆中,是垃圾回收的重点
  • 方法区:此中的 GC 效率较低,不是重点

由于虚拟机栈的生命周期和线程一致,因此不需要 GC

对象判活

在垃圾收集器对堆进行回收之前,首先要做的就是判断对象是否还存活,哪些已经成为垃圾。判活算法主要有两种:

  • 引用计数法
  • 可达性分析算法

前者基本没有什么应用,不过 Python 还在使用。JVM 使用的都是可达性分析算法

引用计数法

给对象添加一个引用计数器,当对象增加一个引用时计数器加 1,引用失效时计数器减 1。引用计数为 0 的对象可被回收

  • 优点:原理简单、效率高
  • 缺点:对象之间循环引用(A.instance = B, B.instance = A),很难判断

可达性分析算法

通过一系列的称为 GC Roots 的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到 GC Roots 没有任何引用链相连时,则证明此对象是不可用的。从图论的角度来说,就是 GC Roots 到这些对象是不可达的。所以此算法叫做可达性分析算法,如下图所示:

一网打尽JVM垃圾回收知识体系-LMLPHP
01-17 03:49