Oracle GraalVM 发布,启动快了46.42%

GraalVM发布了与JDK20对应的版本,包含对JDK17和JDK20的支持。建议使用JDK20以获得最新功能。此版本的一大变化是GraalVMJDK下载已内置NativeImage,无需额外安装。此外,提供了稳定的下载URL,简化了下载过程,特别是在Linuxx86-64平台上。
https://www.oracle.com/java/technologies/downloads/#graalvmjava20-windows

centos版本的下载地址:

wget https://download.oracle.com/graalvm/20/latest/graalvm-jdk-20_linux-x64_bin.tar.gz

GraalVM 现在有一个与 JDK 版本命名相匹配的新命名方案 - 例如,这个版本包括两个 GraalVM 版本:GraalVM for JDK 17 和 GraalVM for JDK 20。这两个版本都基于主分支,并包含新功能,因此您可以选择最适合您的JDK版本。然而,我们建议您转移到JDK 20 - 正如我们之前宣布的那样,我们正在过渡到一个新的发布计划,在这个计划中,我们将只为最新的 Java 版本发布 GraalVM(就像 Oracle JDK 一样)。这样,您也可以同时使用所有最新的 Java 和 GraalVM 功能。本次发布的另一个重大更新是 GraalVM JDK 下载现在包括 Native Image!不需要将 Native Image 作为单独的组件下载或运行 gu install native-image,它一开始就已经准备好了。下载 Oracle GraalVM 也变得更加容易,我们现在有稳定的可脚本化下载 URL,因此您可以直接使用它们进行下载,或者在您的脚本和Docker文件中使用。例如,要在Linux x86-64上获取适用于JDK 20的Oracle GraalVM,请运行以下命令:

Fatal error: com.oracle.svm.core.util.VMError$HostedError: com.oracle.svm.core.util.VMError$HostedError: New Method or Constructor found as reachable after static analysis: public org.springframework.boot.ssl.SslBundle org.springframework.boot.http.client.reactive.ClientHttpConnectorSettings.sslBundle() at org.graalvm.nativeimage.builder/com.oracle.svm.core.util.VMError.shouldNotReachHere(VMError.java:72) at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageGenerator.doRun(NativeImageGenerator.java:696) at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageGenerator.run(NativeImageGenerator.java:535) at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageGeneratorRunner.buildImage(NativeImageGeneratorRunner.java:403) at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageGeneratorRunner.build(NativeImageGeneratorRunner.java:580) at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageGeneratorRunner.main(NativeImageGeneratorRunner.java:128) Caused by: com.oracle.svm.core.util.VMError$HostedError: New Method or Constructor found as reachable after static analysis: public org.springframework.boot.ssl.SslBundle org.springframework.boot.http.client.reactive.ClientHttpConnectorSettings.sslBundle() at org.graalvm.nativeimage.builder/com.oracle.svm.core.util.VMError.shouldNotReachHere(VMError.java:68) at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.reflect.ReflectionFeature.getOrCreateAccessor(ReflectionFeature.java:121) at org.graalvm.nativeimage.builder/com.oracle.svm.core.reflect.target.ExecutableAccessorComputer.transform(ExecutableAccessorComputer.java:43) at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.substitute.ComputedValueField.computeValue(ComputedValueField.java:343) at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.substitute.ComputedValueField.readValue(ComputedValueField.java:313) at org.graalvm.nativeimage.builder/com.oracle.svm.core.meta.ReadableJavaField.readFieldValue(ReadableJavaField.java:38) at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.ameta.AnalysisConstantReflectionProvider.readValue(AnalysisConstantReflectionProvider.java:97) at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.meta.HostedField.readValue(HostedField.java:161) at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.image.NativeImageHeap.addObjectToImageHeap(NativeImageHeap.java:439) at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.image.NativeImageHeap.addObject(NativeImageHeap.java:295) at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.image.NativeImageHeap.processAddObjectWorklist(NativeImageHeap.java:598) at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.image.NativeImageHeap.addTrailingObjects(NativeImageHeap.java:198) at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageGenerator.doRun(NativeImageGenerator.java:678) ... 4 more
最新发布
07-05
在使用 GraalVM Native Image 构建 Spring Boot 应用时,如果遇到 `HostedError` 错误,例如: ``` Fatal error: com.oracle.svm.core.util.VMError$HostedError: New Method or Constructor found as reachable after static analysis org.springframework.boot.ssl.SslBundle ``` 这通常意味着 GraalVM Native Image 在静态分析阶段遗漏了某些运行时需要的类、方法或构造函数,而在构建过程中动态检测到了它们的存在。GraalVM 的 AOT(提前编译)机制依赖于静态分析来确定哪些代码是可达的,而某些框架(如 Spring Boot)通过反射或代理机制加载类和方法,导致这些元素未被静态分析捕获。 ### 根本原因 Spring Boot 2.7 引入了 `SslBundle` 抽象,用于统一处理 SSL 配置和证书管理。由于 `SslBundle` 是通过工厂类 `SslBundles` 动态创建的,并且可能涉及反射调用,因此 GraalVM Native Image 的静态分析无法自动识别其所有依赖项 [^4]。 ### 解决方案 #### 1. 使用配置文件排除 HostedError 可以通过提供 JSON 配置文件来告诉 GraalVM Native Image 提前注册某些类作为可达的。可以使用 `native-image-maven-plugin` 或 `native-image-configure` 工具生成这些配置。 ```xml <!-- pom.xml --> <plugin> <groupId>org.graalvm.buildtools</groupId> <artifactId>native-maven-plugin</artifactId> <configuration> <jvmArgs> <arg>-agentlib:native-image-agent=config-output-dir=src/main/resources/META-INF/native-image</arg> </jvmArgs> </configuration> </plugin> ``` 运行测试应用后,会在指定目录下生成 `reflect-config.json` 和其他配置文件,其中包含反射调用所需的类信息。将这些配置文件纳入构建流程中即可避免 `HostedError` [^4]。 #### 2. 手动添加反射配置 若自动生成的配置仍不完整,可手动在 `reflect-config.json` 中添加如下内容以确保 `SslBundle` 及其相关类被正确识别: ```json [ { "name": "org.springframework.boot.ssl.SslBundle", "allDeclaredConstructors": true, "allPublicConstructors": true, "allDeclaredMethods": true, "allPublicMethods": true }, { "name": "org.springframework.boot.ssl.pem.PemSslBundle", "allDeclaredConstructors": true } ] ``` 将上述内容保存为 `src/main/resources/META-INF/native-image/reflect-config.json`,并在构建时启用该配置。 #### 3. 使用注解方式排除特定类 对于某些特定类,也可以使用 `@ReflectiveAccess` 注解(需引入 Spring Native 支持)来显式声明需要保留的反射访问权限。此方法适用于细粒度控制特定组件的行为 [^4]。 #### 4. 升级 Spring Boot 与 Spring Native 版本 确保使用的是最新版本的 Spring Boot(建议 3.x)和 Spring Native(0.12+)。Spring Native 对 GraalVM 的支持不断改进,新版本中可能已修复此类问题。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值