Skip to content

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["性能调优案例"]

本目录清单

  1. JVM 组成
  2. JVM 常用配置命令
  3. JVM 内存结构
  4. HotSpot 虚拟机对象探秘
  5. 垃圾收集策略与算法
  6. HotSpot 垃圾收集器
  7. 内存分配与回收策略
  8. JVM 性能调优
  9. 类文件结构
  10. 类加载的时机
  11. 类加载的过程
  12. 类加载器
  13. 排查工具

入门必须掌握的概念

大多数对象实例都在堆中分配。堆是 GC 重点管理的区域。

虚拟机栈

每个线程都有自己的栈。方法调用时会创建栈帧,局部变量、操作数栈等信息在这里。

方法区

存放类信息、常量、静态变量等元数据。不同 JDK 版本实现有所不同。

GC

Garbage Collection,垃圾回收。它负责清理不再被使用的对象,释放内存。

类加载

JVM 把 .class 文件加载到内存,并完成验证、准备、解析和初始化。

常用命令先记住

shell
# 查看 Java 版本
java -version

# 查看正在运行的 Java 进程
jps

# 查看 JVM 参数
jcmd <pid> VM.flags

# 查看线程栈
jstack <pid>

# 查看堆信息
jmap -heap <pid>

这些命令不是为了背,而是为了排查问题时知道从哪里下手。

常见面试问题

  1. JVM 运行时内存区域有哪些。
  2. JVM 由哪些部分组成。
  3. 堆和栈有什么区别。
  4. 对象什么时候会被 GC。
  5. Minor GC 和 Full GC 有什么区别。
  6. 类加载过程有哪些阶段。
  7. 双亲委派机制是什么。
  8. 如何排查 CPU 飙高。
  9. 如何排查内存溢出。

源码学习建议

如果你想看 HotSpot 源码,可以先了解 OpenJDK,但不建议零基础直接从源码开始。

学习顺序建议:

  1. 先会使用 JVM 参数和工具。
  2. 再理解内存和 GC。
  3. 再看类加载和字节码。
  4. 最后带着问题看源码。

本章小结

JVM 学习的主线是:程序如何运行、对象如何分配、垃圾如何回收、类如何加载、问题如何排查。先建立主线,再逐篇深入,效率会高很多。