GraalVM是一個高性能運行時環境,它基于OpenJDK, HotSpot和JRockit,并提供了在Java虛擬機上運行其他語言的能力,比如JavaScript,Python,Ruby等。旨在提高基于Java和JVM的應用的性能并簡化Java云原生服務的構建和運行
高性能:GraalVM通過即時編譯技術和多語言并行執行實現了高性能的運行時環境。
低內存消耗:GraalVM采用低延遲垃圾回收技術實現了高效的內存管理。
多語言支持:GraalVM支持多種編程語言,降低了開發者的學習成本。
跨平臺兼容性:GraalVM基于OpenJDK, HotSpot和JRockit,具有良好的跨平臺兼容性。
JIT(Just-in-Time,即時編譯)和AOT(Ahead-of-Time,預編譯)是兩種主流的編譯技術。
JIT編譯器是在程序運行的時候進行編譯,這個過程是動態的, 并且每次運行程序時都可能對代碼進行重新編譯。這樣的編譯方式能夠支持更多的動態特性,峰值性能更高,更有利于調試。據說JIT編譯可以拿到比AOT編譯更多的運行時信息,從而做出更優化的決策。
AOT編譯器則是在程序運行前就進行編譯,這個過程是靜態的。應用程序在安裝的時候會通過dex2oat工具將dex文件預編譯成ELF文件,這樣在每次運行程序時, 因為代碼已經被提前編譯過,所以不需要再重新編譯。這種方式使得應用的啟動速度更快,資源占用也略微低一些。
值得一提的是,AOT和JIT也可以結合使用,以發揮各自的優勢。例如在某些語言或框架中,可以使用靜態AOT編譯來提前將整個應用程序編譯好,而在程序運行過程中則使用動態JIT編譯來提升程序的運行效率。
直接進入官網,https://www.graalvm.org/downloads/,根據自己計算機系統類型選擇對應版本即可。
我的電腦是WIN11,所以選擇了Java 17 | Windows(x64),對應下載的版本為:graalvm-jdk-17.0.9+11.1
如果有安裝SDKMAN,可以通過下面的命令安裝:
sdk install java 21.0.1-graal
從下載的graalvm文件名稱也可以看出,其本身也是jdk,打開安裝文件里的bin目錄,可以看到也有java javac等等命令,可以將本地Java環境覆蓋,當然這個不是必須的。比如我使用IDEA時,選擇項目對應的SDK即可。
GRAALMVM_HOME= <your graalvm-jdk path>PATH=%GRAALMVM_HOME%/bin
這樣我們就可以在終端使用native-image命令了。
通過native-image可以把Java代碼編譯為本地二進制可執行文件。本地可執行文件只包括運行時所需的代碼,即應用程序類、標準庫類、語言運行時和來自JDK的靜態鏈接的本機碼。
可以通過Visual Studio Installer來安裝,下載地址 https://visualstudio.microsoft.com/zh-hans/downloads/, 這里需要選擇17.0以上的版本,否則后面會出現問題,我這里選擇的是Visual Studio Community2022
圖片
public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World!"); }}
javac HelloWorld.java
native-image com.sucl.blog.vm.graalvm.HelloWorld
com.sucl.blog.vm.graalvm.HelloWorld.exe
<project> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.graalvm.buildtools</groupId> <artifactId>native-maven-plugin</artifactId> <version>0.9.25</version> </plugin> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build></project>
@RestController@SpringBootApplicationpublic class GraalVMApplication { public static void main(String[] args) { SpringApplication.run(GraalVMApplication.class, args); } @GetMapping public String index(){ return "hello GraalVM"; }}
mvn -Pnative clean native:compile -f pom.xml
或者通過右側Maven選項,選擇native插件,配置運行參數,直接運行即可
圖片
整個打包過程比較長,由于需要將jar文件轉換可直接運行的成二進制exe文件,整個編譯的過程都會比較漫長。啟動完成后可以看到這樣的信息
圖片
在項目target目錄中,可以看到生成的exe文件,直接雙擊運行。以前幾秒甚至幾十秒才能啟動的項目,現在實現了秒開...
通過GraalVM Native Image,可以將Java字節碼直接編譯成特定于平臺的、自包含的本機可執行文件,從而實現更快的啟動速度和更小的應用程序占用空間。java跨平臺的特性好像也沒了...
打開瀏覽器,輸入http://localhost:8080/則可以看到與普通項目相同的效果
通過官網可以看到,GraalVM Native除了支持上面的基于jar的構建,還有以下
圖片
Error: Error compiling query code (in C:/Users/Us/AppData/Local/Temp/SVM-9567697918431257239/AMD64LibCHelperDirectives.c). Compiler command ''C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/MSVC/14.33.31629/bin/Hostx64/x64/cl.exe' /WX /W4 /wd4201 /wd4244 /wd4245 /wd4800 /wd4804 /wd4214 '/FeC:/Users/Us/AppData/Local/Temp/SVM-9567697918431257239/AMD64LibCHelperDirectives.exe' 'C:/Users/Us/AppData/Local/Temp/SVM-9567697918431257239/AMD64LibCHelperDirectives.c'' output included error: [AMD64LibCHelperDirectives.c, C:/Users/Us/AppData/Local/Temp/SVM-9567697918431257239/AMD64LibCHelperDirectives.c(1): fatal error C1034: stdio.h: 不包括路徑集]Error: Use -H:+ReportExceptionStackTraces to print stacktrace of underlying exception
下載好Visual Studio后記得根據你的安裝路徑來配置系統環境變量:
INCLUDE=C:/Program Files (x86)/Windows Kits/10/Include/10.0.16299.0/ucrtC:/Program Files (x86)/Windows Kits/10/Include/10.0.16299.0/umC:/Program Files (x86)/Windows Kits/10/Include/10.0.16299.0/sharedC:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/MSVC/14.33.31629/includeLIB=C:/Program Files (x86)/Windows Kits/10/Lib/10.0.22000.0/um/x64C:/Program Files (x86)/Windows Kits/10/Lib/10.0.22000.0/ucrt/x64C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/MSVC/14.33.31629/lib/x64PATH=C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/MSVC/14.33.31629/bin/Hostx64/x64
Spring Native是Spring Boot團隊與GraalVM團隊合作的產物,作為一個獨立的子項目存在。它充分利用了GraalVM的特性,例如AOT編譯,以提供更快的啟動速度和更低的內存消耗。此外,Spring Native還支持將Spring Boot應用程序編譯成本地可執行文件。
Spring Boot 3的Native則更側重于與Spring Boot主體的整合,可能更深度地整合了Spring Boot的特性與功能。
目前Spring Native已經由Spring Boot替代
https://docs.spring.io/spring-boot/docs/current/reference/html/native-image.html
Quarkus的創建是為了使Java開發人員能夠為現代的、云原生的世界創建應用程序。Quarkus是一個為GraalVM和HotSpot定制的Kubernetes 原生Java框架,由最佳的Java庫和標準精心打造。其目標是使Java成為Kubernetes和無服務器環境的領先平臺,同時為開發者提供一個框架, 以解決更廣泛的分布式應用架構問題。
https://cn.quarkus.io/about/
本文鏈接:http://www.www897cc.com/showinfo-26-19897-0.html讓Java起飛的技術...
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com
上一篇: 你可能聽說過雪花算法
下一篇: 信貸系統中是如何使用征信數據?