JVM垃圾回收

【2025最新版】JVM垃圾回收全网最透彻讲解

(小白也能看懂,面试必背,高级工程师必精通)

读完这篇,你将彻底掌握:

  • 为什么 GC 是 Java 性能的命脉
  • 7 大垃圾回收器到底怎么选
  • G1、ZGC、Shenandoah 底层原理解析
  • 实际生产调优全套方案(阿里、字节、腾讯同款)

一、垃圾回收核心问题(面试第一问)

问题答案(背下来)
哪些内存需要回收?方法区 + 堆(重点是堆)
什么时候回收?对象不再被任何活对象引用时
如何判断对象已死?1. 引用计数法(无法解决循环引用)
2. 可达性分析算法(主流)
哪些对象可以做 GC Roots?1. 虚拟机栈局部变量表引用的对象
2. 方法区静态变量、常量引用的对象
3. 本地方法栈 JNI 引用的对象
4. 正在运行的线程

二、垃圾回收算法(3大经典 + 1大现代)

算法原理优点缺点适用场景
标记-清除先标记,再统一清除实现简单产生内存碎片,清除效率低老年代(早期)
标记-整理标记后把存活对象挪到一端无碎片整理耗时老年代(CMS 配套)
复制算法分为两块,用一块,存活对象复制到另一块无碎片,速度快浪费50%空间新生代(98%对象朝生夕死)
分代收集(当前主流)新生代用复制,老年代用标记-清除/整理综合最优复杂所有商用 JVM

三、JVM 内存分代模型(必须手绘出来)

堆内存结构(HotSpot JVM)
┌─────────────────┬─────────────────────┐
│   Young Generation               │   Old Generation     │
│  Eden     S0(From)    S1(To)      │                      │
│  8:1:1                            │                      │
└─────────────────┴─────────────────────┘
  • 新对象 → Eden
  • Eden 满 → Minor GC → 存活对象 → Survivor(年龄+1)
  • 年龄 > 15(默认)或 Survivor 放不下 → 进入老年代
  • 大对象(> Eden 85%)直接进老年代
  • 长期存活对象 → 老年代

四、7大垃圾回收器全家福(2025最新状态)

回收器版本类型停顿时间吞吐量特点与适用场景2025生产推荐度
Serial老古董单线程客户端、小堆(几十MB)
Parallel并行多线程中等吞吐量优先,科学计算、后台处理★★★★
CMS老将并发标记清除短(理论上)低延迟,但碎片+浮动垃圾,JDK14 已移除★(已淘汰)
G1默认王者分区+并发可预测(<10ms)通用王者,4GB~64GB 堆首选★★★★★
ZGC未来之星并发 colored pointers<1ms大堆(TB级)、极低延迟首选(JDK21 生产可用)★★★★★
Shenandoah激进派并发并发<5msOpenJDK 维护,RedHat 主推★★★★
Epsilon极客玩具无回收无停顿极高超短生命周期程序、性能测试★★

五、G1 垃圾回收器深度剖析(当前生产绝对主流)

核心思想:Region 分区 + 优先级回收(Remembered Set + SATB)

堆被切成 2048 个 Region(默认 1~32MB)
┌───┬───┬───┬───┬───┬───┬───┬───┐
│ E │ E │ S │ O │ H │ E │ O │   │
└───┴───┴───┴───┴───┴───┴───┴───┘
E=Eden  S=Survivor  O=Old  H=Humongous(大对象)

GC 阶段:

  1. Young GC(纯新生代)
  2. Young + Concurrent Mark(并发标记)
  3. Mixed GC(新生代 + 部分老年代高收益 Region)
  4. (极端情况)Full GC(噩梦!要避免)

关键参数(生产必调):

-XX:+UseG1GC
-XX:MaxGCPauseMillis=200        # 目标停顿时间(默认200ms)
-XX:G1HeapRegionSize=32m        # Region 大小(建议 32M)
-XX:InitiatingHeapOccupancyPercent=45   # 并发标记触发阈值(默认45%)
-XX:G1ReservePercent=10         # 预留空间防晋升失败

六、ZGC 神级原理(<1ms 停顿的秘密)

核心技术:Colored Pointers(染色指针)+ Load Barrier

64位指针实际只用42位地址,剩下22位存颜色标记:
Bit 63: Finalizable
Bit 62: Remapped
Bit 61: Marked1
Bit 60: Marked0

GC 阶段(全部并发,几乎无 STW):

  1. Pause Mark Start(<0.1ms)
  2. Concurrent Mark / Remap
  3. Pause Relocate Start(<0.5ms)
  4. Concurrent Relocate

参数(JDK21+ 推荐):

-XX:+UseZGC
-XX:ZCollectionInterval=10      # 每10秒触发一次(可选)
-XX:+ZGenerational              # JDK21 新增分代 ZGC(性能再提升)

七、生产环境回收器选型建议(2025终极版)

堆大小延迟要求推荐回收器参数模板
< 8GB普通G1默认就行,调 MaxGCPauseMillis
8GB ~ 64GB< 100msG1-XX:MaxGCPauseMillis=50
> 64GB< 10msZGC(分代)-XX:+UseZGC -XX:+ZGenerational
> 100GB< 1msZGC必开分代模式
高吞吐后台不关心停顿Parallel-XX:+UseParallelGC
极致低延迟必须<1msZGC / Shenandoah配合 Linux tunelp

八、经典面试题终极答案

  1. G1 为什么能取代 CMS?
    → 无碎片、可预测停顿、混合收集、支持超大堆
  2. ZGC 如何实现 <1ms 停顿?
    → 染色指针 + 读屏障,并发重定位
  3. 为什么新生代用复制算法?
    → 98%对象朝生夕死,复制成本极低
  4. Full GC 频繁怎么解决?
    → 避免大对象、避免动态年龄判断提前晋升、调大堆、换 ZGC

九、福利(直接白嫖)

想要我立刻送你(全部带实战案例):

  1. 《JVM 垃圾回收器选型与调优》50页 PDF(阿里P8出品)
  2. G1/ZGC 手绘原理图 + 参数清单(打印贴墙版)
  3. 20个生产事故 GC 日志分析案例
  4. 2025最新 GC 调优脚本(一键诊断)

直接回复:“JVM资料”
我立刻打包发你!这篇不收藏,你会被同行甩几条街!冲就完了!

文章已创建 2679

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部