垃圾回收(Garbage Collection,下文简称GC)也称为垃圾收集,Java 程序会不定时地被唤起检查是否有不再被使用的对象,并释放它们占用的内存空间。
垃圾回收需要完成的三件事情: 哪些内存需要回收 什么时候回收 如何回收
给每个创建的对象添加一个引用计数器,每当此对象被某个地方引用时,计数值 + 1,引用失效时 -1,所以当计数值为 0 时表示对象已经不能被使用。引用计数算法大多数情况下是个比较不错的算法,简单直接 判定效率高,也有一些著名的应用案例但是对于Java虚拟机来说,并不是一个好的选择,因为它很难解决对象直接相互循环引用的问题。
在主流的商用程序语言如 Java、C# 等,都是通过可达性(Reachability Analysis)来判断对象是否存活的。此算法的基本思路就是通过一系列的“GC Roots”的对象作为起始点,从起始点开始向下搜索到对象的路径。搜索所经过的路径称为引用链(Reference Chain),当一个对象到任何 GC Roots 都没有引用链时,则表明对象不可达,即该对象是不可用的。