將Java編譯為原生程式碼
通常Java程式的執行流程為:將Java程式碼編譯為Byte Code(位元組碼),然後JVM執行引擎執行編譯好的Byte Code。這是一種中間語言的特性,它的好處就是可以做到平臺的無關性,一份程式碼可以在任意的平臺上執行。而且JVM語言採用了JIT(Just In Time)即時編譯技術,會將執行中的熱點程式碼(位元組碼)編譯為原生程式碼執行,提高程式碼執行效能。
雖然Java的這種中間語言+即時編譯的技術有很多優點,同時也有很多缺點。比如JVM執行引擎執行會比較佔用資源,而且JIT有熱載入的問題,所以執行的效能發揮不太穩定。對於軟體的釋出來說,我們通常會將JRE連同我們的應用程式一同釋出,這樣雖然能解決使用者PC上JRE版本與要求版本不一致問題,但是也增大了軟體包的體積。
針對上述JVM存在的問題,Oracel公司推出了一個名為GraalVM的專案,這個專案可以將Java位元組碼編譯為原生程式碼。編譯生成的原生程式碼無須JVM,可以直接在目標機器上執行。而且這種AOT(Ahead Of Time)的編譯方式並不會對效能造成太大的影響,同時它還能夠減少執行時的記憶體佔用與CPU資源消耗。具體的其他特性,可以檢視GraalVM官網。
GraalVM安裝(OSX)
GraalVM JDK可以與你本機的JDK互補的存在,GraalVM並沒有提供相應的安裝程式,而是以壓縮的包的形式進行釋出,你可以從Github上進行下載:https://github.com/graalvm/graalvm-ce-builds/releases/tag/vm-21.0.0.2
下載完畢後解壓縮至相應目錄即可。
安裝完畢GraalVM之後,你可以安裝native-image
原生程式碼編譯工具,這個工具需要依賴於GraalVM,所以在安裝這個工具前,請先安裝GraalVM。native-image
原生程式碼編譯工具也可以在上文中的Github倉庫中進行下載,它也是壓縮包的形式進行釋出的,下載下來解壓即可。但是與GraalVM不同的是這個工具並不是開箱即用,而是需要一些配置。
sudo xattr -r -d com.apple.quarantine /path/to/GRAALVM_HOME
<GraalVM安裝目錄>/Contents/Home/bin/gu install native-image
執行完這個命令後,native-image
就會安裝到GraalVM的bin目錄下。
測試編譯原生程式碼
Java原始碼:
public class Test
{
public static void main(String... args)
{
System.out.println("Hello world");
}
}
將原始碼編譯為位元組碼:
javac Test.java
將位元組碼編譯為原生程式碼:
native-image Test