一、 Install and config
1. Install
a. brew
透過Homebrew是較快的方式,但不一定是最新的
brew install graalvm/tap/graalvm-ce-java8
brew install graalvm/tap/graalvm-ce-java11
b. download
雖然麻煩點,但目前這樣可以下載到較新的版本
2. xattr
手動核可 MacOS 軟體來源,否則無法使用
sudo xattr -r -d com.apple.quarantine /Library/Java/JavaVirtualMachines/graalvm-ce-javaV-XX.Y.Z
sample
sudo xattr -r -d com.apple.quarantine /Library/Java/JavaVirtualMachines/graalvm-ce-javaV-XX.Y.Z
3. jenv
習慣用jenv來管理各版本的jdk,Graalvm仍可使用jenv來管理
jenv add /Library/Java/JavaVirtualMachines/graalvm-ce-javaV-XX.Y.Z/Contents/Home/
jenv global graalvm-ce-javaV
4. install native-image
gu install native-image
二、 試用
Create HelloWorld.java
很快地寫一個.java 的HelloWorld
public class HelloWorld {
public static void main(String[] args) {
System.out.println("OK!");
}
}
Compile to HelloWorld.class
先用javac compile成class
javac HelloWorld
native-image to executable
native-image HelloWorld
然後會看到
[helloworld:41349] classlist: 622.78 ms, 0.96 GB
[helloworld:41349] (cap): 4,455.12 ms, 0.96 GB
[helloworld:41349] setup: 5,816.45 ms, 0.96 GB
[helloworld:41349] (clinit): 137.13 ms, 1.22 GB
[helloworld:41349] (typeflow): 3,931.62 ms, 1.22 GB
[helloworld:41349] (objects): 3,702.14 ms, 1.22 GB
[helloworld:41349] (features): 263.96 ms, 1.22 GB
[helloworld:41349] analysis: 8,175.38 ms, 1.22 GB
[helloworld:41349] universe: 290.06 ms, 1.22 GB
[helloworld:41349] (parse): 636.06 ms, 1.69 GB
[helloworld:41349] (inline): 1,562.14 ms, 1.69 GB
[helloworld:41349] (compile): 5,187.95 ms, 2.33 GB
[helloworld:41349] compile: 7,808.37 ms, 2.33 GB
[helloworld:41349] image: 1,239.38 ms, 2.33 GB
[helloworld:41349] write: 317.91 ms, 2.33 GB
# Printing build artifacts to: helloworld.build_artifacts.txt
[helloworld:41349] [total]: 24,420.92 ms, 2.33 GB
最後用ls -al看一下目錄下檔案
total 17512
drwxr-xr-x 6 elliot staff 192 May 18 14:31 .
drwxr-xr-x 77 elliot staff 2464 May 18 14:27 ..
-rw-r--r-- 1 elliot staff 417 May 18 14:29 HelloWorld.class
-rw-r--r-- 1 elliot staff 103 May 18 14:29 HelloWorld.java
-rwxr-xr-x 1 elliot staff 8952152 May 18 14:31 helloworld
-rw-r--r-- 1 elliot staff 25 May 18 14:31 helloworld.build_artifacts.txt
可以看到一個特別大的檔案,而且屬性是可以執行的。
execute helloworld
直接執行下去
$> ./helloworld
OK!
三、 說明
透過上面的試用,很清楚地看到,不用java 就可執行了耶,
簡單來說,透過Graalvm,可以將class直接轉譯成機械碼,由JIT (Just in Time)變成了AOT (Ahead of Time)
執行期間不需要jvm幫忙轉譯,在起動上的確快得多,想想之前,無論是多小的程式,一定要起動一個JVM,固定開銷怎麼也減不下來,改用Graalvm可以改變這情形。
考慮到Microservices與Container盛行,甚至是serverless的架構下,起動能少消耗一些,積沙能成塔,對於常態性上百個甚至上千個pod的系統架構下,絶對是一大助益。
當然追求的不僅是起動快,記憶體消耗少,回應時間與穩定性更重要,這部份就需要長時間的使用來觀察。