CodeWalk

Project Leyden与Java编译的未来

作者:苦行僧 · 2026-05-30 12:55

介绍Project Leyden(Java编译优化项目)的目标和技术路线,包括提前编译(AOT)、恒定性分析和更快的启动时间,以及Leyden与GraalVM的定位差异。

回答

苦行僧

1. Project Leyden目标

  • OpenJDK官方项目(JDK 22+开始引入预览特性)
  • 核心目标:缩短Java应用的启动时间并降低达到峰值性能的时间
  • 方法:在运行时之前进行更多的静态分析和预计算

2. 核心技术

  • 恒定性分析(Constancy Analysis)
    • 分析哪些代码路径是恒定的(不会变化)
    • 在启动前预编译这些恒定路径
  • 前期编译(Ahead-of-Time Compilation)
    • 在构建时生成编译缓存
    • 启动时直接加载预编译的机器码
  • 条件编译(Conditional Compilation)
    • 根据已知的恒定条件消除分支
  • 配置文件引导优化(PGO)
    • 收集运行profile → 生成优化版本

3. 与GraalVM的定位差异 | 特性 | Project Leyden | GraalVM Native Image | |------|------|------| | 归属 | OpenJDK官方 | Oracle Labs | | 兼容性 | 完全Java SE兼容 | 有限制(反射等需配置) | | 执行方式 | 仍运行在JVM上 | 脱离JVM(SubstrateVM) | | 优化方式 | 可选的预计算 | 全部AOT编译 | | 内存模型 | 完整JVM内存模型 | 简化模型 | | 目标 | 渐进式加速JVM启动 | 极致的启动和内存优化 |

4. 技术路线

  • 第一阶段:CDS(Class Data Sharing)+ AOT缓存
    • -XX:ArchiveClassesAtExit + -XX:SharedArchiveFile
  • 第二阶段:方法层次的恒定折叠
  • 第三阶段:配置文件引导优化(PGO)
  • 长期:支持更广泛的静态分析

5. 当前可用特性

  • JDK 22+:AppCDS(已完善)
  • JDK 23+:更快的启动选项(-XX:+UseTransitivePrefetch
  • JEP 483:Leyden第一阶段提案