常见GC算法

好的,关于常见的垃圾回收(GC)算法,我给你做个详细总结:


🗑️ 什么是垃圾回收(GC)?

垃圾回收是自动管理程序内存的技术,自动检测和释放不再使用的对象,避免内存泄漏和悬挂指针。


🔥 常见 GC 算法分类

1. 标记-清除(Mark-and-Sweep)


2. 标记-压缩(Mark-Compact)


3. 复制算法(Copying)


4. 分代收集(Generational GC)


5. 增量收集(Incremental GC)


6. 并发收集(Concurrent GC)


🧠 总结对比

算法 停顿时间 内存利用 复杂度 应用场景
标记-清除 较长 有碎片 简单 老旧或简单 GC
标记-压缩 较长 无碎片 中等 需要连续内存时
复制算法 短(小堆) 无碎片 简单 新生代回收
分代收集 复杂 大多数现代语言 GC
增量收集 短(分步执行) 视实现而定 复杂 需要低延迟系统
并发收集 短(并行执行) 视实现而定 非常复杂 交互式、高响应需求

💡 Go 语言的 GC

Go 语言使用的是 三色标记-清除并发、增量 GC,支持分代回收思想,最大程度减少 STW(Stop The World)时间。


引用计数(Reference Counting)是一种垃圾回收(GC)算法,但它和标记-清除、复制、分代等算法属于不同的类别,具体来说:


📌 引用计数属于 基于计数的垃圾回收算法

工作原理


🧩 引用计数的特点

特点 说明
及时回收 对象引用计数为0时立即回收,无需等待完整 GC
实现简单 逻辑直观,易于理解和实现
不需要停顿 不会造成长时间停顿,适合实时系统
缺点 无法处理循环引用,会导致内存泄漏
额外开销 维护计数器带来性能和空间开销

🆚 与其他 GC 算法的区别

GC 类型 代表算法 是否解决循环引用 停顿情况
基于计数的 GC 引用计数 几乎无停顿
标记-清除、分代 三色标记-清除、分代回收等 有时会有停顿

💡 实际应用