一文读懂GraalVM的作用(gradle的作用是什么?)
1、GraalVM介绍
1.1、什么是GraalVM
GraalVM是一个高性能的JDK(Java Development Kit)。
1.加速用Java和其他JVM语言编写的应用程序的执行。
- 在 HotSpot JVM 上使用 Graal 作为即时编译器(JIT)优化热点代码,加速运行效率。
- 作为提前 编译(Ahead-of-Time) 的本机可执行文件,加速运行效率。
2.为JavaScript,Python和许多其他流行语言提供运行环境。
- GraalVM 的多语言功能可以在单个应用程序中混合多种编程语言,轻松实现各个语言之间相互调用,比如 java调用js/python库方法。
1.2、特征
高性能,云原生,通晓多语言(Polyglot)。
- 高性能,主要体现在启动高,省内存
- 云原生,想达到的效果是部署java项目时,不用先安装jdk,直接在目标机器运行,就像在windows双击运行exe文件一样。
- 通晓多语言,除了运行基于Java和JVM的语言之外,GraalVM的语言实现框架(Truffle)还可以在JVM上运行JavaScript,Ruby,Python和许多其他流行语言。 使用GraalVM Truffle,Java和其他支持的语言可以直接相互操作,并在同一内存空间中来回传递数据。
1.3、工作原理
先回顾一下HotSpot工作原理
启动慢的原因就在于,加载和编译比较慢,class越多记载/编译就越慢,启动就慢。对于启动速度要求比较高的生产环境就不是很友好,比如云原生中的容器。试想,docker容器已经秒起了,但是里面跑一个jar非常慢,这你受得了吗?(在没有graalvm之前我受得了,在graalvm之后我也受得了。)。
1.替代C2,具有更强的优化功能
2.提前编译(AOT),将运行时的编译提前到了编译时,大大减少启动时间
3.多语言的运行环境,可以为多语言提供统一的运行环境,让各个语言相互调用超级简单。
2、安装GraalVM
2.1、下载GraalVM
此次演示版本:
JDK:17
GraalVM:CE 22.3.0
根据jdk版本/操作系统下载对应版本
2.2、安装GraalVM
只需要将环境变量指向GraalVM根目录即可
java -version测试
3.3、安装native-image
gu install native-image
还可以下载到本地安装。
gu install -L native-image-installable-svm-java17-windows-amd64-22.3.0.jar
测试
gu list
有native-image即可
3.4、安装 C++环境
下载Microsoft C++ 生成工具 - Visual Studio
注意:安装时选择到非C盘,其他盘,其他盘,其他盘,非常占空间。
单个组件中搜索MSVC,将141相关全部选中(对,全部,免得夜场梦多)
等吧(建议深夜安装,去吧,睡一觉,美美的睡一觉)。
结束。
添加Path环境变量
C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Tools\MSVC\14.34.31933\bin\Hostx64\x64
新建环境变量 INCLUDE
C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\ucrt;C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\um;C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\shared;C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Tools\MSVC\14.34.31933\include
新建环境变量 LIB
C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Tools\MSVC\14.34.31933\lib\x64;C:\Program Files (x86)\Windows Kits\10\Lib\10.0.20348.0\um\x64;C:\Program Files (x86)\Windows Kits\10\Lib\10.0.20348.0\ucrt\x64
3、创建Spring boot 项目
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.0.0</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.coachtam</groupId>
<artifactId>springboot3-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboot3-demo</name>
<description>Spring Boot3 + GraalJVM</description>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<!--Springboot3 正式版不需要单独native插件-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<image>
<buildpacks>
<buildpack>gcr.io/paketo-buildpacks/graalvm</buildpack>
<buildpack>gcr.io/paketo-buildpacks/java-native-image</buildpack>
</buildpacks>
</image>
</configuration>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</project>
启动器
package com.coachtam.springboot3demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Springboot3DemoApplication {
public static void main(String[] args) {
SpringApplication.run(Springboot3DemoApplication.class, args);
}
}
测试controller
@RestController
public class HelloWorldController {
@GetMapping("/demo")
public String helloworld() {
System.out.println("hello world");
return "hello world";
}
}
4、编译Spring boot项目
mvn -Pnative native:compile
编译成功后,在target目录中会出现xxx.exe文件
双击exe文件运行即可
可以看得出,属于毫秒起。