为什么需要垃圾回收

没有垃圾回收器需要自行处理

特性 垃圾回收 (GC) 语言 手动内存管理 (C/C++) 语言
内存释放 自动完成(由运行时环境/JVM 等负责) 手动完成(由程序员负责)
编程效率 高,程序员专注于业务逻辑 低,需花费大量时间处理内存细节
常见错误 性能可能因 GC 停顿而波动(GC overhead) 内存泄漏、悬挂指针、重复释放
程序可靠性 ,错误更少 依赖程序员的经验和细心程度

是否可以被回收

编程语言 主要判断机制 算法类型 特点/备注
Java (JVM) 可达性分析 (Reachability Analysis) Tracing GC (Mark-Sweep, G1, CMS等) 现代 JVM 的标准机制。从 GC Roots 开始遍历,保证没有循环引用问题。
Python (CPython) 引用计数 (Reference Counting) + 循环检测 Reference Counting + Tracing 以引用计数为主,效率高。但需要额外的“循环检测器”来解决对象间的循环引用问题。
JavaScript (V8/Node.js) 可达性分析 (Reachability Analysis) Tracing GC (Mark-Sweep, Mark-Compact) 现代浏览器和 Node.js 引擎的主流方法。不可达对象标记为垃圾。
C# (.NET/CLR) 可达性分析 (Reachability Analysis) 分代式 Tracing GC (Generational GC) 类似于 Java,但通常采用分代回收机制,将对象按生命周期分代管理,提高回收效率。
Go 可达性分析 (Reachability Analysis) 并发 Tracing GC (Concurrent Mark-Sweep) 专为并发设计,追求低延迟,GC 线程与应用线程同时运行(三色标记法)。

可达性分析 (Reachability Analysis)

通过 GC Roots 作为起始点进行搜索,能够到达到的对象都是存活的,不可达的对象可被回收。

Java 虚拟机使用该算法来判断对象是否可被回收,在 Java 中 GC Roots 一般包含以下内容:

引用计数 (Reference Counting)

回收类型

部分收集(Partial GC),整堆收集(Full GC)