你好,我是风一样的树懒,一个工作十多年的后端开发,曾就职京东、阿里等多家互联网头部企业。
面试可能会经常被问到垃圾回收器(Garbage Collector)和垃圾回收算法(Garbage Collection Algorithm),它们两者是不一样的概念,一定要区别开来,它们是 Java 内存管理中两个紧密相关但又不同的概念。以下是它们的区别和联系:
垃圾回收器是 JVM 中实际负责执行垃圾回收操作的组件。它是垃圾回收算法的具体实现,应用于 Java 堆内存的管理。
自动管理内存:发现不再被引用的对象并回收它们所占用的内存。
执行垃圾回收算法:以特定的策略执行算法,清除垃圾对象。
垃圾回收器具体实现了垃圾回收算法。
不同垃圾回收器适用于不同场景,如低延迟、高吞吐量等需求。
Serial GC(串行垃圾回收器):单线程,适用于单核 CPU 或小型应用。
Parallel GC(并行垃圾回收器):多线程,适合多核 CPU 和高吞吐量的应用。
CMS GC(Concurrent Mark-Sweep):低停顿,适合需要低延迟的应用。
G1 GC(Garbage-First):面向延迟敏感应用,分区式管理堆内存。
ZGC:专注于低延迟,垃圾回收停顿时间非常短。
Shenandoah GC:类似于 ZGC,支持大内存和低延迟。
垃圾回收算法是垃圾回收器的核心逻辑,用于判定哪些对象是垃圾,以及如何回收这些垃圾对象的内存。
提供一种逻辑和流程,用于标记垃圾对象、清理和重新分配内存。
决定回收的效率和性能。
通过维护每个对象的引用计数来判断对象是否可回收。
缺点:无法处理循环引用。
分为标记阶段和清除阶段,标记存活对象后回收未被标记的对象。
缺点:内存碎片化。
复制算法(Copying):
将内存分为两块,将存活对象复制到另一块内存,再清理整个区域。
优点:高效无碎片化,适合年轻代。
在标记阶段后移动存活对象,压缩内存,消除碎片。
适合老年代。
将内存划分为年轻代和老年代,年轻代使用复制算法,老年代使用标记-清除或标记-压缩算法。
特性 | 垃圾回收器 | 垃圾回收算法 |
---|---|---|
定义 | 执行垃圾回收的实际组件 | 用于垃圾回收器的逻辑与策略 |
作用范围 | 负责应用垃圾回收算法并清理内存 | 提供回收对象的判定和清理策略 |
种类 | Serial、Parallel、CMS、G1、ZGC 等 | 引用计数、标记-清除、复制、分代回收等 |
关系 | 垃圾回收器具体实现了某种或多种垃圾回收算法 | 算法是垃圾回收器的理论基础 |
优化目标 | 针对特定场景优化(延迟、吞吐量、内存大小) | 提高垃圾回收效率和降低内存碎片化 |
CMS 垃圾回收器
使用 标记-清除算法 来实现垃圾回收,提供低停顿的回收效果。
G1 垃圾回收器
使用分区管理和 标记-压缩算法,优先回收收益最高的区域(Garbage-First)。
Parallel GC
使用分代回收算法,在年轻代采用复制算法,在老年代采用标记-压缩算法。
垃圾回收算法 是逻辑层面,它提供了对象存活判定和内存回收的策略。
垃圾回收器 是物理层面,它是 JVM 的实现,实际执行垃圾回收算法。
理解垃圾回收算法有助于分析垃圾回收器的行为和调优性能。
今天的内容就分享到这儿,喜欢的朋友可以关注,点赞。有什么不足的地方欢迎留言指出,您的关注是我前进的动力!