【JVM】面试题-有哪些垃圾回收器


【JVM】面试题-有哪些垃圾回收器

在JVM的内存管理中,垃圾收集算法是内存回收的核心逻辑与方法论,而垃圾收集器则是将这套方法论落地实现的具体工具。

不同的垃圾收集器针对JVM堆的不同分代(新生代、老年代)设计,具备不同的性能特点,适配不同的应用场景,也是JVM面试中的高频考点。

复制代码
======= 🌟 青柠来相伴,代码更简单。🌟 =======
📚 本文所有内容,我都整理在了 青柠合集 里。👇
🎯 搜索关注【青柠代码录】,即可查看所有合集文章 ~
======= 🌟 ================ 🌟 =======

以下将详细解析7种常用垃圾收集器,它们各自作用于不同的内存分代,部分收集器之间可搭配使用,具体分类及特点如下:

其中,按回收范围可明确划分:

  • 仅作用于新生代的收集器:Serial、Parallel Scavenge、ParNew;
  • 仅作用于老年代的收集器:Serial Old、Parallel Old、CMS;
  • 可回收整个Java堆(新生代+老年代)的收集器:G1。

从垃圾收集算法的应用来看,存在明确的分代适配规律:新生代垃圾回收器普遍采用复制算法 ,该算法的核心优势是执行效率高,垃圾回收速度快,不足则是会浪费部分内存空间(需预留空闲区域用于复制);老年代垃圾回收器则多采用标记-整理算法,可有效避免内存碎片,适配老年代对象生命周期长、占用内存大的特点。

需要注意的是,不同收集器之间的连线代表它们可搭配使用(如Serial与Serial Old、ParNew与CMS等),实际应用中需根据应用的性能需求选择合适的组合。

下面逐一解析每种收集器的核心特点、采用算法及适用场景:

  • Serial收集器(复制算法):新生代专属的单线程垃圾收集器,其标记垃圾、清除垃圾的整个过程均由单个线程完成。核心优势是实现简单、占用内存资源少,在单核心CPU环境下效率较高;缺点是单线程执行会导致GC期间用户线程阻塞,停顿时间随内存规模增大而变长,适合小型应用或单核心环境。
  • Parallel Scavenge收集器(复制算法) :新生代并行垃圾收集器,与Serial收集器的核心区别是支持多线程并行回收。其设计目标是追求高吞吐量,吞吐量的计算公式为:吞吐量 = 用户线程运行时间 /(用户线程运行时间 + GC线程运行时间)。高吞吐量意味着能最大限度利用CPU资源执行用户业务逻辑,减少GC线程占用CPU的时间,适合后台计算、批量处理等对交互响应速度要求不高的场景。
  • ParNew收集器(复制算法):同样是新生代并行收集器,本质上是Serial收集器的多线程优化版本。它保留了Serial收集器的核心逻辑,仅将单线程回收改为多线程回收,在多核CPU环境下,能充分利用多核资源,回收效率远高于Serial收集器,常与CMS收集器搭配使用,适配对响应速度有一定要求的应用。
  • Serial Old收集器(标记-整理算法):老年代专属的单线程收集器,是Serial收集器的老年代版本。其回收过程与Serial收集器一致,均为单线程执行,采用标记-整理算法,能避免内存碎片。由于单线程执行的局限性,它主要用于单核心CPU环境,或作为CMS收集器出现异常时的备用回收方案。
  • Parallel Old收集器(标记-整理算法):老年代并行收集器,是Parallel Scavenge收集器的老年代配套版本。其设计目标与Parallel Scavenge一致,依然以高吞吐量为核心,支持多线程并行回收,采用标记-整理算法,适合与Parallel Scavenge收集器搭配使用,构建"高吞吐量优先"的垃圾回收组合,适配大型后台应用。
  • CMS(Concurrent Mark Sweep)收集器(标记-清除算法) :老年代专属的并发垃圾收集器,其核心设计目标是获取最短的GC停顿时间,这也是它与其他老年代收集器的核心区别。CMS收集器采用标记-清除算法,核心优势是GC线程与用户线程可并发执行,大幅缩短用户线程的阻塞时间,具备高并发、低停顿的特点,适合Web应用、桌面应用等对交互响应速度要求极高的场景;缺点是会产生内存碎片,且并发回收过程中会占用一定的CPU资源,影响用户线程的执行效率。
  • G1(Garbage First)收集器(标记-整理算法):一款可回收整个Java堆(新生代+老年代)的并行垃圾收集器,于JDK 1.7引入,JDK 9起成为JVM默认的垃圾收集器。G1收集器基于标记-整理算法实现,从根源上解决了内存碎片问题;与前6种收集器最大的区别的是,它打破了"分代回收"的局限,将整个Java堆划分为多个大小相等的区域(Region),可灵活选择回收价值最高的区域,实现"垃圾优先"回收。其兼顾了吞吐量与停顿时间,适合内存规模较大(如4GB及以上)的大型应用,能在控制GC停顿时间的同时,保证一定的吞吐量。
相关推荐
用户094248568033 小时前
第9章:OpenJDK堆分代与 Serial/Parallel GC 基础
java·jvm
CC数分3 小时前
2026年HRBP岗位硬性要求和加分项
面试·职场和发展·数据分析
2601_962680223 小时前
数据分析面试常考的SQL题和业务题分别是哪几类?
sql·面试·数据分析
黄敬峰4 小时前
一文搞懂 Agentic RAG:用 LangGraph 打造会思考的智能检索架构
面试
晚安日记wanna4 小时前
SSR 为什么不适合登录态从水合冲突到缓存串号
前端·react.js·面试
晚安日记wanna4 小时前
压测 TPS 卡在 800CPU 只跑四成六步定位法
运维·面试·测试
晚安日记wanna5 小时前
批量请求失败只弹一个 Toast面试官想听五层
前端·面试·架构
晚安日记wanna5 小时前
TS const 类型参数一道面试题的四层追问
前端·面试·typescript
晚安日记wanna5 小时前
大表 DDL 面试翻车现场Online DDL 为什么还会锁死业务
数据库·面试·架构
晚安日记wanna5 小时前
MySQL 主从延迟别只答并行复制
数据库·面试·架构