JVM内存与GC机制详解

JVM内存与GC机制详解 Java技术面试高频题整理 · Day 1今日知识点JVM内存模型与垃圾回收机制JVMJava虚拟机是Java面试中的核心考点几乎每场中高级Java面试都会涉及。掌握JVM内存结构和垃圾回收机制不仅能应对面试更能提升线上问题排查能力。一、核心知识点剖析1.1 JVM运行时数据区结构JVM内存分为线程私有和线程共享两大部分区域类型内存区域作用是否GCOOM风险线程私有程序计数器记录当前执行字节码行号否无线程私有虚拟机栈存储栈帧、局部变量、方法调用否StackOverflowError线程私有本地方法栈为Native方法服务否StackOverflowError线程共享堆(Heap)存放所有对象实例、数组是Heap OOM线程共享元空间(Metaspace)存类结构、方法、常量、静态变量是Metaspace OOM记忆口诀栈存局部变量堆存对象实例1.2 JDK8重大变更永久代→元空间JDK8废除永久代(PermGen)改用元空间(Metaspace)原因如下永久代大小固定容易出现PermGen OOM元空间使用本地直接内存不再占用堆内存动态扩容默认几乎无上限大幅减少类加载OOM二、高频面试题及标准答案题目1JVM如何判断对象是否可回收标准答案主流采用可达性分析算法。从GC Roots出发遍历对象图不可到达的对象即为垃圾对象。GC Roots包含栈中引用的对象静态变量常量本地方法引用活跃线程补充早期引用计数法因无法解决循环引用问题已被JVM废弃题目2JVM四种引用类型及使用场景引用类型回收时机典型场景代码示例强引用永不回收普通业务对象Object obj new Object()软引用内存不足时回收缓存SoftReferenceObject弱引用下次GC必回收ThreadLocalWeakReferenceObject虚引用随时回收监听对象回收PhantomReferenceObject核心考点ThreadLocal底层key使用弱引用避免内存泄漏。当ThreadLocal对象变为null时key会被GC自动回收题目3新生代与老年代的特点及对象晋升规则新生代Eden S0 S1 8:1:1对象新生、存活少、GC频繁、速度快采用复制算法老年代存活久、体积大、GC少、耗时高采用标记-整理算法晋升条件对象在新生代存活满15次GC后晋升老年代大对象直接进入老年代避免新生代复制开销题目4Minor GC、Major GC、Full GC的区别GC类型回收范围频率STW时长影响Minor GC仅新生代高短几乎无感Major GC主要老年代中中通常伴随Minor GCFull GC全堆(新生代老年代元空间)低最长接口超时、服务卡顿生产建议线上尽量避免Full GC题目5常见垃圾收集器对比与生产选型收集器特点适用场景JDK版本Parallel吞吐量优先后台任务、批量服务JDK8默认CMS低延迟、并发回收高并发互联网服务JDK8可选G1分区收集、可控制停顿时间均衡吞吐量与延迟JDK9默认ZGC超低延迟、毫秒级停顿超大堆、核心高可用服务JDK11CMS缺点内存碎片、浮动垃圾题目6final、finally、finalize三者区别关键字类型作用使用场景final关键字不可变、不可继承、不可重写定义常量、工具类finally代码块异常处理必须执行关闭资源finalize方法GC回收前调用已废弃代码示例// final修饰类、方法、变量 final class Demo {} public final void test() {} final int a 10; // finally异常处理 try { /* 业务代码 */ } catch(Exception e) { /* 异常处理 */ } finally { /* 必须执行关闭资源 */ } // finalize已废弃 Override protected void finalize() throws Throwable { /* 回收前操作 */ }三、生产避坑指南3.1 常见OOM场景及排查OOM类型原因排查方案Heap OOM对象过多、内存泄漏、大对象堆积jmap -heap分析Metaspace OOM动态生成大量类、CGLIB代理、频繁热部署检查类加载器泄漏StackOverflowError递归死循环、方法调用层级过深检查递归深度Direct Memory OOMNIO未释放ByteBuffer检查NIO使用排查三板斧jps→jstack→jmap -heap3.2 生产JVM参数建议# 堆内存设置生产建议-Xms与-Xmx相等避免动态扩容 -Xms4g -Xmx4g # OOM时自动dump堆内存快照 -XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath/path/dump.hprof # 元空间设置 -XX:MetaspaceSize256m -XX:MaxMetaspaceSize512m四、延伸考点4.1 STWStop-The-World详解STW即暂停所有用户线程只保留GC线程工作是程序卡顿的根本原因。Minor GC短暂STW几乎无感Full GC长时间STW直接导致接口超时、服务卡顿4.2 内存泄漏 vs 内存溢出内存泄漏对象不再使用但无法被GC回收长期累积内存溢出OOM泄漏累积到内存耗尽是最终结果典型泄漏场景ThreadLocal使用后未remove线程复用导致对象常驻内存五、明日预告Day 2知识点Spring IoC控制反转与三级缓存循环依赖核心考点IoC容器原理与Bean生命周期三级缓存解决循环依赖机制AOP动态代理JDK vs CGLIB事务传播机制与失效场景学习建议JVM知识点需要理解记忆结合建议配合线上问题排查实践加深理解。每天坚持一个知识点30天攻克Java面试核心考点参考来源java面试题 4-CSDN博客Java中的final/finally/finalize与对象4种引用全解析_java_脚本之家JVM 全套面试题整理由简到难2026最新完整版-CSDN博客金九银十Java八股文面试题总结2026版-CSDN博客Java面试通关⑧Spring核心IoC/AOP全集-CSDN博客java面试题jvm ,mybatis-CSDN博客