跳到主要内容

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 的整体架构

架构详解

  1. 类加载子系统:负责加载.class文件,经过加载、验证、准备、解析、初始化等阶段将类信息加载到内存

  2. 运行时数据区:存储程序运行时的数据

    • 线程共享区域
      • 堆(Heap):存放对象实例,是垃圾回收的主要区域
      • 方法区(Method Area):存储类信息、常量、静态变量
    • 线程私有区域
      • 虚拟机栈(VM Stack):每个方法调用创建一个栈帧
      • 本地方法栈(Native Stack):为Native方法服务
      • 程序计数器(PC Register):记录当前执行的字节码指令位置
  3. 执行引擎:执行字节码

    • 解释器:逐行解释执行,启动快但效率较低
    • JIT编译器:将热点代码编译为本地机器码,大幅提升性能
    • 垃圾回收器:自动回收不再使用的对象内存
  4. 本地库接口:通过JNI调用本地方法库,实现与操作系统或其他语言的交互

Java 代码的执行过程

执行流程详解

  1. 编写Java源文件:使用IDE或文本编辑器编写.java文件

  2. 编译:使用javac编译器将.java文件编译为.class字节码文件。字节码是平台无关的中间代码,这是Java"一次编写,到处运行"的基础

  3. 类加载:JVM的类加载器将.class文件加载到内存,经过验证、准备、解析、初始化等阶段

  4. 字节码执行:执行引擎根据代码特性选择执行方式

    • 解释执行:适合启动阶段和冷代码,逐行翻译执行
    • JIT编译执行:热点代码会被编译为本地机器码,后续执行效率极高
  5. 机器码执行:CPU执行生成的机器指令,完成程序功能

主流 JVM 实现

HotSpot JVM

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

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

GraalVM

新一代JVM,支持:

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

OpenJ9

IBM开发的JVM,特点是:

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

教程目录

基础入门

核心机制

性能优化

安全与高级

知识速查

  • JVM速查表 - JVM常用命令、参数和诊断场景速查

学习建议

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

参考资源

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