將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
