《Java 100 天进阶之路》第67篇:JVM面试压轴题(2026版) 📅 2026/7/31 5:25:03 第67篇JVM面试压轴题2026版系列导航《Java 100 天进阶之路》完整目录 |⬅️ 上一篇第66篇JIT编译与性能优化 |➡️ 下一篇第68篇JavaWeb核心技术之Servlet待发布️ 本文阅读地图3 分钟速览第61~66篇完成了JVM调优专题的全部学习本篇是JVM专题收官之作。精选 35 道大厂高频面试题覆盖 7 大模块每题配标准话术 加分回答模块核心考点面试权重内存区域五大运行时区、堆与栈区别、元空间 vs 永久代⭐⭐⭐⭐⭐垃圾回收GC算法、回收器选型、G1 vs ZGC⭐⭐⭐⭐⭐GC调优调优流程、参数配置、日志分析⭐⭐⭐⭐类加载器双亲委派、打破双亲委派、热部署⭐⭐⭐⭐JIT编译分层编译、逃逸分析、方法内联⭐⭐⭐OOM排查泄漏类型、排查工具、MAT分析⭐⭐⭐⭐调优实战参数配置、容器化JVM、生产问题⭐⭐⭐⭐一、JVM内存模型篇8题Q1JVM运行时数据区包含哪些区域JDK 8之后有什么变化答案五大区域——程序计数器、虚拟机栈、本地方法栈、堆、方法区。JDK 8核心变化方法区实现从永久代PermGen改为元空间Metaspace元空间使用本地内存而非JVM堆内存默认无上限受物理内存限制永久代受-XX:MaxPermSize限制。Q2堆和栈的区别答案堆Heap——所有线程共享存储对象实例和数组GC管理线程共享OutOfMemoryError。栈Stack——每个线程私有存储局部变量、方法参数、对象引用自动分配释放线程私有StackOverflowError。Q3对象在堆内存中的分配流程答案新对象优先分配在Eden区Eden区满时触发Minor GC存活对象复制到Survivor区S0/S1每经历一次GC且存活年龄1年龄达到15默认晋升到老年代大对象超过PretenureSizeThreshold直接进入老年代。加分可通过-XX:MaxTenuringThreshold调整晋升年龄阈值。Q4String s new String(“abc”) 创建了几个对象答案2个。abc字面量在字符串常量池元空间中创建1个对象new String()在堆中创建1个对象。s引用存在虚拟机栈的局部变量表中。如果池中已有abc则只创建1个堆对象。Q5元空间和永久代的区别答案元空间Metaspace使用本地内存默认无上限受物理内存限制JDK 8使用。永久代PermGen在JVM堆内存中受-XX:MaxPermSize限制JDK 7及之前使用。JDK 8移除永久代引入元空间字符串常量池从永久代移至堆避免永久代OOM。加分元空间默认无上限可能导致本地内存耗尽生产建议配置-XX:MaxMetaspaceSize。Q6程序计数器PC Register的作用为什么不会OOM答案程序计数器记录当前线程执行的字节码指令地址或行号是JVM中唯一不会抛出OutOfMemoryError的内存区域。每个线程独立拥有内存极小且固定。Q7栈帧中包含哪些内容答案栈帧包含四个部分——局部变量表方法参数和局部变量、操作数栈执行运算时的临时数据、动态链接将符号引用转为直接引用支持多态、方法返回地址方法执行完后的返回位置。Q8什么情况下会抛出StackOverflowError什么情况下会抛出OutOfMemoryError答案StackOverflowError——递归调用过深、方法调用层级超出栈容量-Xss可调栈大小。OutOfMemoryError: Java heap space——堆内存耗尽-Xmx过小或内存泄漏。OutOfMemoryError: Metaspace——元空间耗尽类加载过多或类加载器泄漏。OutOfMemoryError: unable to create new native thread——无法创建新线程线程数超系统限制。二、垃圾回收GC篇8题Q9对象如何判定为“垃圾”答案可达性分析算法——从GC Roots根对象出发向下搜索搜索路径称为引用链。不在引用链上的对象被判定为不可达可被回收。GC Roots包括虚拟机栈栈帧中的局部变量引用的对象、方法区中静态属性引用的对象、方法区中常量引用的对象、本地方法栈中JNI引用的对象。加分可达性分析需在安全点Safepoint执行所有线程暂停STW。Q10四种垃圾回收算法的特点算法原理优缺点适用区域复制算法分成两块存活对象复制到另一块无碎片高效内存利用率50%年轻代标记-清除标记存活对象清除未标记无需移动对象有碎片老年代CMS标记-整理标记存活对象整理到一端无碎片移动开销大老年代分代收集不同区域使用不同算法综合优势年轻代老年代Q11Minor GC、Major GC、Full GC的区别答案Minor GC——年轻代GCEden区满时触发STW短暂通常10ms。Major GC——老年代GCCMS或G1的Mixed GCSTW稍长。Full GC——整个堆元空间的GCSTW最长应尽量避免。Full GC频繁通常意味着内存泄漏或堆不足。Q12垃圾回收器有哪些各版本默认是什么答案六款主要回收器——Serial单线程Client模式、Parallel多线程并行JDK 8默认、CMS并发JDK 14已移除、G1分区化JDK 9默认、ZGC着色指针读屏障亚毫秒级、Shenandoah并发整理。JDK 8默认Parallel GCJDK 9默认G1 GC。加分ZGC在JDK 21引入分代ZGCCPU开销降低内存占用更小。Q13G1 GC的核心设计思想答案G1将堆划分为多个大小相等的Region默认2048个每个Region可扮演Eden、Survivor、Old或Humongous角色。通过Garbage-First策略优先回收垃圾最多的Region基于历史数据建立停顿预测模型确保GC停顿时间不超过-XX:MaxGCPauseMillis设定值。Q14CMS为什么被淘汰答案CMS的缺陷——①内存碎片标记-清除算法不压缩碎片严重②CPU敏感并发阶段占用CPU资源③并发模式失败老年代空间不足时降级为Serial Old④浮动垃圾并发清理时新产生的垃圾需下次处理。JDK 9废弃JDK 14彻底移除。Q15ZGC为什么能实现亚毫秒级停顿答案ZGC利用着色指针在64位指针的高位存储对象元数据配合读屏障将大部分GC操作并发化。对象转移时通过读屏障拦截访问实现零停顿的并发转移。ZGC停顿时间1ms且不随堆大小增长。Q16强引用、软引用、弱引用、虚引用的区别答案强引用——new Object()永不回收除非不可达。软引用——SoftReference内存不足时回收适合缓存。弱引用——WeakReferenceGC时立即回收适合WeakHashMap、ThreadLocal。虚引用——PhantomReference无法通过它获取对象仅用于对象回收跟踪如Cleaner。三、GC调优篇5题Q17GC调优的标准流程是什么答案四步闭环——①监控发现用jstat、VisualVM发现GC异常②分析根因分析GC日志用MAT定位内存泄漏③参数调整每次只改1-2个参数④验证效果观察GC指标变化稳定后固化配置。Q18G1 GC的核心调优参数有哪些答案-XX:MaxGCPauseMillis——目标停顿时间最核心默认200ms调低→GC更频繁但单次更短。-XX:G1HeapRegionSize——Region大小1-32MB大对象多可调大。-XX:InitiatingHeapOccupancyPercent——触发Mixed GC的堆占用阈值默认45%。-XX:G1ReservePercent——预留内存默认10%防止晋升失败触发FullGC。Q19频繁FullGC的常见原因答案①内存泄漏静态集合、ThreadLocal未remove②大对象直接进老年代PretenureSizeThreshold过小③老年代空间不足-Xmx过小④元空间不足类加载过多⑤显式调用System.gc()-XX:DisableExplicitGC禁用。Q20吞吐量和延迟如何权衡答案吞吐量用户代码时间/(用户代码GC时间)延迟GC停顿时间。追求高吞吐→用Parallel GC适合批处理追求低延迟→用G1/ZGC适合Web/支付。两者不可兼得。Q21容器环境JVM参数有什么特殊要求答案使用-XX:InitialRAMPercentage和-XX:MaxRAMPercentage替代固定-Xmx让JVM感知容器内存限制。JDK 10默认开启UseContainerSupport。推荐配置-XX:InitialRAMPercentage50.0 -XX:MaxRAMPercentage80.0。四、类加载器篇5题Q22双亲委派模型是什么答案类加载器收到加载请求先委派给父加载器父加载器无法加载时自己才尝试加载。三层加载器——Bootstrap根加载器C实现Java中为null、Extension/Platform扩展加载器JDK 9改名Platform、Application应用加载器加载classpath。父加载器优先。Q23为什么要设计双亲委派模型答案①安全避免核心类库被篡改自定义java.lang.String不会被加载②避免重复加载确保类的唯一性③隔离性不同类加载器加载的同名类被视为不同类型。Q24如何打破双亲委派模型答案重写loadClass()方法不先调用父加载器。典型场景——Tomcat的WebappClassLoader优先自己加载WEB-INF/classes和WEB-INF/lib的类实现Web应用隔离。JDBC驱动加载Thread.currentThread().setContextClassLoader()也打破了双亲委派。Q25两个类加载器加载的同一个类能互相转换吗答案不能。即使类名相同不同类加载器加载的类在JVM中视为不同的类型强转抛ClassCastException。JVM中类唯一标识是“类加载器全限定名”。Q26热部署的原理是什么答案用新的类加载器重新加载目标类替换旧的引用。旧类加载器在没有引用后会被GC回收实现不停机更新。关键点①确保旧实例没有任何引用链可达②新旧类不混用③通过接口调用避免类型转换冲突。五、JIT编译篇3题Q27什么是JIT编译器答案JITJust-In-Time在运行时将热点字节码编译为本地机器码并缓存后续直接执行机器码。启动时解释执行保启动速度运行中JIT持续优化热点代码。Java因此**“越跑越快”** 。Q28分层编译的5个层级是什么答案0层解释执行1层C1无profile编译2层C1有限profile编译3层C1全量profile编译采集运行时数据4层C2极致优化编译。代码从0层开始热度上升后逐级晋升到4层。Q29逃逸分析能带来哪些优化答案逃逸分析判断对象是否逃逸出方法或线程。基于分析结果可实现①栈上分配不逃逸对象在栈上减轻GC②标量替换对象拆散为基本类型变量③锁消除单线程锁直接移除。六、OOM与工具篇4题Q30OOM有哪几种常见类型答案①Java heap space——堆内存溢出最常见内存泄漏或-Xmx过小②Metaspace——元空间溢出类加载过多、类加载器泄漏③Direct buffer memory——直接内存溢出NIO/Netty使用④GC overhead limit exceeded——GC回收98%内存却腾不出空间基本等于内存泄漏⑤unable to create new native thread——线程数超系统限制。Q31生产环境OOM排查的标准流程答案①看日志确认OOM类型②jstat监控GC状态③jmap dump生成堆快照或配置-XX:HeapDumpOnOutOfMemoryError自动dump④MAT深度分析堆快照定位泄漏根源⑤修复代码并验证。Q32常用的OOM排查工具答案jstat实时GC监控、jmap生成堆快照会STW、MAT深度泄漏分析最专业、VisualVM可视化监控、Arthas生产在线诊断阿里开源。生产必须开启-XX:HeapDumpOnOutOfMemoryError自动dump。Q33如何防止OOM发生答案①生产开启-XX:HeapDumpOnOutOfMemoryError②开启GC日志③合理设置-Xmx和-Xms④代码避免静态集合无限增长、资源及时关闭、ThreadLocal及时remove⑤定期压测和review。 面试官追问陷阱加分题追问1“MAT分析堆快照时Path to GC Roots为什么要排除弱引用和软引用” 弱引用WeakReference和软引用SoftReference在GC时会被回收不会造成内存泄漏。只有强引用链才是泄漏的根本原因。排除弱/软/虚引用后留下的是真正的泄漏根源。追问2“-Xms和-Xmx设置相同有什么好处和坏处” 好处避免JVM动态扩容的STW开销提高性能稳定性。坏处启动时直接占用最大内存容器环境下可能浪费资源。生产通常建议设置相同如-Xms4g -Xmx4g避免扩容带来的性能抖动。追问3“JDK 11的-XX:UseContainerSupport默认开启有什么作用” 让JVM感知容器内存限制使用-XX:MaxRAMPercentage代替固定-Xmx。容器内存超限时JVM不会因超出容器限制而被K8s杀死同时避免OOM。七、练习题分析题一个服务频繁FullGC老年代使用率持续98%FGC每小时几百次。可能是什么原因如何排查场景题某应用需要不停机更新代码但每次热部署后Metaspace持续增长最终OOM。分析原因和解决方案。代码题写出生产环境JVM参数要求堆4GB、开启G1、目标停顿100ms、OOM自动dump、开启GC日志轮转。 你的学习进度当前第67篇 / 共108篇 ·进阶篇JVM调优与故障排查第61~70篇✅ 已完成基础篇44篇 第45~67篇 正在学第67篇⏳ 待学习第68~108篇 完整目录 学习指南 | 订阅本专栏不错过每一篇 下一篇文章预告下一篇《第68篇JavaWeb核心技术之Servlet》内容简介Servlet生命周期、容器原理、Filter过滤器、Listener监听器、Servlet 3.0异步处理、与Spring MVC的关系。JVM调优专题正式收官JavaWeb专题即将开启《Java 100 天进阶之路 | 从入门到上岗就业》每天一篇建议收藏 关注一起100天拿offer 点击关注我更新后第一时间收到推送