GraalVMがApple Siliconに対応してた

2022.05.24

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Introduction

いつの間にかGraalVMがm1 macでも動くようになってました
これでGraalVM使いたいとき、
わざわざ古いmac引っ張り出してこなくてすみます。

Environment

  • MacBook Pro (13-inch, M1, 2020)
  • OS : MacOS 11.3.1
  • sdkman : 5.13.1

Try

以前の記事と同じように試します。

sdkmanでGraalVMのインストール。

% sdk list java

================================================================================
Available Java Versions for macOS 64bit
================================================================================
 Vendor        | Use | Version      | Dist    | Status     | Identifier
--------------------------------------------------------------------------------
 GraalVM       |     | 22.1.0.r17   | grl     |            | 22.1.0.r17-grl
               |     | 22.1.0.r11   | grl     |            | 22.1.0.r11-grl
               |     | 22.0.0.2.r17 | grl     |            | 22.0.0.2.r17-grl
               |     | 22.0.0.2.r11 | grl     |            | 22.0.0.2.r11-grl
               |     | 21.3.2.r17   | grl     |            | 21.3.2.r17-grl
               |     | 21.3.2.r11   | grl     |            | 21.3.2.r11-grl
               |     | 21.3.1.r17   | grl     |            | 21.3.1.r17-grl
               |     | 21.3.2.r11   | nik     |            | 21.3.2.r11-nik
               |     | 21.3.1.r17   | nik     |            | 21.3.1.r17-nik
               |     | 21.3.1.r11   | nik     |            | 21.3.1.r11-nik
               |     | 21.3.0.r17   | nik     |            | 21.3.0.r17-nik
               |     | 21.3.0.r11   | nik     |            | 21.3.0.r11-nik
               |     | 21.2         | nik     |            | 21.2-nik
・・・・・・
% sdk install 22.1.0.r17-grl
・・・

インストールOKです。

% java --version
openjdk 17.0.3 2022-04-19
OpenJDK Runtime Environment GraalVM CE 22.1.0 (build 17.0.3+7-jvmci-22.1-b06)
OpenJDK 64-Bit Server VM GraalVM CE 22.1.0 (build 17.0.3+7-jvmci-22.1-b06, mixed mode, sharing)

動作確認用のMicronautも最新版をインストール。

% sdk install micronaut 3.4.4
・・・

mnコマンドで雛形つくります。

% mn create-app micronaut-m1 --build gradle

src/main/java/micronaut/m1にHelloController.javaを作成。

package micronaut.m1;

import io.micronaut.http.MediaType;
import io.micronaut.http.annotation.Controller;
import io.micronaut.http.annotation.Get;

@Controller("/hello")
public class HelloController {

    @Get(produces = MediaType.TEXT_PLAIN)
    public String index() {
        return "Hello";
    }

}

とりあえず普通に起動してみます。

% cd  micronaut-m1
%./gradlew run

> Task :run
 __  __ _                                  _
|  \/  (_) ___ _ __ ___  _ __   __ _ _   _| |_
| |\/| | |/ __| '__/ _ \| '_ \ / _` | | | | __|
| |  | | | (__| | | (_) | | | | (_| | |_| | |_
|_|  |_|_|\___|_|  \___/|_| |_|\__,_|\__,_|\__|
  Micronaut (v3.4.4)

12:03:10.890 [main] INFO  io.micronaut.runtime.Micronaut - Startup completed in 1211ms. Server Running: http://localhost:8080
<=========----> 75% EXECUTING [24s]
> :run

http://localhost:8080/helloにアクセスできればOK。

次はネイティブイメージをつくって動かしてみましょう。
native-imageをインストールします。

% gu install native-image
Downloading: Component catalog from www.graalvm.org
Processing Component: Native Image
Downloading: Component native-image: Native Image from github.com
Installing new component: Native Image (org.graalvm.native-image, version 22.1.0)

#バージョン確認
%native-image --version
GraalVM 22.1.0 Java 17 CE (Java Version 17.0.3+7-jvmci-22.1-b06)

ネイティブコンパイル!

./gradlew nativeCompile

> Task :generateResourcesConfigFile

・・・・・・・・

 479.72KB io.netty.handler.codec.http2                       603.81KB java.lang.String[]
 467.12KB java.util.concurrent                               552.61KB java.util.HashMap$Node
      ... 487 additional packages                                 ... 3012 additional object types
                                           (use GraalVM Dashboard to see all)
------------------------------------------------------------------------------------------------------------------------
                        8.1s (5.5% of total time) in 36 GCs | Peak RSS: 27.23GB | CPU load: 3.20
------------------------------------------------------------------------------------------------------------------------
Produced artifacts:
 /path/your/micronaut-m1/build/native/nativeCompile/micronaut-m1 (executable)
 /path/your/micronaut-m1/build/native/nativeCompile/micronaut-m1.build_artifacts.txt
========================================================================================================================

BUILD SUCCESSFUL in 2m 33s
5 actionable tasks: 3 executed, 2 up-to-date

作成したネイティブメージを起動します。
起動時間は半分くらい。

% cd /path/your/micronaut-m1
% ./build/native/nativeCompile/micronaut-m1
 __  __ _                                  _
|  \/  (_) ___ _ __ ___  _ __   __ _ _   _| |_
| |\/| | |/ __| '__/ _ \| '_ \ / _` | | | | __|
| |  | | | (__| | | (_) | | | | (_| | |_| | |_
|_|  |_|_|\___|_|  \___/|_| |_|\__,_|\__,_|\__|
  Micronaut (v3.4.4)

13:04:55.201 [main] INFO  io.micronaut.runtime.Micronaut - Startup completed in 559ms. Server Running: http://localhost:8080

Summary

ソフトウェア/SDK/ツール関連の対応で、
m1じゃ動かない。。ということがけっこうありましたが、
少しづつ解消されていってますね。

References