GraalVM:JAVA性能优化
技术简介 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项目编译成为一个本机可执行的二进制文件,这个编译的本机可执行文件中只包含运行时所需要的代码,极大的减少了资源使用,大大减少了运行成本。
使用经验 一、检查服务器一致性(安装前的准备)
检查CPU架构与位数一致
使用命令查看服务器CPU架构与位数确保其一致性。例如:x86_64
操作命令:uname -m
操作系统一致
使用命令查看服务器操作系统信息,从而选择对应操作系统确保操作系统一致。
例如:
操作系统查询为:
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
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
根据确认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
二、安装下载与环境变量配置
根据确认CPU、操作系统和JDK版本来选择对应的GraalVM版本下载压缩包。
将下载好的压缩包放置服务器,使用Linux命令解压压缩包
操作命令:tar -zxvf [压缩包]
配置环境 (1) 编辑环境变量文件
操作命令:vi /ect/profile
(2) 将以下信息写入环境变量文件后wq进行保存
export JAVA_HOME=[GraalVM根目录路径] export PATH=$PATH:$JAVA_HOME/bin
(3) 重启环境变量
操作命令:source /etc/profile
(4) 验证是否生效
操作命令:java -version
联网安装native-image
操作命令:[GraalVM根目录路径]/bin/gu install native-image
离线安装native-image (1) 下载离线安装jar包
下载地址见相关链接。
(2) 离线安装
操作命令:gu -L install [native-image离线jar包全路径]
(3) 查看安装列表
操作命令:gu list
三、 程序启动 将项目打成jar包并编译此jar包生成可执行的文件(注:更改项目端口号以便两种形式的文件同时启动),分别在服务器中将jar包与编译文件同时启动,使用测试工具同时多次调用同一接口,检测服务器中这两个进程的CPU运行效率、内存占用率等情况。
编译jar包
使用编译命令将jar包编译成为一个可执行的二进制文件到当前目录。
操作命令:native-image -jar [jar包全路径] [编译后文件名称]
启动文件 在同一服务器上同时启动编译好的二进制文件与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