面试可能会经常被问到垃圾回收器与垃圾回收算法,两者是不一样的,不要乱答

你好,我是风一样的树懒,一个工作十多年的后端开发,曾就职京东、阿里等多家互联网头部企业。

点击下方👇关注公众号,带你一起复习后端技术,看看面试考点,补充积累技术知识,每天都为面试准备积累


面试可能会经常被问到垃圾回收器(Garbage Collector)和垃圾回收算法(Garbage Collection Algorithm),它们两者是不一样的概念,一定要区别开来,它们是 Java 内存管理中两个紧密相关但又不同的概念。以下是它们的区别和联系:


01
垃圾回收器(Garbage Collector)


定义

垃圾回收器是 JVM 中实际负责执行垃圾回收操作的组件。它是垃圾回收算法的具体实现,应用于 Java 堆内存的管理。

作用

  • 自动管理内存:发现不再被引用的对象并回收它们所占用的内存。

  • 执行垃圾回收算法:以特定的策略执行算法,清除垃圾对象。

特点

  • 垃圾回收器具体实现了垃圾回收算法。

  • 不同垃圾回收器适用于不同场景,如低延迟、高吞吐量等需求。

常见垃圾回收器

  • Serial GC(串行垃圾回收器):单线程,适用于单核 CPU 或小型应用。

  • Parallel GC(并行垃圾回收器):多线程,适合多核 CPU 和高吞吐量的应用。

  • CMS GC(Concurrent Mark-Sweep):低停顿,适合需要低延迟的应用。

  • G1 GC(Garbage-First):面向延迟敏感应用,分区式管理堆内存。

  • ZGC:专注于低延迟,垃圾回收停顿时间非常短。

  • Shenandoah GC:类似于 ZGC,支持大内存和低延迟。


02
垃圾回收算法(Garbage Collection Algorithm)


定义

垃圾回收算法是垃圾回收器的核心逻辑,用于判定哪些对象是垃圾,以及如何回收这些垃圾对象的内存。

作用

  • 提供一种逻辑和流程,用于标记垃圾对象、清理和重新分配内存。

  • 决定回收的效率和性能。

常见垃圾回收算法

引用计数算法:
  • 通过维护每个对象的引用计数来判断对象是否可回收。

  • 缺点:无法处理循环引用。


标记-清除算法(Mark-Sweep):
  • 分为标记阶段和清除阶段,标记存活对象后回收未被标记的对象。

  • 缺点:内存碎片化。


复制算法(Copying):


  • 将内存分为两块,将存活对象复制到另一块内存,再清理整个区域。

  • 优点:高效无碎片化,适合年轻代。

标记-压缩算法(Mark-Compact):
  • 在标记阶段后移动存活对象,压缩内存,消除碎片。

  • 适合老年代。


分代回收算法(Generational Collection):
  • 将内存划分为年轻代和老年代,年轻代使用复制算法,老年代使用标记-清除或标记-压缩算法。




03
区别与联系


特性垃圾回收器垃圾回收算法
定义执行垃圾回收的实际组件用于垃圾回收器的逻辑与策略
作用范围负责应用垃圾回收算法并清理内存提供回收对象的判定和清理策略
种类Serial、Parallel、CMS、G1、ZGC 等引用计数、标记-清除、复制、分代回收等
关系垃圾回收器具体实现了某种或多种垃圾回收算法算法是垃圾回收器的理论基础
优化目标针对特定场景优化(延迟、吞吐量、内存大小)提高垃圾回收效率和降低内存碎片化


04
示例说明


CMS 垃圾回收器
使用 标记-清除算法 来实现垃圾回收,提供低停顿的回收效果。

G1 垃圾回收器
使用分区管理和 标记-压缩算法,优先回收收益最高的区域(Garbage-First)。

Parallel GC
使用分代回收算法,在年轻代采用复制算法,在老年代采用标记-压缩算法。


05
总结


  • 垃圾回收算法 是逻辑层面,它提供了对象存活判定和内存回收的策略。

  • 垃圾回收器 是物理层面,它是 JVM 的实现,实际执行垃圾回收算法。

  • 理解垃圾回收算法有助于分析垃圾回收器的行为和调优性能。

今天的内容就分享到这儿,喜欢的朋友可以关注,点赞。有什么不足的地方欢迎留言指出,您的关注是我前进的动力!

END


扫码关注

一起积累后端知识
不积跬步,无以至千里
不积小流,无以成江海

喜欢此内容的人还喜欢

谈谈id那些事(五)——美团的 Leaf 的ID生成


一个阿里二面面试官必问的问题


Lambda表达式说爱你不容易


分享面试:mysql数据库索引失效的情况


Spring-Boot中一个不起眼的好工具StopWatch