JVM 深度解析(面试 + 实战版)

一、什么是 JVM

JVM(Java Virtual Machine,Java 虚拟机)是 Java 实现"一次编写,到处运行"的核心。

作用:

  1. 运行 Java 字节码(.class 文件)

  2. 屏蔽底层操作系统差异

  3. 自动内存管理(GC)

  4. 提供运行时环境(线程、类加载等)

👉 简单理解:

JVM 就是 Java 程序的"运行引擎"。


二、JVM 整体结构

JVM 主要分为三大部分:

  1. 类加载子系统

  2. 运行时数据区(内存结构)

  3. 执行引擎


三、类加载机制(重点)

1. 类加载流程

一个类从加载到使用,一共经历:

  1. 加载(Loading)

  2. 验证(Verification)

  3. 准备(Preparation)

  4. 解析(Resolution)

  5. 初始化(Initialization)


2. 双亲委派模型(面试高频)

类加载器层级:

  1. 启动类加载器(Bootstrap ClassLoader)

  2. 扩展类加载器(Extension ClassLoader)

  3. 应用类加载器(App ClassLoader)

👉 工作流程:

当一个类被加载时:

  1. 先让父类加载器加载

  2. 父类加载不了,才自己加载


3. 为什么要双亲委派?

核心作用:

  1. 防止重复加载

  2. 保证安全(核心类不被篡改)

👉 例子:

你不能自己写一个 java.lang.String 覆盖系统类。


四、JVM 内存结构(重点中的重点)

JVM 内存分为:

1. 线程私有

  1. 程序计数器

  2. 虚拟机栈

  3. 本地方法栈


2. 线程共享

  1. 堆(Heap)

  2. 方法区(JDK8 之后叫元空间 Metaspace)


五、详细内存区域解析

1. 堆(Heap)

👉 最重要区域,存放对象

结构:

  1. 新生代(Young Generation)

    • Eden区

    • Survivor区(S0、S1)

  2. 老年代(Old Generation)


2. 虚拟机栈

存储:

  1. 局部变量

  2. 方法调用

  3. 栈帧

👉 常见异常:

  • StackOverflowError(栈溢出)

3. 方法区(元空间)

存储:

  1. 类信息

  2. 常量池

  3. 静态变量

👉 JDK8 变化:

  • 永久代 → 元空间(使用本地内存)

六、对象创建过程(必考)

对象创建流程:

  1. 类加载检查

  2. 分配内存(指针碰撞 / 空闲列表)

  3. 初始化零值

  4. 设置对象头

  5. 执行构造方法


七、垃圾回收机制(GC)

1. 什么是 GC

GC(Garbage Collection)用于自动回收不再使用的对象。


2. 如何判断对象死亡?

两种方式:

  1. 引用计数法(已淘汰)

  2. 可达性分析(主流)

👉 核心思想:

从 GC Roots 出发,无法到达的对象 = 垃圾


3. 常见 GC Roots

  1. 栈中引用

  2. 静态变量

  3. 常量

  4. 本地方法引用


八、垃圾回收算法

1. 标记-清除

优点:

  • 简单

缺点:

  • 内存碎片

2. 复制算法

适用:

  • 新生代

特点:

  • Eden → Survivor

优点:

  • 无碎片

缺点:

  • 浪费空间

3. 标记-整理

适用:

  • 老年代

特点:

  • 标记 + 压缩

九、常见垃圾回收器

1. Serial(单线程)

适合:

  • 小型应用

2. ParNew

  • 多线程版 Serial

3. CMS(并发标记清除)

特点:

  1. 低停顿

  2. 并发执行

缺点:

  • 内存碎片

  • 已被淘汰


4. G1(主流)

特点:

  1. 分区回收(Region)

  2. 可预测停顿时间

  3. 适合大内存

👉 面试总结:

G1 = 当前主流垃圾回收器


十、JVM 调优(面试加分项)

1. 常见参数

复制代码
-Xms:初始堆大小
-Xmx:最大堆大小
-Xmn:新生代大小
-XX:+UseG1GC:使用G1

2. 调优思路

  1. 先监控(jstat、jvisualvm)

  2. 分析 GC 次数和停顿时间

  3. 调整堆大小

  4. 选择合适 GC


十一、常见 JVM 问题

1. OOM(内存溢出)

常见类型:

  1. 堆内存溢出

  2. 栈溢出

  3. 元空间溢出


2. 排查思路

  1. dump 内存

  2. 分析工具(MAT)

  3. 找大对象


十二、面试高频总结(重点背)

  1. JVM 内存结构

  2. 双亲委派模型

  3. GC 算法区别

  4. G1 和 CMS 区别

  5. 对象创建过程

  6. OOM 排查


十三、一句话总结

👉 JVM 本质就是:

类加载 + 内存管理 + 垃圾回收 + 执行引擎

相关推荐
程序员小远2 小时前
单元测试知识详解
自动化测试·软件测试·python·测试工具·职场和发展·单元测试·测试用例
小涛不学习2 小时前
JVM 面试核心知识全解析(从原理到实战)
jvm·面试·职场和发展
dapeng28702 小时前
使用PyTorch构建你的第一个神经网络
jvm·数据库·python
程序员爱钓鱼2 小时前
Go图像处理基础: image包深度指南
后端·面试·go
空空kkk2 小时前
JVM面试知识点总结
java·jvm·面试
代码雕刻家2 小时前
2.5.第十六届蓝桥杯大赛软件赛省赛Java 大学 B 组(上)
职场和发展·蓝桥杯
dgfhf2 小时前
使用Python处理计算机图形学(PIL/Pillow)
jvm·数据库·python
闻哥2 小时前
MySQL三大日志深度解析:redo log、undo log、binlog 原理与实战
android·java·jvm·数据库·mysql·adb·面试
一叶飘零_sweeeet2 小时前
深挖 JVM 锁膨胀底层:从无锁到重量级锁全链路拆解与高并发调优实战
jvm·锁膨胀