JVM垃圾回收与调优核心面试笔记引用计数/GC算法/CMS/G1/参数调优文章标签#jvm #gc #面试 #java #后端前言本文为JVM垃圾回收核心复习笔记覆盖对象存活判定、三大GC算法、CMS执行流程、G1分区机制、JVM参数调优全链路考点适配面试突击与实战复盘逻辑对标HashMap笔记风格便于快速记忆与背诵。一、对象存活判定算法引用计数 可达性分析GC第一步判断对象是否“死亡”主流两种算法HotSpot仅用后者。1.1 引用计数法Reference Counting原理为每个对象维护引用计数器有引用1引用失效-1计数器0则可回收。优点实现简单、判断高效、可立即回收。致命缺陷无法解决循环引用导致内存泄漏。// 循环引用示例引用计数无法回收publicclassCircularRef{Objectinstance;publicstaticvoidmain(String[]args){CircularRefanewCircularRef();CircularRefbnewCircularRef();a.instanceb;b.instancea;anull;bnull;// 无外部引用但计数均为1}}结论HotSpot未采用仅作历史了解。1.2 可达性分析算法主流核心思想以GC Roots为起点递归遍历引用链不可达对象垃圾。GC Roots固定范围必背虚拟机栈局部变量表引用的对象方法区静态属性引用的对象方法区常量引用的对象本地方法栈JNI引用的对象活跃线程对象流程STW暂停→从GC Roots遍历→标记可达对象→回收不可达对象。优势解决循环引用、精准判定、适配JVM运行模型。二、三大基础GC算法复制 / 标记清除 / 标记整理2.1 复制算法Copying核心内存分等大两块每次只用一块满时将存活对象复制到另一块清空原块。优点无碎片、复制高效、适合存活对象少的场景。缺点内存利用率仅50%存活对象多则效率暴跌。适用新生代EdenSurvivor8:1:1Minor GC默认用此算法。2.2 标记-清除算法Mark-Sweep流程先标记所有存活对象→统一清除未标记垃圾。优点无需移动对象、实现简单。缺点内存碎片严重、效率随垃圾数量波动。适用老年代早期方案CMS底层算法。2.3 标记-整理算法Mark-Compact流程标记存活→将存活对象向一端压缩→清除端外内存。优点无碎片、内存规整。缺点需移动对象、全程STW、效率偏低。适用老年代Parallel Old、Serial Old。三大算法对比表算法效率内存碎片移动对象适用代复制高无是新生代标记-清除中严重否老年代(CMS)标记-整理低无是老年代三、CMS 执行流程与优缺点CMSConcurrent Mark Sweep低延迟老年代收集器以最短STW为目标面试高频。3.1 核心流程4阶段2次STW初始标记Initial MarkSTW仅标记GC Roots直接关联对象速度极快。并发标记Concurrent Mark并发与业务线程并行遍历全引用链标记存活对象耗时最长但无停顿。重新标记RemarkSTW修正并发标记期间引用变动导致的漏标停顿短于Full GC。并发清除Concurrent Sweep并发异步回收垃圾不移动对象业务线程可继续运行。3.2 优点大部分阶段并发停顿极低适配响应敏感型服务。不移动对象降低STW开销。3.3 缺点必背CPU敏感并发阶段抢占算力核心数4时吞吐量暴跌。浮动垃圾并发清除时新产生垃圾无法当次回收需预留内存。内存碎片基于标记-清除碎片多易触发Full GC。并发失败内存不足退化为Serial Old停顿剧增。四、G1 核心思想与分区机制G1Garbage-First服务端大堆首选平衡停顿可控高回收效率JDK9默认收集器。4.1 核心思想化整为零堆拆分为独立Region按需回收不扫描全堆。垃圾优先优先回收垃圾最多、收益最大的Region故名G1。停顿可预测通过-XX:MaxGCPauseMillis指定目标动态调整回收量。4.2 分区机制Region堆划分约2048个等大Region大小1MB~32MB2的幂。动态角色每个Region可充当Eden/Survivor/Old/Humongous巨型对象逻辑分代、物理不连续。Humongous Region存储1.5个Region的大对象避免大对象分配失败。Remembered Set记录跨Region引用避免全局扫描加速回收。4.3 G1回收模式Young GC回收新生代Region复制算法STW可控。Mixed GC回收新生代高收益老年代Region不回收全老年代。Full GC并发失败触发单线程收集需避免。五、JVM 常用参数调优生产实战版按内存、GC、监控、最佳实践分类直接复制可用。5.1 堆内存核心参数-Xms8g -Xmx8g # 初始堆最大堆禁止扩容震荡 -Xmn3g # 新生代大小推荐堆1/3~1/2 -XX:SurvivorRatio8 # Eden:S0:S18:1:1 -XX:MetaspaceSize256m -XX:MaxMetaspaceSize512m # 元空间 -Xss1m # 线程栈默认1MB5.2 GC收集器参数-XX:UseG1GC # 生产首选G1 -XX:MaxGCPauseMillis200 # G1停顿目标ms -XX:UseConcMarkSweepGC # CMS启用老项目 -XX:CMSScavengeBeforeRemark # CMS重新标记前先Young GC缩短STW -XX:ParallelGCThreads8 # GC线程数≈CPU核心数5.3 监控与故障定位-XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath/dump/ # OOM自动dump -XX:PrintGC -XX:PrintGCDetails -XX:PrintGCTimeStamps # GC日志 -Xlog:gc*:filegc.log # JDK9日志 -XX:DisableExplicitGC # 禁用System.gc()5.4 调优最佳实践XmsXmx避免堆动态扩容。新生代不宜过小防止频繁Minor GC与过早晋升。G1优先于CMS大堆8G必用G1。开启OOM dump定位泄漏必备。禁用System.gc()避免突发Full GC。总结面试速背版对象存活引用计数循环引用BUG、可达性分析HotSpot标准。GC算法复制新生代、标记清除CMS、标记整理老年代。CMS4阶段2次STW低延迟但有碎片、浮动垃圾、CPU敏感。G1Region分区、垃圾优先、停顿可控生产首选。调优固定堆、合理新生代、选对收集器、开启监控。需要我把本文整理成一页A4面试背诵清单纯要点口诀吗
JVM垃圾回收与调优核心面试笔记(引用计数/GC算法/CMS/G1/参数调优)
JVM垃圾回收与调优核心面试笔记引用计数/GC算法/CMS/G1/参数调优文章标签#jvm #gc #面试 #java #后端前言本文为JVM垃圾回收核心复习笔记覆盖对象存活判定、三大GC算法、CMS执行流程、G1分区机制、JVM参数调优全链路考点适配面试突击与实战复盘逻辑对标HashMap笔记风格便于快速记忆与背诵。一、对象存活判定算法引用计数 可达性分析GC第一步判断对象是否“死亡”主流两种算法HotSpot仅用后者。1.1 引用计数法Reference Counting原理为每个对象维护引用计数器有引用1引用失效-1计数器0则可回收。优点实现简单、判断高效、可立即回收。致命缺陷无法解决循环引用导致内存泄漏。// 循环引用示例引用计数无法回收publicclassCircularRef{Objectinstance;publicstaticvoidmain(String[]args){CircularRefanewCircularRef();CircularRefbnewCircularRef();a.instanceb;b.instancea;anull;bnull;// 无外部引用但计数均为1}}结论HotSpot未采用仅作历史了解。1.2 可达性分析算法主流核心思想以GC Roots为起点递归遍历引用链不可达对象垃圾。GC Roots固定范围必背虚拟机栈局部变量表引用的对象方法区静态属性引用的对象方法区常量引用的对象本地方法栈JNI引用的对象活跃线程对象流程STW暂停→从GC Roots遍历→标记可达对象→回收不可达对象。优势解决循环引用、精准判定、适配JVM运行模型。二、三大基础GC算法复制 / 标记清除 / 标记整理2.1 复制算法Copying核心内存分等大两块每次只用一块满时将存活对象复制到另一块清空原块。优点无碎片、复制高效、适合存活对象少的场景。缺点内存利用率仅50%存活对象多则效率暴跌。适用新生代EdenSurvivor8:1:1Minor GC默认用此算法。2.2 标记-清除算法Mark-Sweep流程先标记所有存活对象→统一清除未标记垃圾。优点无需移动对象、实现简单。缺点内存碎片严重、效率随垃圾数量波动。适用老年代早期方案CMS底层算法。2.3 标记-整理算法Mark-Compact流程标记存活→将存活对象向一端压缩→清除端外内存。优点无碎片、内存规整。缺点需移动对象、全程STW、效率偏低。适用老年代Parallel Old、Serial Old。三大算法对比表算法效率内存碎片移动对象适用代复制高无是新生代标记-清除中严重否老年代(CMS)标记-整理低无是老年代三、CMS 执行流程与优缺点CMSConcurrent Mark Sweep低延迟老年代收集器以最短STW为目标面试高频。3.1 核心流程4阶段2次STW初始标记Initial MarkSTW仅标记GC Roots直接关联对象速度极快。并发标记Concurrent Mark并发与业务线程并行遍历全引用链标记存活对象耗时最长但无停顿。重新标记RemarkSTW修正并发标记期间引用变动导致的漏标停顿短于Full GC。并发清除Concurrent Sweep并发异步回收垃圾不移动对象业务线程可继续运行。3.2 优点大部分阶段并发停顿极低适配响应敏感型服务。不移动对象降低STW开销。3.3 缺点必背CPU敏感并发阶段抢占算力核心数4时吞吐量暴跌。浮动垃圾并发清除时新产生垃圾无法当次回收需预留内存。内存碎片基于标记-清除碎片多易触发Full GC。并发失败内存不足退化为Serial Old停顿剧增。四、G1 核心思想与分区机制G1Garbage-First服务端大堆首选平衡停顿可控高回收效率JDK9默认收集器。4.1 核心思想化整为零堆拆分为独立Region按需回收不扫描全堆。垃圾优先优先回收垃圾最多、收益最大的Region故名G1。停顿可预测通过-XX:MaxGCPauseMillis指定目标动态调整回收量。4.2 分区机制Region堆划分约2048个等大Region大小1MB~32MB2的幂。动态角色每个Region可充当Eden/Survivor/Old/Humongous巨型对象逻辑分代、物理不连续。Humongous Region存储1.5个Region的大对象避免大对象分配失败。Remembered Set记录跨Region引用避免全局扫描加速回收。4.3 G1回收模式Young GC回收新生代Region复制算法STW可控。Mixed GC回收新生代高收益老年代Region不回收全老年代。Full GC并发失败触发单线程收集需避免。五、JVM 常用参数调优生产实战版按内存、GC、监控、最佳实践分类直接复制可用。5.1 堆内存核心参数-Xms8g -Xmx8g # 初始堆最大堆禁止扩容震荡 -Xmn3g # 新生代大小推荐堆1/3~1/2 -XX:SurvivorRatio8 # Eden:S0:S18:1:1 -XX:MetaspaceSize256m -XX:MaxMetaspaceSize512m # 元空间 -Xss1m # 线程栈默认1MB5.2 GC收集器参数-XX:UseG1GC # 生产首选G1 -XX:MaxGCPauseMillis200 # G1停顿目标ms -XX:UseConcMarkSweepGC # CMS启用老项目 -XX:CMSScavengeBeforeRemark # CMS重新标记前先Young GC缩短STW -XX:ParallelGCThreads8 # GC线程数≈CPU核心数5.3 监控与故障定位-XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath/dump/ # OOM自动dump -XX:PrintGC -XX:PrintGCDetails -XX:PrintGCTimeStamps # GC日志 -Xlog:gc*:filegc.log # JDK9日志 -XX:DisableExplicitGC # 禁用System.gc()5.4 调优最佳实践XmsXmx避免堆动态扩容。新生代不宜过小防止频繁Minor GC与过早晋升。G1优先于CMS大堆8G必用G1。开启OOM dump定位泄漏必备。禁用System.gc()避免突发Full GC。总结面试速背版对象存活引用计数循环引用BUG、可达性分析HotSpot标准。GC算法复制新生代、标记清除CMS、标记整理老年代。CMS4阶段2次STW低延迟但有碎片、浮动垃圾、CPU敏感。G1Region分区、垃圾优先、停顿可控生产首选。调优固定堆、合理新生代、选对收集器、开启监控。需要我把本文整理成一页A4面试背诵清单纯要点口诀吗