JVM 学习路线
JVM 是 Java 程序运行的虚拟机。你写的 .java 文件先编译成 .class 字节码,再由 JVM 加载、解释或即时编译执行。
零基础学习 JVM 不要一开始就啃源码。更合理的顺序是先理解“Java 程序如何运行”,再学内存结构、垃圾回收、类加载和性能排查。
为什么先学 JVM 主线
JVM 知识点很多,如果直接背堆、栈、GC、类加载,很容易变成碎片记忆。先建立“源码如何变成运行中的程序”这条主线,后面每个知识点都能放到对应位置。
如果没有这条主线,看到 OOM、Full GC、类加载失败、线程阻塞时,就不知道该从内存、GC、类加载还是工具排查入手。
Java 程序运行流程
mermaid
flowchart TD
A["编写 Java 源码"] --> B["javac 编译"]
B --> C["生成 .class 字节码"]
C --> D["类加载器加载类"]
D --> E["JVM 解释执行或 JIT 编译"]
E --> F["程序运行"]
F --> G["GC 回收无用对象"]理解这条链路后,再看 JVM 的各个模块就不会散。
JVM 主要学什么
| 模块 | 重点问题 |
|---|---|
| JVM 组成 | JVM 由哪些核心模块协作完成程序运行 |
| 内存结构 | 堆、栈、方法区分别放什么 |
| 对象模型 | 对象在内存中如何布局 |
| 垃圾回收 | JVM 如何判断对象无用并回收 |
| GC 收集器 | 不同收集器适合什么场景 |
| 类加载 | 类什么时候加载,如何加载 |
| 字节码 | .class 文件里有什么 |
| 性能调优 | 如何通过日志和工具定位问题 |
推荐学习顺序
mermaid
flowchart TD
A["Java 程序运行流程"] --> B["JVM 组成"]
B --> C["JVM 内存结构"]
C --> D["对象创建和内存布局"]
D --> E["垃圾回收基础"]
E --> F["常见 GC 收集器"]
F --> G["类文件结构"]
G --> H["类加载机制"]
H --> I["JVM 参数和排查工具"]
I --> J["性能调优案例"]本目录清单
- JVM 组成
- JVM 常用配置命令
- JVM 内存结构
- HotSpot 虚拟机对象探秘
- 垃圾收集策略与算法
- HotSpot 垃圾收集器
- 内存分配与回收策略
- JVM 性能调优
- 类文件结构
- 类加载的时机
- 类加载的过程
- 类加载器
- 排查工具
入门必须掌握的概念
堆
大多数对象实例都在堆中分配。堆是 GC 重点管理的区域。
虚拟机栈
每个线程都有自己的栈。方法调用时会创建栈帧,局部变量、操作数栈等信息在这里。
方法区
存放类信息、常量、静态变量等元数据。不同 JDK 版本实现有所不同。
GC
Garbage Collection,垃圾回收。它负责清理不再被使用的对象,释放内存。
类加载
JVM 把 .class 文件加载到内存,并完成验证、准备、解析和初始化。
常用命令先记住
shell
# 查看 Java 版本
java -version
# 查看正在运行的 Java 进程
jps
# 查看 JVM 参数
jcmd <pid> VM.flags
# 查看线程栈
jstack <pid>
# 查看堆信息
jmap -heap <pid>这些命令不是为了背,而是为了排查问题时知道从哪里下手。
常见面试问题
- JVM 运行时内存区域有哪些。
- JVM 由哪些部分组成。
- 堆和栈有什么区别。
- 对象什么时候会被 GC。
- Minor GC 和 Full GC 有什么区别。
- 类加载过程有哪些阶段。
- 双亲委派机制是什么。
- 如何排查 CPU 飙高。
- 如何排查内存溢出。
源码学习建议
如果你想看 HotSpot 源码,可以先了解 OpenJDK,但不建议零基础直接从源码开始。
学习顺序建议:
- 先会使用 JVM 参数和工具。
- 再理解内存和 GC。
- 再看类加载和字节码。
- 最后带着问题看源码。
本章小结
JVM 学习的主线是:程序如何运行、对象如何分配、垃圾如何回收、类如何加载、问题如何排查。先建立主线,再逐篇深入,效率会高很多。
