searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

GraalVM介绍及AOT编译

2024-12-17 09:12:10
1
0

GraalVM是什么?

        GraalVM是Oracle推出的基于Java开发的开源的高性能多语言运行时平台,即是一个高性能的JDK,旨在提供跨语言的互操作性、提高应用程序性能。 它的一个重要特性就是AOT(Ahead-Of-Time,提前编译)编译功能,它能够将Java应用程序直接编译成二进制可执行文件,因此,Java程序运行时不需要使用JVM,比如在Linux发行版系统上进行AOT编译生成二进制可执行文件后,只需要将此二进制可执行文件复制到任意的Linux发行版系统上都可直接执行此Java程序。 GraalVM是Java静态编译技术的一个实现。

Java静态编译技术的诞生

       使用JVM启动Java程序时,冷启动开销较大的问题长期存在,难以从根本上解决。在云原生应用的场景中,其负面影响尤为突出。如果应用的冷启动时间超过了其实际执行的时间,用户还要为不必要的启动耗时付出无费用,用户是难以有良好的使用体验。Java静态编译技术是一个兼顾了Java已有生态又可以彻底解决冷启动问题的技术方案。

GraalVM优势

1.程序启动速度快

通过GraalVM编译得到的可执行文件,不再需要经过解释器和JIT编译,既避免了解释执行的低效,因此可以实现极速启动。

2.打包尺寸更小

由于可执行文件的运行不需要JVM虚拟机支持,在打包docker镜像时可以选择没有JVM虚拟机的更小的基础镜像,因此可以得到更小的打包尺寸。

3.内存消耗低

JVM的运行也需要消耗一部分内存,去掉JVM后应用程序的内存占用可以得到大幅度降低。

GraalVM劣势

1.编译时间长,内存和CPU时间占用率高

静态分析是资源密集型计算,需要消耗大量的内存和CPU时间。一般来说,人们对离线编译的资源消耗的容忍度较高,但过长的时间会给用户带来开发,测试,验证和部署等过程的效率方面的顾虑,从而限制了可能的应用场景。

2.动态特性支持不友好

静态分析对反射的分析能力非常有限,对于实际中存在的大量反射GraalVM只能通过额外配置的方式加以解决。当代码发生变化时,反射信息就有可能发生变化,配置也需要随之变化,由此增加了维护成本和适配难度,而且配置难以覆盖全部可能性,如有遗漏则会造成运行时错误,这对静态编译的广泛应用也是一大阻碍。

3.运行时性能低于经过JIT编译后基于HotSpot运行的Java程序

虽然启动性能非常好,而且静态编译,也依据静态分析的结果执行了各种编译优化,但是因为缺少运行时的程序动态执行画像数据,不能执行更有针对性的JIT编译优化。因此,虽然编静态编译程序的性能表现稳定,但是没有JIT编译后的Java程序的性能高。

4.程序调试困难

因为GraalVM静态编译的产物是可执行文件,而不是再是Java的字节码,所以静态编译的调试方法与传统的Java程序是完全不同的,需要用本地代码的调试器GDB(GNU Debugger)进行调试,这一本质区别决定了静态编译的调试体验无法达到与传统Java程序的相同水平,这也是静态编译的局限性之一。

AOT编译步骤

1.环境要求:Centos 7 系统、安装Maven、安装GraalVM、安装C语言编译器(gcc、glibc-devel、zlib-devel)

2.Java服务改造:Springboot升级到3以上、对应的jar包升级至支持版本、添加插件plugin

<plugin>
<groupId>org.graalvm.buildtools</groupId>
<artifactId>native-maven-plugin</artifactId>
<version>0.9.28</version>
<extensions>true</extensions>
<configuration>
<!-- 镜像名称 -->
<imageName>data-survey-demo</imageName>
<!-- 启动类 -->
<mainClass>cn.chinatelecom.datawings.survey.app.DataSurveyApplication</mainClass>
<agent>
<enabled>true</enabled>
</agent>
</configuration>
</plugin>

3.静态编译过程:将代码获取至服务器上、执行编译命令mvn -Pnative native:compile

4.编译结果:得到可执行文件

 

 

0条评论
0 / 1000
l****n
4文章数
0粉丝数
l****n
4 文章 | 0 粉丝
l****n
4文章数
0粉丝数
l****n
4 文章 | 0 粉丝
原创

GraalVM介绍及AOT编译

2024-12-17 09:12:10
1
0

GraalVM是什么?

        GraalVM是Oracle推出的基于Java开发的开源的高性能多语言运行时平台,即是一个高性能的JDK,旨在提供跨语言的互操作性、提高应用程序性能。 它的一个重要特性就是AOT(Ahead-Of-Time,提前编译)编译功能,它能够将Java应用程序直接编译成二进制可执行文件,因此,Java程序运行时不需要使用JVM,比如在Linux发行版系统上进行AOT编译生成二进制可执行文件后,只需要将此二进制可执行文件复制到任意的Linux发行版系统上都可直接执行此Java程序。 GraalVM是Java静态编译技术的一个实现。

Java静态编译技术的诞生

       使用JVM启动Java程序时,冷启动开销较大的问题长期存在,难以从根本上解决。在云原生应用的场景中,其负面影响尤为突出。如果应用的冷启动时间超过了其实际执行的时间,用户还要为不必要的启动耗时付出无费用,用户是难以有良好的使用体验。Java静态编译技术是一个兼顾了Java已有生态又可以彻底解决冷启动问题的技术方案。

GraalVM优势

1.程序启动速度快

通过GraalVM编译得到的可执行文件,不再需要经过解释器和JIT编译,既避免了解释执行的低效,因此可以实现极速启动。

2.打包尺寸更小

由于可执行文件的运行不需要JVM虚拟机支持,在打包docker镜像时可以选择没有JVM虚拟机的更小的基础镜像,因此可以得到更小的打包尺寸。

3.内存消耗低

JVM的运行也需要消耗一部分内存,去掉JVM后应用程序的内存占用可以得到大幅度降低。

GraalVM劣势

1.编译时间长,内存和CPU时间占用率高

静态分析是资源密集型计算,需要消耗大量的内存和CPU时间。一般来说,人们对离线编译的资源消耗的容忍度较高,但过长的时间会给用户带来开发,测试,验证和部署等过程的效率方面的顾虑,从而限制了可能的应用场景。

2.动态特性支持不友好

静态分析对反射的分析能力非常有限,对于实际中存在的大量反射GraalVM只能通过额外配置的方式加以解决。当代码发生变化时,反射信息就有可能发生变化,配置也需要随之变化,由此增加了维护成本和适配难度,而且配置难以覆盖全部可能性,如有遗漏则会造成运行时错误,这对静态编译的广泛应用也是一大阻碍。

3.运行时性能低于经过JIT编译后基于HotSpot运行的Java程序

虽然启动性能非常好,而且静态编译,也依据静态分析的结果执行了各种编译优化,但是因为缺少运行时的程序动态执行画像数据,不能执行更有针对性的JIT编译优化。因此,虽然编静态编译程序的性能表现稳定,但是没有JIT编译后的Java程序的性能高。

4.程序调试困难

因为GraalVM静态编译的产物是可执行文件,而不是再是Java的字节码,所以静态编译的调试方法与传统的Java程序是完全不同的,需要用本地代码的调试器GDB(GNU Debugger)进行调试,这一本质区别决定了静态编译的调试体验无法达到与传统Java程序的相同水平,这也是静态编译的局限性之一。

AOT编译步骤

1.环境要求:Centos 7 系统、安装Maven、安装GraalVM、安装C语言编译器(gcc、glibc-devel、zlib-devel)

2.Java服务改造:Springboot升级到3以上、对应的jar包升级至支持版本、添加插件plugin

<plugin>
<groupId>org.graalvm.buildtools</groupId>
<artifactId>native-maven-plugin</artifactId>
<version>0.9.28</version>
<extensions>true</extensions>
<configuration>
<!-- 镜像名称 -->
<imageName>data-survey-demo</imageName>
<!-- 启动类 -->
<mainClass>cn.chinatelecom.datawings.survey.app.DataSurveyApplication</mainClass>
<agent>
<enabled>true</enabled>
</agent>
</configuration>
</plugin>

3.静态编译过程:将代码获取至服务器上、执行编译命令mvn -Pnative native:compile

4.编译结果:得到可执行文件

 

 

文章来自个人专栏
GraalVM
1 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
0
0