好的,关于常见的垃圾回收(GC)算法,我给你做个详细总结:
垃圾回收是自动管理程序内存的技术,自动检测和释放不再使用的对象,避免内存泄漏和悬挂指针。
原理:
优点:实现简单,支持复杂对象图。
缺点:清除时暂停程序,导致“停顿”。
原理:
优点:减少碎片,提高内存利用。
缺点:压缩过程消耗额外时间,暂停时间较长。
原理:
优点:内存分配效率高,无碎片。
缺点:需要额外的内存空间(两倍堆大小)。
思想:
优点:提高回收效率,减少停顿。
广泛使用:Java HotSpot VM、Go GC 等。
原理:
优点:降低程序“停顿”时间。
缺点:实现复杂。
原理:
优点:响应性好,适合交互式应用。
难点:需要处理好程序修改对象与 GC 标记间的同步问题。
算法 | 停顿时间 | 内存利用 | 复杂度 | 应用场景 |
---|---|---|---|---|
标记-清除 | 较长 | 有碎片 | 简单 | 老旧或简单 GC |
标记-压缩 | 较长 | 无碎片 | 中等 | 需要连续内存时 |
复制算法 | 短(小堆) | 无碎片 | 简单 | 新生代回收 |
分代收集 | 短 | 好 | 复杂 | 大多数现代语言 GC |
增量收集 | 短(分步执行) | 视实现而定 | 复杂 | 需要低延迟系统 |
并发收集 | 短(并行执行) | 视实现而定 | 非常复杂 | 交互式、高响应需求 |
Go 语言使用的是 三色标记-清除 的 并发、增量 GC,支持分代回收思想,最大程度减少 STW(Stop The World)时间。
引用计数(Reference Counting)是一种垃圾回收(GC)算法,但它和标记-清除、复制、分代等算法属于不同的类别,具体来说:
特点 | 说明 |
---|---|
及时回收 | 对象引用计数为0时立即回收,无需等待完整 GC |
实现简单 | 逻辑直观,易于理解和实现 |
不需要停顿 | 不会造成长时间停顿,适合实时系统 |
缺点 | 无法处理循环引用,会导致内存泄漏 |
额外开销 | 维护计数器带来性能和空间开销 |
GC 类型 | 代表算法 | 是否解决循环引用 | 停顿情况 |
---|---|---|---|
基于计数的 GC | 引用计数 | 否 | 几乎无停顿 |
标记-清除、分代 | 三色标记-清除、分代回收等 | 是 | 有时会有停顿 |