超越字节码:探索 JVM、JIT 与性能之间的关系

主要观点:在计算中,高级语言编写的程序执行需将源代码编译为低级或原生语言,Java 采用 Ahead-of-Time(AOT)编译生成中间二进制(字节码),在执行时由 Java 虚拟机(JVM)翻译为原生机器码,以实现“Write-Once-Run-Anywhere”。JVM 运行时会确定热点代码进行优化,Just-In-Time(JIT)编译器在运行时将字节码编译为原生代码并缓存,JIT 有 C1 和 C2 两种编译器,还有分层编译,可根据使用和复杂度进行不同优化级别的编译,同时存在去优化情况,JIT 和分层编译默认启用,可通过配置禁用或调整,JDK Hotspot 和 GraalVM JIT 有不同特点和优势。
关键信息

  • Java 的 AOT 生成字节码,JVM 执行时翻译为原生码。
  • JIT 确定热点代码并编译优化。
  • JIT 编译器有 C1(客户端编译器)和 C2(服务器编译器)。
  • 分层编译有不同级别,从解释代码到不同程度的编译。
  • 存在去优化情况,需注意避免频繁切换。
  • 可通过配置调整 JIT 和分层编译相关参数。
    重要细节
  • JVM 启动时仅编译频繁调用的方法,其他方法根据使用情况稍后编译或不编译。
  • C1 编译器编译阈值低,适合快速应用启动;C2 编译器阈值高,编译前的分析信息更丰富,代码优化性能高。
  • 分层编译各级别特点及代码编译情况,如 Level 0 无优化,Level 1 优化简单方法等。
  • 可通过特定参数调整 JIT 和分层编译的相关阈值等配置。
  • GraalVM JIT 与 JDK HotSpot JIT 的核心区别,如 GraalVM 用 Graal 编译器及支持多语言等。
阅读 181
0 条评论