下面给你一份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 Generation2️⃣ 对象分配流程
new Object() ↓ Eden ↓ Minor GC ↓ Survivor ↓ 年龄 ≥ 15 ↓ Old3️⃣ 为什么分代?
✅ 弱分代假说
✅ 大部分对象朝生夕死
✅ 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️⃣ 常用参数
-Xms2g-Xmx2g-Xmn512m-XX:+UseG1GC-XX:MaxGCPauseMillis=2002️⃣ 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 + 类加载 + 调优