GC 的作用是什么?常用垃圾回收算法有哪些?
1 个回答
天越来越黑,星星会越来越亮。姬雪我直接帮你分成两部分讲:先说 **GC 的作用**,再说 **常用垃圾回收算法**,这样你看一眼就能记住。 ## 1. GC 的作用 GC(Garbage Collection,垃圾回收)在 Java 中主要负责: 1. **自动释放无用对象占用的内存**(避免手动 `free` 的复杂性和内存泄漏) 2. **避免内存溢出(OOM)**,让程序尽可能长时间稳定运行 3. **消除悬挂指针、野指针问题**(Java 没有显式内存释放操作) 4. **配合 Java 内存模型(JMM)管理堆、方法区等运行时内存区域** 一句话总结: > GC = 自动管理堆内存 + 释放不再被引用的对象 ## 2. 常用垃圾回收算法 ### 2.1 引用计数(Reference Counting) * **原理**:每个对象维护一个引用计数器,有引用加一,引用失效减一,计数为 0 时回收。 * **优点**:实现简单、回收及时 * **缺点**:无法处理循环引用(Java 的 GC 不采用,但在 CPython 等地方用) ### 2.2 标记-清除(Mark-Sweep) * **过程**: 1. **标记**:从 GC Roots(栈、静态变量等)开始标记可达对象 2. **清除**:回收未标记的对象 * **优点**:不移动对象,易实现 * **缺点**:会产生大量内存碎片 ### 2.3 标记-整理(Mark-Compact) * **过程**: 1. 标记可达对象 2. 将存活对象移动到内存一端,按顺序重新排列 3. 清理边界外的垃圾对象 * **优点**:解决了内存碎片问题 * **缺点**:移动对象有额外开销 ### 2.4 复制算法(Copying) * **过程**: 1. 将内存分成两块(From/To) 2. 只用一块,回收时把存活对象复制到另一块,清空原来的 * **优点**:没有碎片,分配简单(指针碰撞) * **缺点**:需要双倍内存空间 * **应用**:新生代(Eden + Survivor 区)回收 ### 2.5 分代收集(Generational Collection) * **原理**:根据对象生命周期长短分代,分别使用不同算法优化性能 * **新生代**(Young Generation):对象存活率低 → 用复制算法 * **老年代**(Old Generation):对象存活率高 → 用标记-清除或标记-整理 * **优点**:综合利用不同算法优点,效率高 * **缺点**:实现复杂 ## 3. 总结对比表 | 算法 | 优点 | 缺点 | 应用场景 | | ----- | ------- | -------- | ------------- | | 引用计数 | 即时回收 | 循环引用无法回收 | 少数语言(Java 不用) | | 标记-清除 | 实现简单 | 内存碎片多 | 老年代(早期) | | 标记-整理 | 无碎片 | 移动对象耗时 | 老年代 | | 复制算法 | 分配快、无碎片 | 占用双倍内存 | 新生代 | | 分代收集 | 高效综合 | 实现复杂 | HotSpot 默认策略 |发布于 2025-08-13 09:55 •IP属地 广西举报评论收藏
公众号进入网站体验更佳

