Java GraalVM 环境搭建 class文件springboot项目 静态编译二进制文件 入门就看这一篇
内容大纲
- 基础概念
- 云原生
- 静态编译
- 安装GraalVM
- 使用GraalVM
- GraalVM 编译运行 Class
- GraalVM 编译运行 Springboot
基础概念
GraalVM是Oracle推出的基于Java开发的开源高性能多语言运行时平台。
简单讲 GraalVM可以直接当做JVM使用 也可以对Java等多种语言实现静态编译
官方网站: https://www.graalvm.org/
GraalVM分为
- 1 社区版 (CE)免费
- 2 企业版 (EE)收费
云原生
Java语言在冷启动开销较大的问题上长期存在,很难从根本上解决。(由于JVM虚拟机的存在)
云原生应用场景中,如果应用的冷启动超过了其执行的时间,用户则需要对“不必要”的启动耗时付出更多。这让java语言在Serverless场景下无法与Node.js Go等快速启动的语言竞争
Java程序的运行生命周期:
- 1 启动JVM 执行各种初始化工作
- 2 调用Java程序Main函数进入应用初始化,通过解释执行的方式运行java代码,同时GC,JIT等开始工作
- 3 初始化完成后开始执行业务代码,此时才进入了程序执行的预热阶段,此阶段会有大量的类加载和JIT编译动作
- 4 预热后的java应用程序进入性能最好的稳定阶段
- 5 关闭应用程序
静态编译
Java静态编译是指把Java程序字节码单独编译成汇编代码
即把java程序的 Class或Jar包 编译成二进制可运行的程序直接运行,脱离了JVM运行时环境
传统的java项目生成.class中间文件,再由JVM执行。静态编译后的java项目直接产生可执行文件
静态编译的优势
-
1 执行的程序是与平台相关的经过编译优化的本地代码
执行本地代码不需要再经过解析执行和JIT编译,避免解释执行的低效和JIT的编译CPU开销,达到充分预热 -
2 编译后的可执行文件包含了轻量级运行时支持,不需要额外的JVM(没有JVM)
安装GraalVM
由于我们的生产环境基本都是linux环境 本次安装测试都基于linux环境
操作系统环境为 Ubuntu 18.04.6 LTS (GNU/Linux 4.15.0-204-generic x86_64)
基础准备
- Ubuntu 18.04.6
- graalvm-ce-java8-linux-amd64-20.1.0.tar.gz
- native-image-installable-svm-java8-linux-amd64-20.1.0.jar
下载GraalVM
下载地址: https://github.com/graalvm/graalvm-ce-builds/tags
选择Tag20.1.0
- graalvm-ce- 核心组件包 包含 JDK HotSpot运行时 GraalVM编译器**(安装 核心组件包 相当于安装了java运行时环境)**
- native-image- 静态编译组件升级包
选择java8相关文件下载
- graalvm-ce-java8-linux-amd64-20.1.0.tar.gz
- native-image-installable-svm-java8-linux-amd64-20.1.0.jar
配置环境变量
创建一个空白文件夹
mkdir -p /ops/graalvm
将下载的 graalvm-ce-java8-linux-amd64-20.1.0.tar.gz 与 native-image-installable-svm-java8-linux-amd64-20.1.0.jar 放置到此文件夹
解压 graalvm-ce-java8-linux-amd64-20.1.0.tar.gz
tar -zxvf graalvm-ce-java8-linux-amd64-20.1.0.tar.gz
添加环境变量
vi /etc/profile
加入以下内容
export GRAALVM_HOME=/ops/graalvm/graalvm-ce-java8-20.1.0
export CLASSPATH=.:$CLASSPATH:$GRAALVM_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$GRAALVM_HOME/bin
export JRE_HOME=$JGRAALVM_HOME/jre
source /etc/profile
运行java -version 出现 GraalVM CE 20.1.0 表示环境变量配置完成
安装静态编译组件升级包
注意:native-image版本 平台 需要和 graalvm-ce一致
环境变量配置完成后可以使用 gu list 命令查看已经安装的编译包
gu list
进入到放置native-image-installable-svm-java8-linux-amd64-20.1.0.jar 的文件夹下执行
gu install -L native-image-installable-svm-java8-linux-amd64-20.1.0.jar
到此 GraalVM环境配置完成
使用GraalVM
GraalVM 编译运行 Class
注意:在开始静态编译之前需要提前安装 gcc 和 zlib1g-dev 否则会出现以下异常
Error: Default native-compiler executable 'gcc' not found via environment variable PATH
Error: Use -H:+ReportExceptionStackTraces to print stacktrace of underlying exception
Error: Image build request failed with exit status 1
1. It appears as though libz.a is missing. Please install it.
安装静态编译需要的工具
apt-get install gcc
apt-get install zlib1g-dev
编写一个最简单的java程序 HelloWorld.java 使用javac 编译
public class HelloWorld {
public static void main(String[] args) {
System.out.print("HelloWorld~\n\n");
}
}
**使用native-image 命令静态编译 HelloWorld.class **
到此完成对class文件的静态编译
GraalVM 编译运行 Springboot
创建一个最简单的springboot项目
@RestController
public class EchoController {
@RequestMapping("/echo")
public String echo(@RequestParam("msg") String msg){
return "Hello~ " +msg + " " + dateToString(new Date()) + "\n\n";
}
public static String dateToString(Date date) {
SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return s.format(date);
}
}
打包生成my-graalvm-demo.jar
使用 native-image -jar 命令将springboot项目静态编译
native-image -jar my-graalvm-demo.jar
运行springboot