下面给你一份 Java JVM 知识点全景总结(面试 + 实战级) ,
覆盖 内存结构 → 垃圾回收 → 类加载 → 调优 → 面试高频 ,适合 中高级 Java 面试。
一、JVM 是什么?
JVM(Java Virtual Machine)是 Java 程序的运行环境,负责加载字节码并执行。
✅ 跨平台
✅ 自动内存管理
✅ 安全沙箱
二、JVM 内存结构(必背 ⭐⭐⭐⭐⭐)
1️⃣ 运行时数据区
JVM
├── 线程私有
│ ├── 程序计数器(PC)
│ ├── Java 虚拟机栈
│ └── 本地方法栈
└── 线程共享
├── 堆(Heap)
├── 方法区(Metaspace)
└── 运行时常量池
2️⃣ 各区域作用
| 区域 | 作用 | 异常 |
|---|---|---|
| 程序计数器 | 记录执行位置 | ❌ |
| 虚拟机栈 | 方法调用栈帧 | StackOverflowError |
| 本地方法栈 | Native 方法 | StackOverflowError |
| 堆 | 对象实例 | OutOfMemoryError |
| 方法区 | 类信息、常量 | OutOfMemoryError |
三、Java 堆(GC 核心 ⭐⭐⭐⭐⭐)
1️⃣ 堆结构(分代)
Heap
├── Young Generation
│ ├── Eden
│ ├── Survivor From
│ └── Survivor To
└── Old Generation
2️⃣ 对象分配流程
new Object()
↓
Eden
↓
Minor GC
↓
Survivor
↓
年龄 ≥ 15
↓
Old
3️⃣ 为什么分代?
✅ 弱分代假说
✅ 大部分对象朝生夕死
✅ GC 效率更高
四、垃圾回收(GC ⭐⭐⭐⭐⭐)
1️⃣ 如何判断对象可回收?
✅ 引用计数法(不用)
- 循环引用问题
✅ 可达性分析(JVM 使用)
GC Roots
├── 栈中引用
├── 方法区静态变量
├── 常量
└── JNI 引用
2️⃣ 垃圾回收算法
| 算法 | 说明 |
|---|---|
| 标记-清除 | 碎片多 |
| 标记-复制 | 无碎片 |
| 标记-整理 | 慢 |
| 分代收集 | ✅ 主流 |
3️⃣ 常见 GC 器(重点)
| GC | 特点 |
|---|---|
| Serial | 单线程 |
| Parallel Scavenge | 吞吐量 |
| CMS | 低延迟 |
| G1 | ✅ 主流 |
| ZGC | 超低延迟 |
4️⃣ G1 GC(必问)
✅ 区域化(Region)
✅ 可预测停顿
✅ 替代 CMS
五、类加载机制(高频)
1️⃣ 类加载过程
加载 → 验证 → 准备 → 解析 → 初始化
2️⃣ 类加载器
| 加载器 | 作用 |
|---|---|
| Bootstrap | rt.jar |
| Extension | ext |
| Application | classpath |
3️⃣ 双亲委派模型
自定义类加载器
↓
AppClassLoader
↓
ExtClassLoader
↓
BootstrapClassLoader
✅ 防止核心类被篡改
六、JVM 调优(实战)
1️⃣ 常用参数
bash
-Xms2g
-Xmx2g
-Xmn512m
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
2️⃣ OOM 排查
jps
jstat -gc
jmap -heap
jmap -dump
MAT 分析
3️⃣ 常见 OOM
| 类型 | 原因 |
|---|---|
| Java heap space | 堆太小 |
| Metaspace | 类太多 |
| GC overhead limit | GC 过度 |
| Direct buffer memory | NIO |
七、JVM 性能监控工具
| 工具 | 作用 |
|---|---|
| jps | 进程 |
| jstat | GC |
| jinfo | 参数 |
| jmap | 堆 |
| jstack | 线程 |
八、JVM 面试高频 20 问(必刷)
✅ JVM 内存结构?
✅ 堆和栈区别?
堆是 JVM 中最大的内存区域,用于存储对象实例,是所有线程共享的,需要垃圾回收;
栈是线程私有的,用于存储方法调用的栈帧、局部变量和基本数据类型,随方法结束而释放,不需要 GC。
栈中存放的是对象的引用,真正的对象存储在堆中
✅ 对象创建过程?
✅ GC Roots 有哪些?
✅ Minor GC / Major GC?
✅ G1 工作原理?
✅ 双亲委派模型?
✅ 类加载过程?
✅ OOM 排查思路?
九、面试标准答案(背这段 ✅)
JVM 内存分为线程私有和线程共享两部分,堆是 GC 的主要区域。
通过可达性分析判断对象是否可回收,采用分代收集算法。
G1 是目前主流的垃圾收集器,通过 Region 化和可预测停顿提升性能。
类加载遵循双亲委派模型,防止核心类被篡改。
十、一句话总结(记住这句)
✅ JVM = 内存 + GC + 类加载 + 调优