千家信息网

GraalVM native-image编译后quarkus超音速启动的示例分析

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,这篇文章给大家分享的是有关GraalVM native-image编译后quarkus超音速启动的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。前言quarkus号
千家信息网最后更新 2026年11月02日GraalVM native-image编译后quarkus超音速启动的示例分析

这篇文章给大家分享的是有关GraalVM native-image编译后quarkus超音速启动的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

    前言

    quarkus号称超音速亚原子JAVA为Graalvm量身定制的java堆栈,是否名副其实呢?下面就来看看真实情况如何。动手前先简单介绍下Graalvm,它是oracle出品的一个AOT编译器,可以将应用程序编译成本地映像,通俗的说可以将java编译成机器可直接执行的程序,可以参考go语言的编译输出产物。而且graalvm不仅仅支持java,对其他语言也有很好的支持。下面先看一张quarkus的java应用程序在传统的vm下面和graalvm下面的资源占用图。

    graalvm:https://www.graalvm.org/

    native-image编译配置

                        native                                                native                                                                                                    io.quarkus                        quarkus-maven-plugin                        ${quarkus-plugin.version}                                                                                                                        native-image                                                                                                    true                                    true                                                                                                                                                    org.apache.maven.plugins                        maven-failsafe-plugin                        ${surefire-plugin.version}                                                                                                                        integration-test                                    verify                                                                                                                                            ${project.build.directory}/${project.build.finalName}-runner                                        org.jboss.logmanager.LogManager                                        ${maven.home}                                                                                                                                                                                    

    在pom文件中使用profile新增了一个native编译环境,引入了quarkus的编译插件,并激活了native的编译。实际上,这个插件只会帮你将graalvm编译指令编排好,graalvm的环境还需要你自己搭建,quarkus每个迭代的版本会针对特定的graalvm版本做优化,所以不是所有的版本都相互兼容的。比如quarkus1.5.final版本兼容graalvm19.x版本,最新的quarkus1.6.final支持graalvm20.1.1版本,各版本下载地址,下载下来后,和配置java环境一样,将目录添加到GRAALVM_HOME环境变量中即可,如:

    最终quarkus的maven编译插件会帮我们生成一条这样的graalvm编译指令,如:

    F:\runtime\graalvm-ce-java8-19.3.1\bin\native-image.cmd -J-Dsun.nio.ch.maxUpdateArraySize=100 -J-Djava.util.logging.manager=org.jboss.logmanager.LogManager -J-DCoordinatorEnvironmentBean.transactionStatusManagerEnable=false -J-Dvertx.logger-delegate-factory-class-name=io.quarkus.vertx.core.runtime.VertxLogDelegateFactory -J-Dvertx.disableDnsResolver=true -J-Dio.netty.leakDetection.level=DISABLED -J-Dio.netty.allocator.maxOrder=1 -J-Duser.language=zh -J-Dfile.encoding=UTF-8 --initialize-at-run-time=java.net.Inet4Address -H:+TraceClassInitialization --initialize-at-build-time= -H:InitialCollectionPolicy=com.oracle.svm.core.genscavenge.CollectionPolicy$BySpaceAndTime -H:+JNI -jar kk-org-thansfer-admin-1.0-SNAPSHOT-runner.jar -H:FallbackThreshold=0 -H:+ReportUnsupportedElementsAtRuntime -H:+ReportExceptionStackTraces -H:+AddAllCharsets -H:+IncludeAllTimeZones -H:EnableURLProtocols=http,https --enable-all-security-services -H:-UseServiceLoaderFeature -H:+StackTrace kk-org-thansfer-admin-1.0-SNAPSHOT-runner

    以上就是quarkus集成graalvm编译环境的所有内容了,但是graalvm在windows系统下的编译并不友好,博主尝试过很多方法,包括通过docker容器挂载编译,都宣告失败了,所以如果你也有同样的问题,看下我们的异常是否一样:

    [ERROR] Failed to execute goal io.quarkus:quarkus-maven-plugin:1.6.0.Final:native-image (default) on project kk-org-thansfer-admin: Failed to generate native image: io.quarkus.builder.BuildException: Build failure: Build failed due to errors[ERROR]    [error]: Build step io.quarkus.deployment.pkg.steps.NativeImageBuildStep#build threw an exception: java.lang.RuntimeException: Failed to build native image[ERROR]    at io.quarkus.deployment.pkg.steps.NativeImageBuildStep.build(NativeImageBuildStep.java:366)[ERROR]    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)[ERROR]    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)[ERROR]    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)[ERROR]    at java.lang.reflect.Method.invoke(Method.java:498)[ERROR]    at io.quarkus.deployment.ExtensionLoader$2.execute(ExtensionLoader.java:932)[ERROR]    at io.quarkus.builder.BuildContext.run(BuildContext.java:277)[ERROR]    at org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)[ERROR]    at org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:2046)[ERROR]    at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1578)[ERROR]    at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1452)[ERROR]    at java.lang.Thread.run(Thread.java:745)[ERROR]    at org.jboss.threads.JBossThread.run(JBossThread.java:479)[ERROR] Caused by: java.lang.RuntimeException: Image generation failed. Exit code: -1073741819[ERROR]    at io.quarkus.deployment.pkg.steps.NativeImageBuildStep.imageGenerationFailed(NativeImageBuildStep.java:416)[ERROR]    at io.quarkus.deployment.pkg.steps.NativeImageBuildStep.build(NativeImageBuildStep.java:344)[ERROR]    ... 12 more[ERROR] -> [Help 1]

    不过别慌,博主还没放弃,下面通过docker多段镜像编排解决问题,上面贴的pom配置代码别删

    docker多段镜像编排

    ## Stage 1 : build with maven builder image with native capabilitiesFROM quay.io/quarkus/centos-quarkus-maven:20.1.0-java8 AS buildCOPY pom.xml /usr/src/app/COPY src /usr/src/app/srcUSER rootRUN chown -R quarkus /usr/src/appUSER quarkusRUN mvn -f /usr/src/app/pom.xml -Pnative clean install -Dmaven.test.skip=true -Denv=DEV## Stage 2 : create the docker final imageFROM registry.access.redhat.com/ubi8/ubi-minimalWORKDIR /work/COPY --from=build /usr/src/app/target/*-runner /work/application# set up permissions for user `1001`RUN chmod 775 /work /work/application \  && chown -R 1001 /work \  && chmod -R "g+rwX" /work \  && chown -R 1001:root /workEXPOSE 8080USER 1001CMD ["./application", "-Dquarkus.http.host=0.0.0.0"]

    第一阶段,基于quarkus的centos基础镜像,里面内置了graalvm环境,然后我们只需要将代码和pom配置copy进系统里,同镜像里的环境编译成native-image,然后第二段,基于小红帽的基础镜像运行环境,将构建的产物copy进去,如此即完成了docker容器的构建。不过这样的方式构建,所有的依赖都是即时下载的,对本地网络要求会比较高,整体编译时长会比较长。网络稍微一抖动就会编译失败,所以最好在pom里配置下国内比较快的maven仓库,比如阿里云的maven仓库。还有,在graalvm编译阶段,会非常的吃内存,这个时候它会加载所有的代码用于静态分析,这块内容阿里巴巴的jvm团队有做过优化,后面可能会来做一个分享。

    可能遇到的问题,graalvm是在编译时初始化的,所有有些依赖如果只能运行时初始化,可以在quarkus中添加如下的配置:

    quarkus.native.additional-build-args=--initialize-at-run-time=java.net.Inet4Address

    效果展示

    docker编译虽然会比较慢,但是最后还是成功了,下面展示下quarkus的神奇之处,当镜像成功运行起来那一刻,博主还是按捺不住心中的喜悦之情,他么的跟中了500W似的,注意,博主的这个程序不是简单的hello,而是有数据源又接口的生产级CURD的程序。

    native-image启动时间

    jvm下的启动时间

    除了启动时间提升了n倍之外,内存占用也是非常感人,native-image在容器里面总内存占用才90M,而在jvm下面应用的内存占用就要300M左右了。即使如此,相比于spring boot的动辄1G的内存占用,也已经表现的十分的优秀了。

    感谢各位的阅读!关于"GraalVM native-image编译后quarkus超音速启动的示例分析"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

    编译 环境 版本 镜像 配置 内存 程序 内容 超音速 超音 分析 代码 容器 插件 时间 问题 应用 支持 运行 示例 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 广州大一互联网络科技有限公司 广州紫鲸互联网科技有限公司 金融科技还是互联网 北京互联网科技有限公司 互联网金融公司科技 互联网 的科技创新 善班互联网科技有限公司 火传媒上海互联网科技 富国互联网科技创新基金 广州优美互联网科技 移动互联网科技股 浙江互联网科技研学营 互联网科技公司有风险吗 电子科技大学互联网创业大赛 乌苏新华互联网科技做什么的 洛阳共同富裕互联网科技有限公司 科技互联网海报 福州德业互联网科技 中国互联网公司的科技投入 众联互联网络科技 科技互联网公司装修 上海互联网科技有限公司 极限挑战互联网科技 哈尔滨新华互联网科技学院 彤创互联网科技有限公司 河南住房之家互联网科技 工业互联网展湾科技股份有限公司 上海钢联属于互联网科技股吗 互联网科技创新方面的资料 银川新华互联网科技学校招聘
    0