Graalvm (1) 初見Graalvm

一、 Install and config

1. Install

a. brew

透過Homebrew是較快的方式,但不一定是最新的

brew install graalvm/tap/graalvm-ce-java8

brew install graalvm/tap/graalvm-ce-java11

b. download

雖然麻煩點,但目前這樣可以下載到較新的版本

github.com/graalvm

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的系統架構下,絶對是一大助益。

當然追求的不僅是起動快,記憶體消耗少,回應時間與穩定性更重要,這部份就需要長時間的使用來觀察。

發表迴響

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料