用于Java性能的GraalVM(Windows Developer Build)


什么是GraalVM?

高性能多语言VM

安装GraalVM

从OTN下载GraalVM

Windows GraalVM早期采用者
Windows上正在开发对GraalVM的支持。
注意:下载前,您需要先接受页面顶部的许可证:
下载基于JDK8的GraalVM,Windows预览版(19.0.1)(cksum --3226557420)

将下载的文件解压缩到任何目录

1
Expand-Archive "C:\<DOWNLOADED FOLDER>\graalvm-ee-windows-amd64-19.0.1.zip" "C:\Program Files\Java"

安装检查

1
2
3
4
PS C:> & 'C:\Program Files\Java\graalvm-ee-19.0.1\bin\java.exe' -version
java.exe : java version "1.8.0_212"
Java(TM) SE Runtime Environment (build 1.8.0_212-b31)
Java HotSpot(TM) GraalVM EE 19.0.1 (build 25.212-b31-jvmci-19-b01, mixed mode)

Case.2性能检查和比较

  • 编译JDK1.8运行JDK1.8
  • 编译JDK1.8运行JDK11
  • 编译JDK1.8运行GraalVM Java(非本机)
  • GraalSample.java

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    public class GraalSample {
        static final int ITERATIONS = Math.max(Integer.getInteger("iterations", 1), 1);
        public static void main(String[] args) {
            String sentence = String.join(" ", args);
            for (int iter = 0; iter < ITERATIONS; iter++) {
                if (ITERATIONS != 1) System.out.println("-- iteration " + (iter + 1) + " --");
                long total = 0, start = System.currentTimeMillis(), last = start;
                for (int i = 1; i < 10000000; i++) {
                    total += sentence.chars().filter(Character::isUpperCase).count();
                    if (i % 1000000 == 0) {
                        long now = System.currentTimeMillis();
                        System.out.printf("%d (%d ms)%n", i / 1000000, now - last);
                        last = now;
                    }
                }
                System.out.printf("total: %d (%d ms)%n", total, System.currentTimeMillis() - start);
            }
        }
    }

    通过JDK1.8编译GraalSample.java

    1
    PS C:> & 'C:\Program Files\Java\jdk1.8.0\bin\javac.exe' -source 1.8 -d C:\Temp GraalSample.java

    运行JDK 1.8

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    PS C:\Temp> Measure-Command { & 'C:\Program Files\Java\jdk1.8.0\bin\java.exe' GraalSample }
    TotalMilliseconds : 1272.6506
    TotalMilliseconds : 1157.0957
    TotalMilliseconds : 1155.1402
    TotalMilliseconds : 1165.2418
    TotalMilliseconds : 1176.3292

    PS C:\Temp> Measure-Command { & 'C:\Program Files\Java\jdk1.8.0\bin\java.exe' GraalSample In 2019 I would like to run ALL languages in one VM.}
    TotalMilliseconds : 3806.2965
    TotalMilliseconds : 3795.3136
    TotalMilliseconds : 3800.0122
    TotalMilliseconds : 3791.7407
    TotalMilliseconds : 3783.8776

    运行GraalVM Java(非本机)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    PS C:\Temp>  Measure-Command { & 'C:\Program Files\Java\graalvm-ee-19.0.1\bin\java.exe' GraalSample }
    TotalMilliseconds : 2400.0316
    TotalMilliseconds : 2394.7220
    TotalMilliseconds : 2413.2863
    TotalMilliseconds : 2372.2009
    TotalMilliseconds : 2870.4932

    PS C:\Temp>  Measure-Command { & 'C:\Program Files\Java\graalvm-ee-19.0.1\bin\java.exe' GraalSample In 2019 I would like to run ALL languages in one VM. }
    TotalMilliseconds : 3579.2619
    TotalMilliseconds : 3628.8374
    TotalMilliseconds : 3516.2905
    TotalMilliseconds : 3453.3161
    TotalMilliseconds : 3655.8266

    结论结论

    GraalVM最初需要几次开销,但是随着迭代次数的增加,GraalVM比JDK1.8更加稳定和更快。
    看来GraalVM不适合像简单的cli java程序那样的单次使用。