AOT:Ahead-of-Time(提前编译):程序执行前,全部被编译成机器码
JIT:Just in Time(即时编译): 程序边编译,边运行;
编译:
语言:
Java:半编译半解释
在线编程网站:https://anycodes.cn/editor
对比项 | 编译器 | 解释器 |
---|---|---|
机器执行速度 | 快,因为源代码只需被转换一次 | 慢,因为每行代码都需要被解释执行 |
开发效率 | 慢,因为需要耗费大量时间编译 | 快,无需花费时间生成目标代码,更快的开发和测试 |
调试 | 难以调试编译器生成的目标代码 | 容易调试源代码,因为解释器一行一行地执行 |
可移植性(跨平台) | 不同平台需要重新编译目标平台代码 | 同一份源码可以跨平台执行,因为每个平台会开发对应的解释器 |
学习难度 | 相对较高,需要了解源代码、编译器以及目标机器的知识 | 相对较低,无需了解机器的细节 |
错误检查 | 编译器可以在编译代码时检查错误 | 解释器只能在执行代码时检查错误 |
运行时增强 | 无 | 可以动态增强 |
AOT会牺牲高级语言的一些特性:反射,面向切面…
JIT | AOT | |
---|---|---|
优点 | 1.具备实时调整能力 2.生成最优机器指令 3.根据代码运行情况优化内存占用 |
1.速度快,优化了运行时编译时间和内存消耗 2.程序初期就能达最高性能 3.加快程序启动速度 |
缺点 | 1.运行期边编译速度慢 2.初始编译不能达到最高性能 |
1.程序第一次编译占用时间长 2.牺牲高级语言一些特性 |
在 OpenJDK 的官方 Wiki 上,介绍了HotSpot 虚拟机一个相对比较全面的、 即时编译器(JIT) 中采用的优化技术列表。
可使用:-XX:+PrintCompilation 打印JIT编译信息
.java === .class === 机器码
JVM: 既有解释器,又有编辑器(JIT:即时编译);
建议阅读:
- 美团技术:https://tech.meituan.com/2020/10/22/java-jit-practice-in-meituan.html
- openjdk官网:https://wiki.openjdk.org/display/HotSpot/Compiler
jvm里面会判断一段代码是解释执行还是编译执行,如果是编译执行,就编译成机器码并且放到缓存里面,下次用到的时候,直接取;如果是解释执行,就直接解释执行,并且统计解释执行的次数,当次数达到某个阈值的时候,就触发编译,将机器码放在缓存中。
热点代码:调用次数非常多的代码
JVM中集成了两种编译器,Client Compiler 和 Server Compiler;
Client Compiler:
Server Compiler:
Java 7开始引入了分层编译(Tiered Compiler)的概念,它结合了C1和C2的优势,追求启动速度和峰值性能的一个平衡。分层编译将JVM的执行状态分为了五个层次。五个层级分别是:
profiling就是收集能够反映程序执行状态的数据。其中最基本的统计数据就是方法的调用次数,以及循环回边的执行次数。
总的来说,C1的编译速度更快,C2的编译质量更高,分层编译的不同编译路径,也就是JVM根据当前服务的运行情况来寻找当前服务的最佳平衡点的一个过程。从JDK 8开始,JVM默认开启分层编译。
存在的问题:
希望的效果:
java应用也能提前被编译成机器码,随时急速启动,一启动就急速运行,最高性能
编译成机器码的好处:
官网:https://www.graalvm.org/
GraalVM是一个高性能的JDK,旨在加速用Java和其他JVM语言编写的应用程序的执行,同时还提供JavaScript、Python和许多其他流行语言的运行时。
GraalVM提供了两种运行Java应用程序的方式:
- 在HotSpot JVM上使用Graal即时(JIT)编译器
- 作为预先编译(AOT)的本机可执行文件运行(本地镜像)。
GraalVM的多语言能力使得在单个应用程序中混合多种编程语言成为可能,同时消除了外部语言调用的成本。
跨平台提供原生镜像原理:安装graalVM,native-image,然后通过native-image进行调用集成环境VisualStudio,打包成windows下的可执行程序。
官网:https://visualstudio.microsoft.com/zh-hans/free-developer-offers/
别选中文
记住你安装的地址;
下载 GraalVM + native-image
修改 JAVA_HOME 与 Path,指向新bin路径
验证JDK环境为GraalVM提供的即可:
安装 native-image 依赖:
gu install native-image
native-image-xxx.jar
文件gu install --file native-image-installable-svm-java17-windows-amd64-22.3.2.jar
native-image
创建普通java项目。编写HelloWorld类;
mvn clean package
进行打包java -jar xxx.jar
MANIFEST.MF
添加 Main-Class: 你的主类
native-tools
终端#从入口开始,编译整个jar
native-image -cp boot3-15-aot-common-1.0-SNAPSHOT.jar com.atguigu.MainApplication -o Haha
#编译某个类【必须有main入口方法,否则无法编译】
native-image -cp .\classes org.example.App
要把应用程序通过package打包之后,进入VisualStudio提供的x64 Native Tools,jar所在的文件夹下执行native-image -cp boot3-15-aot-common-1.0-SNAPSHOT.jar com.atguigu.MainApplication -o Haha。这个命令的com.atguigu.MainApplication表示入口,-o Haha表示生成的可执行文件名为Haha
sudo yum install gcc glibc-devel zlib-devel
tar -zxvf graalvm-ce-java17-linux-amd64-22.3.2.tar.gz -C /opt/java/
sudo vim /etc/profile
#修改以下内容
export JAVA_HOME=/opt/java/graalvm-ce-java17-22.3.2
export PATH=$PATH:$JAVA_HOME/bin
source /etc/profile
gu install --file native-image-installable-svm-java17-linux-amd64-22.3.2.jar
native-image -cp xxx.jar org.example.App
<build>
<plugins>
<plugin>
<groupId>org.graalvm.buildtoolsgroupId>
<artifactId>native-maven-pluginartifactId>
plugin>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
plugin>
plugins>
build>
1、运行aot提前处理命令:mvn springboot:process-aot
2、运行native打包:mvn -Pnative native:build
# 推荐加上 -Pnative
mvn -Pnative native:build -f pom.xml
可能提示如下各种错误,无法构建原生镜像,需要配置环境变量;
cl.exe
找不到错误no include path set
需要修改三个环境变量:Path
、INCLUDE
、lib
1、 Path:添加如下值
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\bin\Hostx64\x64
2、新建INCLUDE
环境变量:值为
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\include;C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\shared;C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\ucrt;C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\um;C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\winrt
lib
环境变量:值为C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\lib\x64;C:\Program Files (x86)\Windows Kits\10\Lib\10.0.19041.0\um\x64;C:\Program Files (x86)\Windows Kits\10\Lib\10.0.19041.0\ucrt\x64
clude\10.0.19041.0\um;C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\winrt
[外链图片转存中...(img-RrpPlCvu-1703577786321)]
- 3、新建`lib`环境变量:值为
```latex
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\lib\x64;C:\Program Files (x86)\Windows Kits\10\Lib\10.0.19041.0\um\x64;C:\Program Files (x86)\Windows Kits\10\Lib\10.0.19041.0\ucrt\x64