@levinzhang
2022-08-20T13:27:42.000000Z
字数 2154
阅读 367
by
GraalVM以将Java编译成较小的原生可执行文件而闻名,这些原生可执行文件的启动速度要比传统Java程序快得多。22.2版本通过引入针对Java库的配置仓库解决了一个长期存在的痛点问题。原生Java编译会使用更少的内存,GraalVM分发版在Apple Silicon运行得更好,并且文件体积更小。
GraalVM以将Java编译成较小的原生可执行文件而闻名,这些原生可执行文件的启动速度要比传统Java程序快得多。Oracle Labs发布的22.2版本通过引入针对Java库的配置仓库解决了一个长期存在的痛点问题。原生Java编译会使用更少的内存,GraalVM分发版在Apple Silicon运行得更好,并且文件体积更小。
原生编译使Java在云中更具竞争力。如今,Quarkus、Micronaut和Helidon都支持在生产环境中使用GraalVM。Spring 6和Spring Boot 3计划在今年年底实现这一目标。InfoQ针对这个话题,曾经发布过一个系列文章。
GraalVM为什么需要配置仓库呢?与常规的Java不同,原生Java的可执行文件在运行时无法动态加载新的代码。这就是为什么GraalVM的原生编译器Native Image需要知道运行时用到的所有类、方法和字段的原因(“封闭性假设”)。Native Image通过可达性分析能够自动进行探测。但是,鉴于Java的动态特性,比如反射和代理,会隐藏一些代码,从而导致其无法被分析到。使用这些动态特性的应用和库必须向Native Image提供配置线索(hint),否则它们根本无法在原生Java中运行。
到现在为止,Java开发人员必须为那些还没有提供GraalVM支持的Java框架提供这些线索信息。GraalVM 可达性元数据仓库(GraalVM Reachability Metadata Repository)有望消除这一负担:GraalVM 22.2会从这个新的中央仓库中读取线索信息(已经被重命名为“可达性元数据”)。它来源于GraalVM、Micronaut、Spring Boot和Quarkus的协作,并且欢迎大家为其提供贡献。
现在,原生镜像在编译过程中使用的RAM会更少。例如,构建Spring PetClinic应用仅需要使用2GB。内存受限的CI环境或云服务,如GitHub Actions,将会在这种资源节省中收益。
Native Image不仅可以编译像Java、Scala和Kotlin这样的JVM语言,还能编译JavaScript、Python、Ruby、R和WebAssembly。在这个版本中,Python有了一个实验性的字节码解释器,启动速度更快,性能也更好。JavaScript与其他语言的对象之间的互操作性也得到了改善。
GraalVM发行版的文件更小了,因为它更加模块化,不再包含JavaScript和LLVM的运行时以及VisualVM。在Linux上,这使得Java 17 GraalVM发行版的大小减少了42%,从431 MB减少到了251 MB。
随着22.2版本的发布,原生的Java可执行文件可以将内存堆转储到文件中,就像传统的Java应用那样。这可以通过三种方式实现:调用运行时API、向应用发送OS信号或者在启动后立即进行(这种方式同时会退出应用)。该版本还包含编译过程中更快的逃逸分析、在Linux上改善了调试功能并且为长时间的循环提供了实验性的strip挖掘优化(strip挖掘会将一个长时间运行的循环转换为一个嵌套的循环,其中内部主体运行的时间是有限的。这样就可以把安全点放在外循环中,减少安全点轮询的开销。——译者注)。
现在,商业的GraalVM企业版提供了对Apple Silicon的实验性支持,在今年4月发布的GraalVM 22.1中,社区版就包含了这种支持。其他GralVM组件现在也能在这两个版本中支持Apple Silicon,如JavaScript、LLVM、Ruby、Java on Truffle VM和WebAssembly。企业版还可以在原生可执行文件中包含CycloneDX格式的软件物料清单(Software Bill of Materials,SBOM)。
OpenJDK管理着Java语言的演进。但GraalVM不是OpenJDK的一部分,因为它属于Oracle Labs。不过,由于OpenJDK在 Leyden项目中推迟了其原生Java计划,GraalVM仍将是未来几年内原生Java的唯一可选方案。
作为一名全栈 Java 开发人员,Karsten Silz 在欧洲和美国工作了23年。2004年,他在美国合伙创立了一家提供软件产品的初创公司。Karsten领导了13年的产品开发,并在公司成功出售后离开。自2017年以来,他一直在德国和英国做承包商(Spring Boot、Angular、Flutter)。2020年,他作为CTO共同创立了SaaS初创公司“Your Home in Good Hands”。