没有垃圾回收器需要自行处理
| 特性 | 垃圾回收 (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 线程与应用线程同时运行(三色标记法)。 |
通过 GC Roots 作为起始点进行搜索,能够到达到的对象都是存活的,不可达的对象可被回收。
Java 虚拟机使用该算法来判断对象是否可被回收,在 Java 中 GC Roots 一般包含以下内容:
部分收集(Partial GC),整堆收集(Full GC)