引用计数法 vs 可达性分析:两种判断算法对比
引言:两种流派的对决 判断对象是否存活,是垃圾回收的第一步。业界有两种主流算法: 引用计数法(Reference Counting)- 简单直接,实时性好 可达性分析法(Reachability Analysis)- 复杂但准确,能解决循环引用 Python选择了引用计数,Java选择了可达性分析。为什么?各有什么优缺点? 本文将深入对比这两种算法,理解它们的工作原理、适用场景,以及主流虚拟机的选择。 引用计数算法详解 核心原理 为每个对象添加一个引用计数器: 初始值为0 每增加一个引用,计数器+1 每减少一个引用,计数器-1 计数器为0时,对象可被回收 详细工作流程 public class ReferenceCountingExample { public static void main(String[] args) { Object obj = new Object(); // ① Object ref1 = obj; // ② Object ref2 = obj; // ③ ref1 = null; // ④ ref2 = null; // ⑤ } } 引用计数变化: 步骤 操作 计数值 说明 ① new Object() 0 → 1 创建对象,obj引用它 ② ref1 = obj 1 → 2 增加引用ref1 ③ ref2 = obj 2 → 3 增加引用ref2 ④ ref1 = null 3 → 2 减少引用ref1 ⑤ ref2 = null 2 → 1 减少引用ref2 方法结束 obj失效 1 → 0 对象可被回收 优点 1️⃣ 实现简单 只需为每个对象添加一个整数计数器,逻辑清晰易懂。 ...