你还了解过其他的垃圾回收算法吗?
你还了解过其他的垃圾回收算法吗?
提示
题眼: 对比 Java、Python、C 等语言。建议了解,主要四类:引用计数、分代回收、标记清除、手动管理。
除了 Go 常见的三色标记和标记清除思想之外,还可以了解几类常见的垃圾回收策略:
- 引用计数:对象被引用一次就加一,不再引用就减一,减到零时回收。
- 分代回收:按对象生命周期分代,针对不同代采用不同回收策略。
- 标记清除:从根对象出发做可达性分析,未标记对象再统一回收。
- 手动管理:由程序员手动申请和释放内存。
不同语言里常见的倾向:
- Python 常见的是引用计数加其他辅助回收机制。
- Java 常见的是分代回收加多种具体 GC 实现。
- C/C++ 更偏手动内存管理或智能指针。
重要
参考答案:
除了 Go 的三色标记法以外,常见的垃圾回收思路还有引用计数、分代回收、传统标记清除,以及 C/C++ 里更典型的手动内存管理。
引用计数的优点是简单直接,对象没人引用就能马上回收,但它有循环引用问题。分代回收更适合像 Java 这种对象生命周期分布很明显的场景,把新生代和老年代分开处理,效率通常比较高。标记清除的优点是通用,但它往往要面对 STW 或额外并发控制的问题。
如果面试官追问,你可以补一句:Go 更关注高并发和低延迟,所以它没有走典型的分代路线,而是把并发标记清除这条路做得更细。
