
一、前言垃圾回收GC是 Java 区别于 C/C 的核心特性之一它让 JVM 自动管理内存释放无用对象大大降低了内存泄漏与野指针的风险。二、什么是垃圾回收简单一句话JVM 自动识别堆中 “死亡” 的对象并释放其占用内存的过程。两个核心问题怎么判断对象已死怎么回收垃圾1. 判断对象是否死亡面试必背引用计数法简单但无法解决循环引用Java 不用。可达性分析算法Java 采用。以GC Root为起点能搜索到的对象存活搜索不到就是垃圾。GC Root 包括虚拟机栈中局部变量 / 方法参数类静态属性引用本地方法栈JNI引用活动线程对象三、垃圾回收的三种基础算法1. 标记 - 清除先标记再清除缺点产生大量内存碎片2. 标记 - 复制将内存分两半存活对象复制到另一半清空原区域优点无内存碎片缺点浪费空间3. 标记 - 整理标记后让存活对象向一端移动清理端外内存优点无碎片适合老年代四、常见垃圾回收器简介1. Serial / Serial Old单线程回收简单高效适合客户端。2. ParNew多线程版本 Serial多用于新生代配合 CMS 使用。3. Parallel Scanvenge / Parallel Old注重吞吐量适合后台计算型应用。4. CMSConcurrent Mark Sweep并发低延迟回收器以缩短停顿时间为目标。缺点内存碎片严重、浮动垃圾。5. G1Garbage-FirstJDK 9 默认回收器面试绝对重点面向服务端低延迟、可控停顿无内存碎片基于 Region 内存布局五、重点G1 垃圾回收器 超详细讲解面试必背1. G1 设计思想G1 不再将堆分为连续的新生代、老年代而是将堆划分为许多大小相同的 Region。每个 Region 可以是Eden、Survivor、Old、Humongous存超大对象。G1 的核心目标在指定的停顿时间内回收价值最大的垃圾。2. G1 最重要完整回收四阶段① 初始标记Initial MarkSTWStop The World只标记GC Roots 直接关联的对象速度极快② 并发标记Concurrent Mark与用户线程并发执行对整个堆进行可达性分析标记所有存活对象耗时较长但不影响业务运行③ 最终标记Final MarkSTW修正并发标记阶段因程序运行产生的变动速度快④ 筛选回收Evacuation—— G1 最核心STW对所有 Region按回收价值和成本排序根据用户设置的最大停顿时间MaxGCPauseMillis选择要回收的 Region使用复制算法将存活对象复制到空 Region清空原 Region无内存碎片3. G1 全过程一句话总结G1 回收分为四步初始标记STW→ 并发标记 → 最终标记STW→ 筛选回收STW。通过可控停顿、优先回收高价值 Region实现低延迟、无碎片、高稳定。4. G1 核心特点面试必问基于 Region 分代内存不连续可预测停顿时间由-XX:MaxGCPauseMillis控制优先回收垃圾最多的区域Garbage-First复制算法无内存碎片筛选回收阶段 STW但只回收部分 Region速度极快支持大对象直接存入 Humongous Region六、G1 vs CMS高频对比CMS标记 - 清除有碎片停顿不可控G1标记 - 复制无碎片停顿可精准控制G1 整体更稳定是现代服务端首选七、总结Java 垃圾回收是 JVM 自动管理内存的核心机制通过可达性分析判断对象是否死亡使用标记 - 清除、标记 - 复制、标记 - 整理三种基础算法。常见回收器中G1 是目前最主流、面试最重要的回收器。G1 基于 Region 内存布局追求可控停顿、最大回收价值回收过程分为初始标记、并发标记、最终标记、筛选回收四步。它无内存碎片、停顿可预测是生产环境与面试中的绝对核心。