1.1 垃圾回收算法
Garbage Collection(GC)垃圾回收(垃圾收集)指的是程序不关心对象在内存中的生存周期,创建后只需要使用,不用关心何时释放以及如何释放,由JVM自动管理内存、释放这些对象所占用的空间。垃圾回收的历史非常悠久,从1960年Lisp语言开始就支持垃圾回收。垃圾回收针对的是堆空间,目前垃圾回收算法主要有两类:
❑引用计数法:在堆内存中分配对象时,会为对象分配一段额外的空间,这个空间用于维护一个计数器,如果对象增加了一个新的引用,则将增加计数器的值;如果一个引用关系失效,则减少计数器的值。当一个对象的计数器的值变为0,则说明该对象已经被废弃,处于不活跃状态,可以被回收。引用计数法需要解决循环依赖的问题,大家熟知的Python语言中的垃圾回收就使用了引用计数法。
❑可达性分析法(也称为根引用分析法),基本思路就是通过根集合(root set)作为起始点,从这些节点出发,根据引用关系开始搜索,所经过的路径称为引用链,当一个对象没有被任何引用链访问到时,则证明此对象是不活跃的,可以被回收。在JVM中常见的根(root)有线程栈帧(thread frame,用于跟踪线程中活跃对象)、符号表(symbol dictionary)、字符串表(string table)、对象监视器(object synchronizer)、元数据对象(universe)等,这些根共同构成了根集合。
这两种算法各有优缺点,具体可以参考其他文献。JVM的垃圾回收采用了可达性分析法。垃圾回收算法也在不断地演化,按照不同的标准有不同的分类:
❑从垃圾回收算法实现主要分为复制(copy)、标记清除(mark-sweep)和标记压缩(mark-compact)。
❑从回收方式上可以分为串行回收、并行回收、并发回收。
❑从内存管理上可以分为代管理和非代管理。
关于垃圾回收的基本算法,本书不再介绍,具体可以参考其他书籍。