GraalVM新一代通用多语言高性能虚拟机

GraalVM新一代通用多语言高性能虚拟机-CSDN博客

1.GraalVM是什么

GraalVM是 Oracle 开源的一款通用虚拟机产品,官方称之为 Universal GraalVM,是新一代的通用多语言高性能虚拟机。

2.为什么要用GraalVM

GraalVM 与传统的虚拟机不同,它不仅支持 Java 语言,还支持其他编程语言,如JavaScript、 Python、 Ruby 和R等。

GraalVM 使用一种称为“本机图像”的技术,将应用程序编译成本机可执行文件,以提高性能和降低内存使用量。

总之,GraalVM 提供了一个全面的解决方案,使开发人员能够在单个虚拟机中构建和运行多种语言应用程序,从而提高应用程序的性能和效率。

3.GraalVM特征

Graalvm的特点,主要体现在如下方面:

3.1 高性能

Graalvm主要体现在启动高,省内存

3.2 云原生

想达到的效果是部署java项目时,不用先安装idk,直接在目标机器运行。

3.3 通晓多语言

除了运行基于Java和JVM的语言之外,GraalVM的语言实现框架(Trufle) 还可以在M上运行JavaScript,Ruby,Python和许多其他流行语言。

使用GraalVM Truffle,Java和其他支持的语言可以直接相互操作,并在同一内存空间中来回传递数据。

4.本地部署试用

4.1 Windows

4.1.1 JDK下载

Download GraalVM

4.1.2 本地Java版本

4.1.3 低版本IEDA 版本不支持JDK17

4.1.4 安装IntelliJ IDEA 2023.2.5

4.1.4.1 之前安装过破解版无法启动

idea.bat > out.log 2>&1

4.1.4.2 根据日志查看本地配置文件
4.1.4.2.1 缓存目录配置文件

4.1.4.2.2 安装目录配置文件

4.1.4.3 注释javaagent

注:缓存目录&安装目录配置文件均需处理

注释掉该行配置,IDEA正常启动!

4.1.5 使用graalvm-jdk-17

4.1.6 本地服务启动

4.1.7 使用启动graalvm-jdk-17业务服务

4.2 Linux TODO

4.3 构建比对(master分支)

4.3.1 使用jdk 1.8构建

4.3.1.1 构建时间(2分08秒)

4.3.1.2 jar文件size(96475KB)

4.3.2 使用graalvm-jdk-17构建

4.3.2.1 构建时间(1分45秒)

4.3.2.1 jar文件size(96475KB)

4.4 构建比对(jdk17-dev分支)

4.4.1 构建时间(1分37秒)

4.4.2 jar文件size(109568KB)

4.4.3 Nacos服务启动(1ms)

5.构建Native镜像

5.1 什么是Native镜像

原生镜像是 Java 应用程序的独立可执行文件。我们不再需要创建可执行 jar,也不需要 JVM 来运行它。

由于不涉及 JVM,我们失去了动态类加载、延迟加载、反射、代理类等概念。

那么 Spring Boot 应用程序是如何工作的呢?

要执行应用程序,运行应用程序所需的所有信息都必须在构建期间已知。在构建期间,使用提前处理 (AOT) 从“main”方法入口点对代码进行静态分析。这意味着任何不可访问的类都不会包含在 Native 镜像中。类路径是固定的,并且在运行时不会发生延迟加载。

在镜像创建过程中需要向 GraalVM 提供反射、资源和代理类信息等特性。为此,创建了称为提示文件的特殊 JSON 配置文件来告诉 GraalVM 如何处理它。

5.2 Native镜像优势

最重要的是应用程序的执行速度。当我们执行 Native 镜像时,Native 镜像中包含的所有内容都会加载到内存中。这有助于在运行时实现非常高的性能。

5.3 存在风险

它也有一些缺点,例如您不能使用 @profile 或使用 @ConditionalOnProperty 进行条件 bean 加载。

5.3.1 @profile

Java代码中未正式使用,但是配置文件yml文件中使用较多,影响待确定。

5.3.1 @ConditionalOnProperty

Java代码中使用较多,影响待确定。

5.4 安装native-image

5.5 构建 Native 镜像

5.5.1 构建命令

mvn native:compile -Pnative

5.5.2 构建时间(15.693秒)

5.5.3 构建内容

5.5.3.1 构建目录为空

目前看target目录只有一个objs的空目录

原因为确实依赖:

 
  1.  
    org.apache.maven.plugins:maven-site-plugin:3.12.1
  2.  
    org.codehaus.mojo:native-maven-plugin:1.0-alpha-11
 

5.5.3.2 添加依赖
 
  1.  
    <!--native-maven-plugin插件-->
  2.  
    <plugin>
  3.  
    <groupId>org.graalvm.buildtools</groupId>
  4.  
    <artifactId>native-maven-plugin</artifactId>
  5.  
    <version>0.9.28</version>
  6.  
    <configuration>
  7.  
    <imageName>${project.artifactId}</imageName>
  8.  
    <!--以pigx-register为例-->
  9.  
    <mainClass>com.alibaba.nacos.PigxNacosApplication</mainClass>
  10.  
    <buildArgs>
  11.  
    <buildArg>--no-fallback</buildArg>
  12.  
    </buildArgs>
  13.  
    </configuration>
  14.  
    </plugin>
 

5.5.4 native方式打包报错

mvn -Pnative native:compile

修改\\为/

 mvn native-image @target\tmp\native-image-10178860505172962533.args

5.5.5 使用Visual Studio 2022 版本 17.9命令行执行

5.6 镜像完成

5.6.1 通过maven构建jar

mvn -Pnative native:compile

5.6.2 通过native-image将jar构建成exe

 
  1.  
    #以pigx-register.jar为例
  2.  
    native-image -jar pigx-register.jar
 

5.6.3 可执行文件

pigx-register.jar 153MB

pigx-register.exe 7.54 MB

可行性文件仅为原来jar包 二十分之一

6.demo工程构建

6.1 生成demo工程

https://start.spring.io/

6.2 本地构建镜像

IDEA构建失败,returned non-zero result

6.3 使用x64 Native Tools Command Prompt for VS 2022

mvn -Pnative native:compile

6.4 小结

  • 构建时间较慢(5分23秒)
  • 构建镜像较大:demo-0.0.1-SNAPSHOT.jar(21.6 MB)、demo.exe(85.2 MB )
  • exe文件运行快(0.293秒)jar执行(1秒)

8.相关技术

8.1 AOT技术

GraalVM Native Images是一个利用AOT(Ahead-of-Time)技术把java程序直接编译成可执行程序的编译工具。Spring Boot从3.0版本开始支持AOT技术。

8.1.1 AOT优点

  • 编译出来的程序在运行时不再依赖JRE,同时启动速度快,资源消耗低,这对传统java程序来说都是极大的优势;
  • 同时云原生应用来说,GraalVM Native Images编译生成的程序体积很小,非常适合云原生环境,目前由于传统java程序生成的镜像中需要包含一个体积很大的JRE或JDK而经常被人诟病。

8.1.2 AOT缺点

  • 程序运行时动态调整的资源无法直接使用,例如反射、动态代理等,需要在代码中通过Hint为编译器指定;
  • 应用的classpath在编译后就固定了,不能动态调整;
  • 类不会延迟加载(lazy loading),应用启动时一次性加载完成;
  • 部分java切面(AOP)技术不支持;
  • 编译时间长;
  • 牺牲了跨平台的的优势;
  • 将提前编译的内容保存会占用更多的外存。

8.2 JIT

即时( JIT )编译(也称为动态翻译或运行时编译)是一种执行计算机代码的方式,它涉及在程序执行期间(运行时)而不是执行前进行编译。这可能包括源代码翻译,但更常见的是字节码到机器码的翻译,然后直接执行。

8.2.1 JIT优点

  • 可以根据当前硬件情况实时编译生成最优机器指令(ps. AOT也可以做到,在用户使用是使用字节码根据机器情况在做一次编译);
  • 可以根据当前程序的运行情况生成最优的机器指令序列;
  • 当程序需要支持动态链接时,只能使用JIT;
  • 可以根据进程中内存的实际情况调整代码,使内存能够更充分的利用。

8.2.2 JIT缺点

  • 编译需要占用运行时资源,会导致进程卡顿由于编译时间需要占用运行时间;
  • 对于某些代码的编译优化不能完全支持,需要在程序流畅和编译时间之间做权衡;
  • 在编译准备和识别频繁使用的方法需要占用时间,使得初始编译不能达到最高性能。

8.3 AOT与JIT

  • 在程序运行前编译,可以避免在运行时的编译性能消耗和内存消耗;
  • 可以在程序运行初期就达到最高性能;
  • 可以显著的加快程序的启动。

9.参考资料

GraalVM

pig4cloud

Native Image

native-build-tools/latest

Maven plugin for GraalVM Native Image building

Release GraalVM Community Edition 22.3.0 · graalvm/graalvm-ce-builds

为 Spring Boot 应用程序构建 Native 镜像

SpringBoot3之GraalVM之Windows详细安装及使用教程_Meta39的博客-CSDN博客

idea 2022.3启动不了 fuck_the_regulations-CSDN博客

SpringBoot3.0 Native构建_springboot native-CSDN博客

使用GraalVM native-image 编译SpringBoot3全过程_graalvm 编译_卫涛涛的博客-CSDN博客

posted @ 2025-07-30 14:05  CharyGao  阅读(517)  评论(0)    收藏  举报