JVM 面试核心知识全解析(从原理到实战)

JVM 面试核心知识全解析(从原理到实战) 一、JVM 的整体理解如果用一句话概括 JVMJVM 是 Java 程序的运行环境它负责加载字节码、分配内存、执行代码并自动完成垃圾回收。从整体结构来看JVM 主要包含三大部分类加载子系统负责加载.class文件到内存方法区/元空间运行时数据区提供程序运行所需的内存空间执行引擎执行字节码解释器 JIT 编译器 GC二、JVM 运行时内存结构JVM 内存结构可以按“线程共享”和“线程私有”来理解1. 线程共享区域1堆Heap存储对象实例是垃圾回收的主要区域2方法区Method Area存储类信息、常量、静态变量、JIT 代码等JDK8 之后由元空间Metaspace实现2. 线程私有区域1虚拟机栈Stack每个方法调用都会创建一个栈帧2本地方法栈执行 native 方法3程序计数器PC记录当前线程执行位置 核心记忆堆和方法区是共享的栈/本地栈/PC 是私有的三、虚拟机栈详解虚拟机栈是线程私有的用于管理方法调用。1. 栈帧结构每个方法调用都会创建一个栈帧包含局部变量表操作数栈动态链接方法返回地址2. 栈的特点先进后出FILO方法结束自动出栈不需要垃圾回收3. 常见异常1StackOverflowError递归过深方法调用层级过多2线程过多导致内存不足OutOfMemoryError4. 面试延伸点栈中存的是对象引用不是对象本身局部变量通常线程安全不逃逸四、方法区与元空间1. 方法区作用用于存储类信息常量池静态变量JIT 编译代码2. JDK 版本区别JDK7 及之前永久代PermGenJDK8 之后元空间Metaspace 核心区别元空间使用本地内存不再占用 JVM 堆内存3. 常见问题典型异常OutOfMemoryError: PermGen spaceOutOfMemoryError: Metaspace常见原因动态代理生成大量类类加载器泄漏五、堆内存与分代模型重点堆是 JVM 最重要的内存区域采用分代思想管理对象。1. 堆的结构1年轻代YoungEden 区Survivor 区S0 / S12老年代Old存放长期存活对象2. 对象分配流程新对象进入 EdenEden 满触发 Minor GC存活对象进入 Survivor多次存活后晋升到老年代3. GC 类型1Minor GC发生在新生代频繁且速度快2Major GC / Full GC发生在老年代或整堆停顿时间长六、垃圾回收机制GC1. 为什么需要 GCJava 中对象创建频繁如果不自动回收会导致内存泄漏。2. STWStop-The-WorldGC 过程中JVM 会暂停所有用户线程只执行垃圾回收。 核心优化目标吞吐量执行效率停顿时间用户体验七、对象存活判定1. 引用计数法已淘汰缺点无法解决循环引用问题2. 可达性分析主流核心思想从 GC Roots 出发无法被访问的对象即为垃圾3. 常见 GC Roots栈中的引用静态变量常量JNI 引用八、垃圾回收算法1. 标记-清除优点简单缺点内存碎片2. 复制算法适用于新生代将存活对象复制到新区域优点无碎片3. 标记-整理适用于老年代标记后压缩内存4. 分代收集 核心思想不同区域使用不同算法九、常见垃圾回收器1. Serial单线程简单但停顿时间长2. Parallel多线程追求吞吐量3. CMS特点低停顿并发执行缺点内存碎片4. G1主流特点Region 分区可控停顿时间高效回收5. ZGC了解特点超低延迟适合大内存场景十、三色标记进阶对象分为白色未访问灰色处理中黑色已完成问题漏标误删浮动垃圾解决CMS增量更新G1SATB十一、四种引用类型强引用不会被回收软引用内存不足才回收弱引用GC 即回收虚引用用于跟踪回收十二、OOM 问题排查实战重点1. 常见类型堆内存溢出元空间溢出直接内存溢出2. 排查步骤开启 dump使用工具分析MAT / VisualVM找出大对象或异常引用3. 常见原因内存泄漏缓存未清理集合无限增长线程池堆积十三、线上问题排查1. CPU 飙高排查步骤定位进程找高 CPU 线程分析线程栈工具jstackArthas2. 死锁问题使用 jstack 检测查看线程锁依赖关系十四、常用 JVM 参数1. 堆-Xms初始大小-Xmx最大大小2. 栈-Xss线程栈大小3. GC-XX:UseG1GC-XX:MaxGCPauseMillis4. Dump-XX:HeapDumpOnOutOfMemoryError十五、总结面试必背可以用这三句话总结 JVM内存结构堆和方法区共享栈私有对象生命周期新生代 → 老年代 → GC 回收性能核心GC 停顿、吞吐量、内存管理十六、一句话终极总结 JVM 本质就是类加载 内存管理 垃圾回收 执行引擎