JVM系列(九) -垃圾对象的回收算法介绍
一、摘要
在之前的文章中,我们介绍了 JVM 内部布局、对象的创建过程以及运行期的相关优化手段。
今天通过这篇文章,我们一起来了解一下对象回收的判定方式以及垃圾对象的回收算法等相关知识。
二、对象回收判定方式
当一个对象被创建时,虚拟机会优先分配到堆空间中,当对象不再被使用了,虚拟机会对其进行回收处理,以便释放内存空间,这个过程也被称为垃圾对象回收。
那么如何找到对象是否可以进行回收呢?一般有两种方式。
- 引用计数法
- 可达性分析法
下面我们一起来了解下相关知识。
2.1、引用计数法
这个方法的实现思路是:在对象中维护一个引用计数器,每当一个地方引用这个对象时,计数器值+1;当引用失效时,计数器值-1。当对象的计数器值为 0,表示这个对象不再被使用了,可以被回收。
这种方法使用场景很多,但很少有垃圾收集器会使用这种方式。
原因在于:这种方式存在一个致命的缺陷,比如堆中的两个对象相互引用,此时他们的计数器值是 1,但这两个对象并没有被外部使用,因此不会被回收,容易造成内存泄露。
2.2、可达性分析法
这个方法的实现思路是:从“GC Roots”(这个 GC Roots 可以是栈中的引用变量,也可以是方法区的引用变量或常量)开始扫描堆中的对象,沿着 GC Roots 一路扫描,被扫描的所有对象全部标记为存活对象;扫描完成之后,没有被标记的视为垃圾对象