Java GraalVM 环境搭建 class文件springboot项目 静态编译二进制文件 入门就看这一篇

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

在这里插入图片描述

在这里插入图片描述

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寂寞的4角钱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值