Java JVM概述与跨平台原理
JVM(Java Virtual Machine)是Java跨平台的核心,负责执行字节码。
JVM定义
JVM是虚构的计算机,通过软件模拟物理计算机的功能,包括指令集、寄存器、栈、堆等。
JVM架构
Java
┌─────────────────────────────────────┐
│ JVM架构 │
├─────────────────────────────────────┤
│ 类加载器子系统 │
├─────────────────────────────────────┤
│ 运行时数据区 │
│ ┌─────┬─────┬─────┬─────┬─────┐ │
│ │方法区│ 堆 │栈 │本地│程序│ │
│ │ │ │ │栈 │计数│ │
│ │ │ │ │ │器 │ │
│ └─────┴─────┴─────┴─────┴─────┘ │
├─────────────────────────────────────┤
│ 执行引擎 │
│ ┌─────┬─────┬─────┐ │
│ │解释 │编译 │GC │ │
│ │器 │器 │ │ │
│ └─────┴─────┴─────┘ │
├─────────────────────────────────────┤
│ 本地方法接口(JNI) │
└─────────────────────────────────────┘
跨平台原理
Java程序执行流程
text
源码(.java) → 编译器 → 字节码(.class) → JVM → 机器码 → 执行
跨平台实现
text
┌──────────────┐
│ Java源码 │
│ Hello.java │
└──────────────┘
↓ javac编译
┌──────────────┐
│ 字节码 │ ← 统一格式,与平台无关
│ Hello.class │
└──────────────┘
↓ 不同平台JVM解释/编译
┌─────┬─────┬─────┐
│Win │Mac │Linux│ ← 各平台有专属JVM
│JVM │JVM │JVM │
└─────┴─────┴─────┘
↓
┌─────┬─────┬─────┐
│Win │Mac │Linux│
│机器码│机器码│机器码│
└─────┴─────┴─────┘
关键点:
- 字节码统一,与平台无关
- 每个平台有专属的JVM实现
- JVM将字节码转换为本地机器码
JVM主要组件
| 组件 | 作用 |
|---|---|
| 类加载器 | 加载.class文件到内存 |
| 运行时数据区 | 存储程序运行数据 |
| 执行引擎 | 执行字节码 |
| 本地方法接口 | 调用操作系统功能 |
| 本地方法库 | 操作系统提供的本地方法 |
JVM版本演变
| 版本 | 特点 |
|---|---|
| JDK 1.0 | Classic VM |
| JDK 1.2 | Exact VM |
| JDK 1.3 | HotSpot VM(主流) |
| JDK 11 | 移除永久代,替换为元空间 |
| JDK 17 | LTS版本,ZGC优化 |
JVM厂商实现
| JVM | 描述 |
|---|---|
| HotSpot | Oracle官方,最主流 |
| OpenJ9 | IBM开源 |
| GraalVM | 支持多语言 |
| JRockit | BEA开发(已合并到HotSpot) |
字节码特点
text
// Java源码
public class Hello {
public static void main(String[] args) {
System.out.println("Hello");
}
}
// 字节码(javap -c Hello.class)
public static void main(java.lang.String[]);
Code:
0: getstatic #2 // Field java/lang/System.out
3: ldc #3 // String Hello
5: invokevirtual #4 // Method println
8: return
字节码特点:
- 基于栈的操作
- 指令集简单
- 平台无关
JVM执行方式
| 方式 | 特点 |
|---|---|
| 解释执行 | 逐条解释字节码,启动快 |
| 编译执行(JIT) | 编译为本地机器码,运行快 |
| 混合模式 | 先解释,热点代码编译 |
注意事项
JVM只认识字节码,不认识Java源码
字节码是跨平台的媒介,JVM是翻译者
不同平台JVM实现不同,但字节码格式统一
JVM规范定义行为,各厂商实现细节可不同
要点总结
- JVM是Java跨平台的核心,执行字节码
- Java源码编译为字节码,字节码由各平台JVM解释/编译执行
- JVM架构包括:类加载器、运行时数据区、执行引擎、本地接口
- 字节码统一格式,与平台无关
- HotSpot是最主流的JVM实现
📝 发现内容有误?点击此处直接编辑