將Java編譯為原生程式碼

霍丙南發表於2021-04-09

將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

相關文章