GraalVM:JAVA性能优化

技术简介 Oracle GraalVM 是一个使用即时 (JIT) 编译器加速 Java 和 JVM 应用性能的高性能 JDK。它由 Oracle 提供 24/7 支持,能够降低应用延迟,通过缩短垃圾回收时间提高峰值吞吐量。此外,GraalVM 本地镜像实用程序可提前 (AOT) 编译 J...

作者 铂傲智能团队
英文版本稍后补充。
#Java #性能优化 #GraalVM

技术简介 Oracle GraalVM 是一个使用即时 (JIT) 编译器加速 Java 和 JVM 应用性能的高性能 JDK。它由 Oracle 提供 24/7 支持,能够降低应用延迟,通过缩短垃圾回收时间提高峰值吞吐量。此外,GraalVM 本地镜像实用程序可提前 (AOT) 编译 Java 字节码,生成可近乎瞬时启动且仅占用极少内存资源的原生可执行文件。

GraalVM 起始于 2011 年 Oracle Labs 的一个研究项目。该项目旨在创建一个可以杰出性能运行多种编程语言的运行时平台,其核心是高级优化 GraalVM 编译器。GraalVM 编译器可用作 Java 虚拟机的即时 (JIT) 编译器,或帮助 GraalVM 本地镜像提前将 Java 字节码编译为原生机器码。同时,GraalVM 的 Truffle 语言实施框架可与 GraalVM 编译器协作,以卓越性能运行 JavaScript、Python、Ruby 以及 JVM 支持的其他语言。在 JIT 模式下,JVM 可使用 GraalVM JIT 编译器,在应用运行时基于 Java 字节码创建特定于平台的机器码。编译器将在程序执行时执行增量编译,并对频繁执行的代码进行额外优化。得益于聚合内联、部分逃逸分析以及其他高级优化技术,这可以确保热点代码超快速运行。其中,一些优化技术可以降低对象分配需求,降低垃圾回收器负载,优化长时间运行应用的性能。GraalVM 本地镜像实用程序也可以编译 Java 字节码,提前(即在构建时)生成原生机器可执行文件。这些可执行文件能够近乎瞬时启动,仅占用极小内存 — 基于 JVM 运行的 Java 应用也将占用内存;只包含应用的类、方法和依赖库,非常简洁。

综上所述,GraalVM是一个高性能JDK,它可以通过native-image(快速启动)将java项目编译成为一个本机可执行的二进制文件,这个编译的本机可执行文件中只包含运行时所需要的代码,极大的减少了资源使用,大大减少了运行成本。

使用经验 一、检查服务器一致性(安装前的准备)

  1. 检查CPU架构与位数一致

    使用命令查看服务器CPU架构与位数确保其一致性。例如:x86_64

    操作命令:uname -m

  2. 操作系统一致

    使用命令查看服务器操作系统信息,从而选择对应操作系统确保操作系统一致。

    例如:

     操作系统查询为:
    

Linux fedora 6.6.8-100.fc38.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Dec 21 04:01:45 UTC 2023 x86_64 GNU/Linux

    因我们的生产操作系统为RedHat,所以我们选择了上游免费的Fedora操作系统。

操作命令:uname -a

3. JDK版本一致

使用命令查看JDK版本信息选择对应版本号从而确保JDK版本与工具版本兼容。

例如:

    openjdk version “11.0.1” 2018-10-16

    OpenJDK Runtime Environment 18.9 (build 11.0.1+13)

    OpenJDK 64-Bit Server VM 18.9 (build 11.0.1+13, mixed mode)

操作命令:java -version

4. 根据确认CPU、操作系统和JDK版本来选择对应GraalVM版本下载压缩包

压缩包对应关系:[JDK版本]-[操作系统]-[CPU架构位数]-[GraalVM版本].tar.gz

例如:

    我们操作系统为Fedora(Fedora属于Linux系统)、JDK版本为JDK11、CPU为X86_64(x86-64分为Intel和ADM)所以我下载压缩包为:java11-linux-amd64-22.3.3.tar.gz

二、安装下载与环境变量配置

  1. 根据确认CPU、操作系统和JDK版本来选择对应的GraalVM版本下载压缩包。

  2. 将下载好的压缩包放置服务器,使用Linux命令解压压缩包

    操作命令:tar -zxvf [压缩包]

  3. 配置环境 (1) 编辑环境变量文件

     操作命令:vi /ect/profile
    

    (2) 将以下信息写入环境变量文件后wq进行保存

     export JAVA_HOME=[GraalVM根目录路径]
    
     export PATH=$PATH:$JAVA_HOME/bin
    

    (3) 重启环境变量

     操作命令:source /etc/profile
    

    (4) 验证是否生效

     操作命令:java -version
    
  4. 联网安装native-image

    操作命令:[GraalVM根目录路径]/bin/gu install native-image

  5. 离线安装native-image (1) 下载离线安装jar包

     下载地址见相关链接。
    

    (2) 离线安装

     操作命令:gu -L install [native-image离线jar包全路径]
    

    (3) 查看安装列表

     操作命令:gu list
    

三、 程序启动 将项目打成jar包并编译此jar包生成可执行的文件(注:更改项目端口号以便两种形式的文件同时启动),分别在服务器中将jar包与编译文件同时启动,使用测试工具同时多次调用同一接口,检测服务器中这两个进程的CPU运行效率、内存占用率等情况。

  1. 编译jar包

    使用编译命令将jar包编译成为一个可执行的二进制文件到当前目录。

    操作命令:native-image -jar [jar包全路径] [编译后文件名称]

  2. 启动文件 在同一服务器上同时启动编译好的二进制文件与jar包。

    编译后的文件启动命令:./[编译后文件名称]

    jar包启动命令:java -jar [jar包全路径]

四、问题解决 查看JDK版本,系统显示版本号与安装版本号不一致。

错误原因:JAVA在Linux系统中支持同时存在多个版本JDK安装,因此会造成系统环境读取的JDK版本与预期版本有差异的情况出现,从而导致出现安装GraalVM下载的预期版本与系统读取JDK版本不对应情况造成GraalVM功能失效情况。

解决方案:使用Linux命令将系统读取的JDK版本切换为预期版本即可。

操作命令:sudo alternatives –config java

相关链接 (1) GitHub Proxy 代理加速:https://mirror.ghproxy.com/

(2) GraalVM(JDK11)下载地址:https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-22.3.3/graalvm-ce-java11-linux-amd64-22.3.3.tar.gz

(3) native-image离线下载地址:https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-22.3.3/native-image-installable-svm-java11-linux-amd64-22.3.3.jar

(4) 测试工具(Apifox)下载地址:http://apifox.com