跳到主要内容

JVM 教程

欢迎学习 JVM(Java Virtual Machine,Java虚拟机)!本教程将带你深入理解JVM的工作原理,帮助你成为更优秀的Java开发者。

什么是 JVM?

JVM是Java程序的运行环境,它是一个虚拟的计算机,负责执行Java字节码(.class文件)。JVM是Java语言"一次编写,到处运行"(Write Once, Run Anywhere)特性的核心保障。

JVM 的核心作用

  1. 字节码执行:JVM读取字节码文件,将其解释或编译为机器码执行
  2. 内存管理:自动分配和回收对象内存(垃圾回收)
  3. 平台无关性:同一份字节码可以在不同操作系统上运行
  4. 安全管理:提供沙箱安全机制,限制代码对系统资源的访问

JVM 与其他虚拟机的区别

特性JVM.NET CLRPython Interpreter
语言支持Java, Kotlin, Scala等C#, VB.NET等Python
字节码Java BytecodeCILPython Bytecode
垃圾回收
运行时HotSpot, GraalVM.NET RuntimeCPython, PyPy

为什么要深入学习 JVM?

1. 解决性能问题

理解JVM的内存模型和垃圾回收机制,可以帮助你:

  • 识别和解决内存泄漏
  • 优化垃圾回收参数
  • 提升应用性能

2. 应对面试

JVM是Java面试的重点考察内容:

  • 内存模型
  • 垃圾回收算法
  • 类加载机制
  • 性能调优

3. 写出更好的代码

了解对象分配、内存布局等知识,可以帮助你:

  • 写出更高效的代码
  • 避免常见的性能陷阱
  • 更好地理解多线程

JVM 的整体架构

JVM 整体架构图:

┌─────────────────────────────────────────────────────────────────────────┐
│ JVM 进程 │
│ │
│ ┌──────────────────────────────────────────────────────────────────┐ │
│ │ 类加载子系统 │ │
│ │ (加载 .class 文件到内存) │ │
│ └──────────────────────────────────────────────────────────────────┘ │
│ ↓ │
│ ┌──────────────────────────────────────────────────────────────────┐ │
│ │ 运行时数据区 │ │
│ │ │ │
│ │ ┌─────────────────────┐ ┌─────────────────────────────┐ │ │
│ │ │ 线程共享区域 │ │ 线程私有区域 │ │ │
│ │ │ │ │ │ │ │
│ │ │ ┌─────────────┐ │ │ ┌─────────────────────┐ │ │ │
│ │ │ │ 堆 │ │ │ │ 虚拟机栈 │ │ │ │
│ │ │ │ (Heap) │ │ │ │ (VM Stack) │ │ │ │
│ │ │ └─────────────┘ │ │ └─────────────────────┘ │ │ │
│ │ │ │ │ │ │ │
│ │ │ ┌─────────────┐ │ │ ┌─────────────────────┐ │ │ │
│ │ │ │ 方法区 │ │ │ │ 本地方法栈 │ │ │ │
│ │ │ │(Method Area)│ │ │ │(Native Method Stack)│ │ │ │
│ │ │ └─────────────┘ │ │ └─────────────────────┘ │ │ │
│ │ │ │ │ │ │ │
│ │ └─────────────────────┘ │ ┌─────────────────────┐ │ │ │
│ │ │ │ 程序计数器 │ │ │ │
│ │ │ │ (PC Registers) │ │ │ │
│ │ │ └─────────────────────┘ │ │ │
│ └──────────────────────────────────────────────────────────────────┘ │
│ ↓ │
│ ┌──────────────────────────────────────────────────────────────────┐ │
│ │ 执行引擎 │ │
│ │ │ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │ │
│ │ │ 解释器 │ │ JIT编译器 │ │ 垃圾回收器 │ │ │
│ │ │(Interpreter)│───▶│(JIT Compiler)│───▶│ (Garbage Collector)│ │ │
│ │ └─────────────┘ └─────────────┘ └─────────────────────┘ │ │
│ └──────────────────────────────────────────────────────────────────┘ │
│ ↓ │
│ ┌─────────────┐ │
│ │ 本地库接口 │ │
│ │ (JNI/Native)│ │
│ └─────────────┘ │
└─────────────────────────────────────────────────────────────────────────┘

架构详解

  1. 类加载子系统:负责加载.class文件
  2. 运行时数据区:存储程序运行时的数据
    • 线程共享:堆、方法区
    • 线程私有:虚拟机栈、本地方法栈、程序计数器
  3. 执行引擎:执行字节码
    • 解释器:逐行解释执行
    • JIT编译器:即时编译,提升性能
    • 垃圾回收器:自动回收无用对象
  4. 本地库接口:调用本地方法(Native)

Java 代码的执行过程

Java 程序执行流程:

┌─────────────┐
│ .java │ 1. 编写 Java 源代码
│ 源文件 │
└──────┬──────┘
│ javac 编译

┌─────────────┐
│ .class │ 2. 编译成字节码文件
│ 字节码文件 │ (与平台无关)
└──────┬──────┘
│ 类加载器加载

┌─────────────┐
│ 类加载器 │ 3. JVM 类加载子系统
│ (ClassLoader)│ 加载字节码到内存
└──────┬──────┘
│ 执行引擎处理

┌─────────────┐
│ 执行引擎 │ 4. 解释执行 / JIT 即时编译
│ ┌───────┐ │
│ │解释器 │ │
│ │JIT │ │
│ │GC │ │
│ └───────┘ │
└──────┬──────┘
│ 生成本地机器码

┌─────────────┐
│ CPU │ 5. CPU 执行机器码
│ 执行机器码 │
└─────────────┘
  1. 编写Java源文件:使用IDE或文本编辑器编写.java文件
  2. 编译:使用javac编译器将.java文件编译为.class字节码文件
  3. 类加载:JVM的类加载器将.class文件加载到内存
  4. 字节码执行:执行引擎解释或编译执行字节码
  5. 机器码执行:CPU执行生成的机器码

主流 JVM 实现

HotSpot JVM

Oracle官方的JVM实现,也是最广泛使用的JVM。特点是:

  • 强大的 JIT 编译器
  • 成熟的垃圾回收器
  • 良好的性能优化

GraalVM

新一代JVM,支持:

  • 多语言运行(Java, Python, JavaScript, Ruby等)
  • 原生镜像(AOT编译)
  • 更快的启动时间

OpenJ9

IBM开发的JVM,特点是:

  • 更低的内存占用
  • 更好的启动性能
  • 适合云原生应用

教程目录

基础阶段

进阶阶段

高级阶段

知识速查

学习建议

  1. 循序渐进:先理解JVM的整体架构,再深入各个模块
  2. 动手实践:使用VisualVM、JConsole等工具观察JVM行为
  3. 阅读源码:有机会可以阅读HotSpot源码,深入理解实现原理
  4. 解决问题:在实际项目中遇到的JVM问题是最好的学习素材

参考资源

准备好开始学习了吗?点击下一章开始你的JVM深入学习之旅!