)
文章目录 专栏介绍 阅读前置与适配人群 本文独家核心收获一、前言为什么GC算法是JVM调优的基石二、GC核心基础认知什么是垃圾如何判定垃圾2.1 GC核心作用2.2 垃圾对象判定核心算法面试必背1、引用计数法已淘汰2、可达性分析算法JVM主流方案三、三大经典GC垃圾回收算法原理流程优缺点3.1 标记清除算法Mark-Sweep3.1.1 核心执行流程3.1.2 核心优点3.1.3 致命缺点核心考点3.1.4 适用场景3.2 复制算法Copying3.2.1 核心执行流程3.2.2 核心优点3.2.3 核心缺点3.2.4 适用场景3.3 标记整理算法Mark-Compact3.3.1 核心执行流程3.3.2 核心优点3.3.3 核心缺点3.3.4 适用场景四、三大GC算法全方位对比面试核心表格五、JVM分代回收核心设计思想生产核心5.1 新生代 GCMinor GC5.2 老年代 GCMajor GC/Full GC六、面试高频误区深度纠错大厂加分项误区1复制算法内存利用率低所以不如另外两种算法误区2标记整理算法无碎片为什么不全程使用误区3标记清除算法有碎片为什么老年代还要使用七、全文深度总结 专栏介绍《JDK进阶实战》原创专栏专注JDK底层原理、JVM核心机制、源码深度解析、生产调优实战、大厂面试重难点。摒弃网络同质化水文内容所有文章均采用「原理溯源底层逻辑优劣对比场景落地误区纠错面试总结」闭环写法帮助开发者彻底摆脱死记硬背真正吃透Java底层核心适配进阶提升、项目调优、大厂面试冲刺。 阅读前置与适配人群前置基础掌握JVM内存区域划分堆、栈、方法区、对象创建与生命周期、GC核心作用适配人群Java后端开发者、JVM调优学习者、面试进阶人群、性能优化工程师、架构师环境兼容适配JDK8、JDK11、JDK17、JDK21全主流版本经典GC核心算法原理通用无版本差异。 本文独家核心收获通透理解GC核心本质搞懂JVM为什么需要垃圾回收、回收目标、判定垃圾对象的底层逻辑吃透三大经典GC算法逐一对标标记清除、复制、标记整理算法掌握执行流程、核心机制精准区分算法优劣深度对比内存碎片、执行效率、成本开销、适用内存区域核心差异掌握生产落地场景明确新生代、老年代分别适配的GC算法理解分代回收底层设计思想破除面试高频误区解决算法混淆、场景乱用、优缺点记混等通病适配大厂高频面试提问。一、前言为什么GC算法是JVM调优的基石Java相较于C/C最大的核心优势就是自动内存管理与垃圾回收机制GC。开发者无需手动申请和释放内存由JVM自动识别垃圾对象、回收空闲内存极大避免了人工内存泄漏、野指针等底层问题。但自动GC不代表「无需关注GC」线上项目的OOM内存溢出、接口卡顿、STW停顿、系统吞吐量下降等绝大多数性能问题根源均来自GC回收效率不佳、算法适配错误、内存区域与回收策略不匹配。目前绝大多数开发者只会背诵「三种GC算法名称」存在大量知识盲区不清楚GC算法的完整执行流程只知其名不知其原理无法区分三种算法的核心痛点与适用场景不理解为什么新生代用复制算法、老年代用标记清除/标记整理混淆内存碎片、STW时长、空间利用率、执行效率的对应关系。本文将从GC基础认知→垃圾判定规则→三大算法逐行拆解→优劣深度对比→分代回收适配逻辑→面试误区总结全链路闭环讲解彻底吃透JVM经典GC回收算法为后续学习G1、ZGC、Shenandoah高级收集器与线上调优打下核心基础。二、GC核心基础认知什么是垃圾如何判定垃圾2.1 GC核心作用JVM垃圾回收Garbage Collection核心目标是自动识别堆内存中无效、不再被引用的对象释放其占用的堆内存避免内存溢出提升内存利用率与系统稳定性。GC回收的核心区域Java堆新生代老年代虚拟机栈、本地方法栈、程序计数器为线程私有随线程创建销毁无需GC回收。2.2 垃圾对象判定核心算法面试必背1、引用计数法已淘汰核心逻辑为每个对象维护一个引用计数器新增引用1引用失效-1计数器为0则判定为垃圾。致命缺陷无法解决对象循环引用问题会导致内存泄漏因此JVM未采用该方案。2、可达性分析算法JVM主流方案JDK主流垃圾判定算法核心逻辑以GC Roots为起始节点向下遍历引用链能遍历到的对象为存活对象无法遍历到的对象判定为垃圾对象。常见GC Roots对象虚拟机栈中引用的对象、静态变量引用对象、常量池引用对象、本地方法栈JNI引用对象。三、三大经典GC垃圾回收算法原理流程优缺点基于可达性分析筛选出垃圾对象后JVM通过三种经典算法完成内存回收分别是标记清除算法、复制算法、标记整理算法。三种算法各有优劣没有绝对最优解只有最合适的场景。3.1 标记清除算法Mark-Sweep3.1.1 核心执行流程整体分为标记、清除两个核心阶段全程需要STWStop-The-World暂停用户线程标记阶段JVM从GC Roots遍历所有引用链标记堆中所有存活对象清除阶段遍历整个堆内存将未被标记的垃圾对象直接回收释放对应内存空间。3.1.2 核心优点实现简单、逻辑直观无需移动对象、无需复制内存数据空间利用率高不会预留空闲内存空间适合大内存对象回收。3.1.3 致命缺点核心考点产生大量内存碎片垃圾回收后存活对象分散、空闲内存碎片化无法分配大对象容易提前触发GC两次遍历效率低需要两次全堆遍历标记清除堆内存越大GC耗时越长STW停顿时间久吞吐量较差频繁GC会影响系统接口响应速度与整体性能。3.1.4 适用场景仅适用于老年代默认基础回收策略、存活对象多、垃圾对象少、大对象居多的内存区域不适合高频回收的新生代。3.2 复制算法Copying3.2.1 核心执行流程将内存区域平均划分为两块对等空间分为使用区From、空闲区To流程极简高效程序始终只使用From区域To区域长期空闲备用GC触发时标记From区域所有存活对象将所有存活对象完整复制到To区域内存紧凑排列、无空隙清空From区域全部内存互换From、To区域身份完成回收。3.2.2 核心优点无内存碎片存活对象紧凑排列内存空间连续彻底解决碎片问题回收效率极高只需复制存活对象无需遍历全部垃圾适合垃圾多、存活少的场景GC速度快、STW时间短系统吞吐量高。3.2.3 核心缺点内存空间严重浪费必须预留50%空闲内存内存利用率仅有50%大对象复制成本高大体积对象复制耗时久会严重降低GC效率存活对象多时效率暴跌存活对象越多复制开销越大。3.2.4 适用场景新生代专属算法新生代对象特点对象存活时间短、存活率极低、垃圾量大、小对象居多完美适配复制算法高效、快速回收的特性。3.3 标记整理算法Mark-Compact3.3.1 核心执行流程结合标记清除与复制算法的优势分为标记、整理两个阶段标记阶段同标记清除算法从GC Roots标记所有存活对象整理阶段不直接清除垃圾而是将所有存活对象向内存一端整体平移、紧凑排列整理完成后边界外的全部空间统一清空一次性回收所有垃圾。3.3.2 核心优点无内存碎片存活对象紧凑排列内存连续彻底解决碎片问题内存利用率100%无需预留空闲内存无空间浪费适合大对象、高存活场景是老年代最优适配算法之一。3.3.3 核心缺点执行成本极高需要移动大量存活对象、修改对象引用地址CPU开销大STW停顿时间最长整理阶段耗时远高于另外两种算法频繁GC会严重影响系统性能。3.3.4 适用场景老年代专属优化算法老年代对象特点存活时间长、存活率高、大对象多、GC频率低牺牲单次GC速度换取内存完整性与高利用率。四、三大GC算法全方位对比面试核心表格回收算法核心优势核心缺陷内存碎片内存利用率执行效率适用区域标记清除无需移动对象、实现简单产生大量内存碎片、全堆遍历耗时久多高中等老年代基础策略复制算法无碎片、回收速度快、STW短浪费50%内存、大对象成本高无低极高新生代标记整理无碎片、内存无浪费、适配大对象对象移动成本高、STW时间最长无极高低老年代五、JVM分代回收核心设计思想生产核心JVM没有采用单一GC算法而是基于对象分代特性组合使用三种算法最大化平衡「回收效率、内存利用率、系统吞吐量」这也是分代回收的核心精髓。5.1 新生代 GCMinor GC新生代对象朝生夕死、存活率极低、小对象居多、GC频率高因此采用复制算法。牺牲50%内存空间换取极致的GC速度与无碎片内存保证高频快速回收。5.2 老年代 GCMajor GC/Full GC老年代对象存活时间长、存活率高、大对象多、GC频率极低基础回收采用标记清除算法速度适中内存碎片过多、空间不足时触发标记整理算法整理内存消除碎片。核心总结新生代追求速度老年代追求空间利用率分代适配、取长补短。六、面试高频误区深度纠错大厂加分项误区1复制算法内存利用率低所以不如另外两种算法**错误**算法没有优劣只有场景适配与否。新生代高频GC、低存活率场景下复制算法的回收速度、无碎片优势完全可以覆盖内存浪费的短板是最优解。误区2标记整理算法无碎片为什么不全程使用**错误**标记整理需要移动大量对象、修改引用STW停顿时间最长频繁使用会严重拖垮系统吞吐量只适合低频GC的老年代场景。误区3标记清除算法有碎片为什么老年代还要使用老年代存活率高、移动对象成本极高优先使用标记清除保证GC速度碎片累积到一定阈值再触发标记整理平衡效率与空间是工程最优折中方案。七、全文深度总结本文完整拆解了GC垃圾判定机制 三大经典回收算法 优劣对比 分代适配逻辑 面试误区纠错彻底打通JVM垃圾回收底层基础掌握GC Roots可达性分析原理理解JVM垃圾对象判定标准吃透标记清除、复制、标记整理三大算法完整执行流程与核心利弊透彻理解「新生代复制、老年代标记清除标记整理」的分代设计思想纠正全网高频认知误区形成生产级、面试级的完整知识体系。三大GC经典算法是所有高级垃圾收集器G1、ZGC、CMS、Shenandoah的底层基石只有吃透基础算法原理才能真正理解JVM调优逻辑、解决线上GC卡顿、OOM等疑难问题。