一、字节码文件实现跨平台性:
- Java虚拟机不和任何语言绑定,它只关心"字节码"文件,它与特定的二进制文件是关联的
- 无论何种语言,只要编译结是正确的字节码文件,那么这种语言就可以在Java虚拟机上执行

二、前端编译器:
2.1.前端编译器功能:
-
1.Java的前端编译器的主要任务:
负责将符合Java语法规范的Java代码转换为符合JVM规范的字节码文件,前端编译器不属于JVM

-
2.javac编译器是常见的前端编译器:
配置在path环境变量中的javac编译器是一种能够将Java源码编译为字节码的前端编译器

-
3.Javac编译器在将Java源码编译为一个有效的字节码文件过程中经历了4个步骤,分别是
词法解析、语法解析、语义解析以及生成字节码 -
4.想要一个Java程序可以正确的在jvm中运行,Java源码必须要被编译为符合JVM规范的字节码
2.2.前端编译器对比:
- 1.HotSpot VM并没有强制要求前端编译器只能使用javac来编译字节码,其实只要编译结果符合JVM规范都可以被JVM所识别即可
- 2.在Java的前端编译器领域,除了javac之外,还有内置在
Eclipse中的ECJ(Eclipse Compiler for Java)编译器。和Javac的全量式编译不同,ECJ是一种增量式编译器- 在Eclipse中,当开发人员编写完代码后,使用"Ctrl+s"快捷键时,
ECJ编译器所采取的编译方案:是把未编译部分的源码逐行进行编译,而非每次都全量编译。因此ECJ的编译效率会比javac更加迅速和高效,当然编译质量和javac相比大致还是一样的。 - ECJ不仅是Eclipse的默认内置前端编译器,在Tomcat中同样也是使用ECJ编译器来编译jsp文件。由于ECJ编译器是采用GPLv2的开源协议进行源代码公开,所以,大家可以登录eclipse官网下载ECJ编译器的源码进行二次开发。·默认情况下,
Intellij IDEA使用javac编译器(还可以自己设置为Aspect]编译器ajc)
- 在Eclipse中,当开发人员编写完代码后,使用"Ctrl+s"快捷键时,
- 3.
前端编译器并不会直接涉及编译优化等方面的技术,而是将这些具体优化细节移交给HotSpot的JIT编译器负责
三、后端编译器
3.1.后端编译器位置:

3.2.后端编译器功能:
JVM中的后端编译器主要指运行时编译器(JIT编译器),它负责将字节码动态编译为本地机器码,以提升程序执行效率
- 热点代码检测(HotSpot Detection)
- 机制:通过计数器(方法调用次数、循环回边次数)或采样监控代码执行频率
- 目的:识别频繁执行的代码("热点代码"),触发编译优化,避免对冷门代码过度编译。
- 分层编译(Tiered Compilation)
- C1(Client Compiler):快速编译,进行简单优化(如方法内联、常量传播),适合短期运行的客户端程序
- C2(Server Compiler):深度优化(如逃逸分析、循环展开),生成高效机器码,适合长时间运行的服务器应用。
- 分层策略:
- 先由C1快速编译,再对热点代码由C2优化,平衡启动性能与长期吞吐量
- 编译优化技术 :
- 方法内联(Method Inlining):消除方法调用开销,合并小方法
- 逃逸分析(Escape Analysis):若对象未逃逸方法,则优化为栈分配或标量替换,减少GC压力
- 循环优化:包括循环展开(减少迭代次数)、循环剥离(分离复杂逻辑)等
- 锁消除(Lock Elision):若锁对象未共享,则移除同步操作
- 常量折叠(Constant Folding):编译期计算常量表达式
- 虚方法内联(Virtual Call Inlining):通过类型推断内联多态方法调用