[5-01-01].第04节:初识字节码文件 - 字节码文件作用

JVM学习大纲


一、字节码文件实现跨平台性:

  • 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)
  • 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):通过类型推断内联多态方法调用

相关推荐
饺子大魔王的男人1 分钟前
远程调试总碰壁?局域网成 “绊脚石”?Remote JVM Debug与cpolar的合作让效率飙升
网络·jvm
天“码”行空10 小时前
java面向对象的三大特性之一多态
java·开发语言·jvm
独自破碎E15 小时前
JVM的内存区域是怎么划分的?
jvm
期待のcode17 小时前
认识Java虚拟机
java·开发语言·jvm
leaves falling20 小时前
一篇文章深入理解指针
jvm
linweidong20 小时前
C++ 中避免悬挂引用的企业策略有哪些?
java·jvm·c++
曹轲恒20 小时前
JVM中的直接内存
jvm
BHXDML21 小时前
JVM 深度理解 —— 程序的底层运行逻辑
java·开发语言·jvm
隐退山林1 天前
JavaEE:多线程初阶(二)
java·开发语言·jvm
期待のcode1 天前
Java虚拟机堆
java·开发语言·jvm