很多同学面试 JVM 很痛苦知识点杂乱、背了不会用、面试问深一点就崩。本文按照入门基础 → 内存模型 → GC 垃圾回收 → 类加载机制 → 底层原理 → 线上调优与故障排查难度逐级递增整理可直接背诵、可直接口述、可解决线上问题。适合Java 初级/中级/高级面试突击、简历亮点补充、后端技术复盘。一、入门基础篇初级必问送分题1. 什么是 JVM它的作用是什么**答**JVM 即 Java 虚拟机是一台专门执行 Java 字节码的虚拟机器。核心作用三点✅跨平台一次编译、到处运行.java编译为统一.class字节码由各平台 JVM 执行✅自动内存管理自动分配内存、自动垃圾回收避免 C/C 手动内存出错✅代码安全与隔离字节码校验、沙箱机制保障运行安全。2. JDK、JRE、JVM 三者区别**答**包含关系JDK JRE JVMJVM只负责运行字节码无编译工具JREJVM Java 基础类库只能运行程序不能开发JDKJRE 编译、调试、监控工具完整开发环境。3. Java 程序运行过程答编写.java→javac编译成.class字节码 → JVM 类加载 → 字节码校验 → 解释/编译执行 → 自动内存管理与 GC。4. Java 是跨平台的JVM 是跨平台的吗答Java 跨平台JVM 不跨平台。不同操作系统需要安装对应版本的 JVMJVM 屏蔽系统差异从而实现 Java 字节码跨平台运行。二、JVM 内存结构篇中级高频核心1. JVM 运行时数据区有哪些哪些线程私有、哪些共享答线程私有随线程生灭程序计数器记录当前执行字节码行号唯一无 OOM 区域虚拟机栈存储栈帧、局部变量表、方法调用与返回信息本地方法栈为虚拟机使用到的本地Native方法服务。线程共享全局堆 Heap所有对象、数组存放位置GC 主战场元空间 MetaspaceJDK8存类结构、方法、常量、静态变量。2. 栈和堆的区别答栈线程私有、速度快、空间小、方法结束自动释放、无 GC堆线程共享、空间大、速度慢、需要 GC 回收、容易 OOM。口诀栈存局部变量堆存对象实例。3. JDK8 为什么废除永久代、改用元空间答永久代大小固定容易出现PermGen OOM元空间使用本地直接内存不再占用堆内存动态扩容默认几乎无上限大幅减少类加载 OOM。4. 常见 OOM 内存溢出场景**答**四种最常见堆 OOM对象过多、内存泄漏、大对象堆积元空间 OOM动态生成大量类、CGLIB 代理、频繁热部署栈溢出递归死循环、方法调用层级过深StackOverflowError直接内存 OOMNIO 未释放 ByteBuffer。5. 深拷贝和浅拷贝答浅拷贝shallowCopy只是增加了一个指针指向已存在的内存地址深拷贝deepCopy是增加了一个指针并且申请了一个新的内存使这个增加的指针指向这个新的内存三、GC 垃圾回收篇面试重中之重1. JVM 如何判断对象是否可回收**答**主流采用可达性分析算法。从GC Roots出发遍历对象图不可到达的对象即为垃圾对象。GC Roots 包含栈中引用对象、静态变量、常量、本地方法引用、活跃线程。补充早期引用计数法无法解决循环引用已被 JVM 废弃。2. JVM 四种引用类型及场景**答**强度从高到低强 软 弱 虚强引用默认引用只要存在就不回收普通业务对象比如 Object obj new Object()软引用 SoftReference内存充足不回收内存即将 OOM 才回收适合做缓存弱引用 WeakReference下次 GC 必回收适用于ThreadLocal虚引用 PhantomReference仅用于监控对象回收不能获取对象实例。3. 新生代与老年代特点对象晋升规则答新生代Eden S0 S18:1:1对象新生、存活少、GC 频繁、速度快老年代存活久、体积大、GC 少、耗时高。晋升条件对象新生代存活满15 次 GC晋升老年代大对象直接进入老年代避免新生代复制开销。4. Minor GC、Major GC、Full GC 区别答Minor GC只回收新生代频率高、STW 短影响小Major GC主要回收老年代通常伴随 Minor GCFull GC全堆回收新生代老年代元空间STW 最长、最耗性能线上尽量避免。5. 常见垃圾收集器对比与生产选型答Parallel吞吐量优先JDK8 默认适合后台任务、批量服务CMS低延迟、并发回收适合高并发互联网服务缺点内存碎片、浮动垃圾G1分区收集、可控制停顿时间JDK9 默认均衡吞吐量与延迟ZGC超低延迟、毫秒级停顿适合超大堆、核心高可用服务。四、类加载机制篇中高阶必问1. 类加载的全过程**答**五大阶段加载 → 验证 → 准备 → 解析 → 初始化加载读取 class 文件生成 Class 对象验证校验字节码合法性、安全性准备静态变量分配内存、赋默认值解析符号引用转为直接内存引用初始化执行静态代码块、静态变量赋值。2. 什么是双亲委派模型作用**答**类加载器加载类时先向上委托父加载器父加载器无法加载自己再加载。加载器层级启动类加载器 → 扩展类加载器 → 应用类加载器 → 自定义加载器核心作用保证 JDK 核心类安全防止被自定义类篡改如 String、Object避免类重复加载保证类唯一性。3. 哪些场景会打破双亲委派**答**四大经典场景JDBC、Dubbo 等SPI 服务扩展Tomcat 容器隔离不同项目类、热部署OSGi 模块化动态热更新自定义类加载器实现加密、热加载。五、底层进阶篇高级开发面试点1. 什么是 STW哪些 GC 会产生 STW**答**STWStop-The-World即暂停所有用户线程只保留 GC 线程工作是程序卡顿的根本原因。所有 GC 都会 STW只是时长不同Minor GC短暂 STW几乎无感Full GC长时间 STW直接导致接口超时、服务卡顿。2. 内存泄漏和内存溢出的区别常见泄漏场景答内存泄漏无用对象一直被引用GC 无法回收是持续过程内存溢出 OOM泄漏累积到内存耗尽是最终结果。高频内存泄漏场景静态集合无限堆积数据不清理ThreadLocal 使用后未 remove线程复用导致对象常驻内存IO、数据库、连接池资源未关闭缓存无过期、无淘汰策略匿名内部类、异步线程持有外部对象引用。3. 对象在 JVM 中的创建流程答检测类是否已加载未加载则执行类加载堆内存分配指针碰撞 / 空闲列表初始化对象默认值设置对象头信息执行构造方法初始化返回对象引用。六、线上调优与故障排查大厂压轴题1. 生产常用 JVM 参数答-Xms初始堆内存、-Xmx最大堆内存生产建议相等避免动态扩容-Xmn新生代大小-XX:MetaspaceSize / MaxMetaspaceSize元空间参数-Xss线程栈大小-XX:UseG1GC使用 G1 收集器-XX:PrintGCDetails打印 GC 日志。2. 线上频繁 Full GC 如何排查**答**标准排查流程查看 GC 日志确认是内存泄漏还是内存不足jps查看进程、jstat -gc实时监控 GC 频率与耗时jmap查看堆对象分布dump 堆快照使用 MAT/JProfiler 分析大对象、泄漏对象、重复对象定位代码问题缓存、静态集合、ThreadLocal、资源未释放修复代码 调整 JVM 参数 压测验证。3. 什么时候需要做 JVM 调优**答**出现以下现象必须调优Full GC 频繁、GC 停顿时间过长接口响应抖动、超时、CPU 飙高服务频繁 OOM、重启、内存水位持续居高不下。七、写在最后JVM 面试的核心逻辑非常清晰初级考概念、内存结构、GC 基础中级考引用类型、回收机制、类加载、双亲委派高级考收集器选型、STW、内存泄漏、线上 GC 调优、故障排查。本文从易到难全覆盖不仅适用于面试背诵更能帮你建立完整的 JVM 底层思维。如果对你有帮助点赞、分享、推荐一下呀对主编都是很大的帮助。留一个疑问欢迎评论区讨论User user new User() 做了什么操作申请了哪些内存