

🔥个人主页:艾莉丝努力练剑 ❄专栏传送门:《C语言》、《数据结构与算法》、C语言刷题12天IO强训、LeetCode代码强化刷题、洛谷刷题、C/C++基础知识知识强化补充、C/C++干货分享&学习过程记录 🍉学习方向:C/C++方向学习者 ⭐️人生格言:为天地立心,为生民立命,为往圣继绝学,为万世开太平
前言:我们每天都在用 javac 编译运行 Java 程序,但这仅仅是故事的开始。.java 文件如何一步步变成高效运行的机器码?这背后隐藏着一个由前端编译器、即时编译器 (JIT) 和提前编译器 (AOT) 共同构成的精密世界。本文将带你穿越 Java 的编译之旅,揭示从源代码到最终性能提升的全过程,让你对 Java 的运作机制有一个全新的认识。
目录
一、前端编译器 (将 .java 编译成 .class)
1.1 JDK 自带编译器:javac
1.2 Eclipse 编译器 for Java (ECJ)
1.3 其他编译器
二、即时编译器 JIT (将 .class 字节码编译成机器码)
2.1 C1 编译器 (客户端编译器 - Client Compiler)
2.2 C2 编译器 (服务端编译器 - Server Compiler)
2.3 分层编译 (Tiered Compilation)
2.4 GraalVM 编译器 (新一代)
三、提前编译器 AOT (Ahead-Of-Time Compiler)
3.1 GraalVM Native Image
3.2 JDK 9 引入的 jaotc
总结
结尾
这类编译器是我们最常直接接触的。
javac这是最官方、最标准、使用最广泛的编译器。
javac HelloWorld.java
这是一个非常著名的独立编译器,是 Eclipse IDE 的默认编译器。
这是 Java 实现“一次编写,到处运行”和高效运行的关键。它内置于 JVM(Java 虚拟机)中,在程序运行时工作。我们通常不直接调用它,而是通过设置 JVM 参数来影响它的行为。
HotSpot VM 是 Oracle 和 OpenJDK 的默认虚拟机,也是目前最主流的 JVM,它内置了两个强大的 JIT 编译器:
-client 参数强制使用(但新版JDK中此参数已失效)。
-server 参数强制使用(新版同样已失效)。
这是现代 JVM(Java 8 后默认开启)的标配策略,它结合了 C1 和 C2 的优点。
-XX:+TieredCompilation 开启或关闭。
-XX:+UseJVMCICompiler 参数启用),性能在某些场景下优于传统的 C2。
这类编译器在程序运行之前,就将字节码直接编译成机器码,从而完全避免在运行时进行 JIT 编译。
这是目前最主流的 Java AOT 解决方案。
jaotc类型 | 常见编译器 | 主要作用 | 特点与场景 |
|---|---|---|---|
前端编译器 | javac (主流) | 将 .java 源码编译成 .class 字节码 | 标准、稳定,所有IDE和构建工具的基础 |
ECJ (Eclipse) | 同上 | 增量编译能力强,Eclipse IDE 默认使用 | |
即时编译器 (JIT) | C1 (HotSpot) | 将热点字节码快速编译为机器码 | 编译快,优化少,注重启动速度 |
C2 (HotSpot) | 将热点字节码深度优化为机器码 | 编译慢,优化多,注重峰值性能 | |
分层编译 (默认) | 结合 C1 和 C2 | 平衡启动速度和峰值性能 | |
Graal JIT | 作为 HotSpot 的 JIT 替代 | 现代化,用Java编写,性能有潜力 | |
提前编译器 (AOT) | Graal Native Image (主流) | 将字节码直接编译为独立可执行文件 | 启动极快,占用内存小,适合云原生 |
~~jaotc~~ | (已废弃) | 早期的实验性方案 |
对于大多数 Java 开发者来说,最常直接接触的就是 javac,而 JIT 和 AOT 编译器则由 JVM 和特定工具(如 GraalVM)在后台自动管理。了解它们的区别和工作原理,有助于你在不同场景下做出最合适的技术选型和性能调优。
结语:正如我们所见,Java 的编译绝非一次从
javac到字节码的简单转换。它是一个多层次、动态优化的精密系统。从确保跨平台性的javac,到追求极致性能的 JIT,再到为云原生而生的 AOT,每一种编译器都在其舞台上扮演着关键角色。理解它们,不仅能让我们更深入地掌握 Java 这门语言,更能为我们在不同场景下做出正确的技术选型和性能优化提供坚实的基础。