Intellij IDEAでのGraalVMの使用

ここでは、次のことを実行する方法について説明します:

CLIからのGraalVM上のJavaアプリケーションの実行

Java仮想マシン(JVM)で実行されるアプリケーションは、GraalVMで実行できます。GraalVMにはJava HotSpot VMに基づくJDKが含まれ、Javaで記述された最適化Just-in-Time (JIT)コンパイラ(GraalVMコンパイラ)が統合されています。実行時に、アプリケーションはJVMによって通常どおりロードされ、実行されます。

このガイドのステップに従うには、GraalVMがインストールされている必要があります。インストールされていない場合でも、GraalVMをダウンロードしてして使用可能にするためにかかる時間はわずか数分です。オペレーティング・システムを選択し、インストール・ステップに進みます:

このガイドでは、macOSプラットフォーム用のJava 11ディストリビューションに基づくGraalVM Enterpriseを使用します。GraalVMが正常にインストールされたことを確認するには、それがPATH環境変数で使用可能で、かつJAVA_HOMEがそれを指していることを確認します。

echo $PATH
/Library/Java/JavaVirtualMachines/graalvm-ee-java11-<version>/Contents/Home/bin:...
echo $JAVA_HOME
/Library/Java/JavaVirtualMachines/graalvm-ee-java11-<version>/Contents/Home

このガイドでは、サンプル・アプリケーションとしてSpring PetClinicを使用します。このWebアプリケーションでは、Spring MVCおよびSpring Data JPAでSpring Bootを使用する方法を示します。

次に、プロジェクトのクローンを作成し、プロジェクトのディレクトリに移動します:

git clone https://github.com/spring-projects/spring-petclinic.git
cd spring-petclinic

Spring PetClinicアプリケーションはMavenを使用してビルドされているため、JARファイルを作成してコマンドラインから実行できます。

GraalVMを使用してJARファイルからJavaアプリケーションを起動する基本的な構文は、java -jar <JAR file>です。これで、アプリケーションをビルドし、他のJDKと同様に実行できるようになりました。

./mvnw package
java -jar target/spring-petclinic-2.3.0.BUILD-SNAPSHOT.jar

また、Spring Boot Mavenプラグインを使用して、このサンプル・アプリケーションをMavenから直接実行することもできます:

./mvnw spring-boot:run

アプリケーションが起動したら、localhost: 8000でアクセスします。JavaプロジェクトをGradleでビルドする場合は、./gradlew buildを実行してプロジェクトをビルドした後、通常どおりJARファイル(java -jar <JAR file>)から実行します。

IDEからのGraalVM上のJavaアプリケーションの実行

IDE (Eclipse IDE、IntelliJ IDEA、NetBeans IDEなど)からプロジェクトを操作する方が好ましい場合は、IDEでデフォルトのJDKとしてGraalVMを指定し、それ以降はGraalVMを使用してアプリケーションを実行することもできます。

IDEからGraalVM上のJavaプロジェクトを実行するには、GraalVMをプロジェクトのデフォルトJDKとして設定する必要があります。たとえば、IntelliJ IDEAを使用してSpring PetClinicプロジェクトを実行するには、次の操作が必要です:

1. プロジェクトを開き(「File」→「Open」)、ローカル・ドライブのSpring PetClinicソースを参照します。

2. ソースを生成し、プロジェクトのフォルダを更新します。IntelliJ IDEAには生成されたソースが自動的に含まれないため、生成する必要があります。Mavenサイドバーで、スピナー・アイコンが付いているフォルダをクリックします:

3. プロジェクトのSDKとしてGraalVMを追加します。「File」→「Project Structure」→「Project」→「Project SDK」に移動します。ドロップダウンを展開し、「Add SDK」→「JDK」を押して、GraalVMをインストールしたフォルダを開きます。macOSユーザーの場合、JDKホームのパスは/Library/Java/JavaVirtualMachines/{graalvm}/Contents/Homeになります。名前を指定して「Apply」を押します。

プラットフォームごとにGraalVM SDKを追加する場合は、「Project Structure」→「Platform Settings」→「SDK」に移動します。次に、プラス・ボタンを押し、「Add JDK」をクリックして、GraalVMをインストールしたフォルダを開きます。名前を指定して「Apply」をクリックします。

4. プロジェクトを実行します。GraalVM SDKをすべてのプロジェクト・モジュールのデフォルトとして設定すると、プロジェクトが確実にGraalVMで実行されます。このことを再確認するには、プロジェクトの実行構成を確認します。メイン・メニューから「Run」→「Run…」→「Edit Configurations」を選択し、「Environment」を展開して、指定されている値を確認します。GraalVMが表示されます。「Run」をクリックします。

IDEからのGraalVM上のJavaアプリケーションのデバッグ

IDEデバッガを使用して、GraalVMで実行されているアプリケーションをデバッグできます。前の項では、プロジェクトのデフォルトSDKとしてGraalVMを追加し、IntelliJ IDEAからサンプル・アプリケーションを実行しました。デバッガ・セッションは実行構成に基づいているため、IntelliJ IDEAから開始するための特別な構成は必要ありません。デバッガが同じ環境のJavaアプリケーションにアタッチされていることを確認するには、メイン・メニューで「Run」→「Debug…」→「Edit Configurations」に移動し、「Environment」を展開して、JRE値を確認します。GraalVMが表示されます。「Debug」を押します。

これにより、アプリケーションが実行され、デバッガ・セッションがバックグラウンドで開始されます。

GraalVMで実行されているアプリケーションのJVMオプションの構成

Java HotSpot VMコマンドライン・オプションおよびGraalVM固有のオプションを使用して、GraalVMで実行されているjavaプロセスを構成できます。コマンドラインからアプリケーションを実行している場合は、javaコマンドにオプションを追加する必要があります。

IDEで、IDE固有の方法を使用してオプションを指定します。たとえば、アプリケーションを起動するとき、より大きいメモリーを割り当てることができます。IntelliJ IDEAでは、「Run」→「Run…」→「Edit Configurations」→「Environment」の下の「VM options」フィールドに-Xmx1024m -Xms256mの値を入力できます。または、たとえば、ロードされたクラスのリストを出力します。次に、「Run」→「Run…」→「Edit Configurations」→「Environment」→「VM options」で-XX:+TraceClassLoadingオプションを渡し、アプリケーションを起動します。

GraalVMで実行しているため、GraalVM固有のオプションを使用できます。たとえば、-XX:+EagerJVMCI -Dgraal.PrintConfiguration=infoを渡すと、選択したコンパイラ構成に関する情報がコンソールに収集され、プログラムが終了します。

VisualVMを使用したGraalVM上のJavaアプリケーションのプロファイリング

IDEの組込みプロファイラからJavaアプリケーションをプロファイリングできますが、このガイドではかわりにVisualVMを適用する方法を示します。VisualVMは、GraalVMに付属のJavaプロファイリング・ツールです。これにはヒープ分析機能が含まれ、Javaアプリケーションのメソッドの測定、オブジェクトの分析、JFRスナップショットの読取りなどを行うことができます。

VisualVMは、次の2つの方法で起動できます:

  1. ここからスタンドアロン・ツールとしてダウンロードして起動します。
  2. GraalVMがインストールされ、VisualVMがバンドルされているため、単に、コマンドラインから起動します:
    jvisualvm
    

起動直後、このツールは、ローカルで実行中のすべてのJavaプロセス(VisualVMプロセス自体を含む)をアプリケーション領域に表示します。GraalVM (または別のJDK)で実行中のアプリケーションに接続するには、プロセス・リストでそれを探します。

VisualVMを使用すると、ローカルJavaアプリケーションの起動時からインストゥルメントされたプロファイリングが可能になります。また、これは短時間のプロセスをプロファイリングする場合にも役立ちます。

メモリー制約の問題が疑われる場合は、VisualVMがその調査に最適なツールとなります。まず、実際にメモリー・リークが発生していることを確認するために、アプリケーションの起動時に冗長ガベージ・コレクション(--verbosegc)を有効にします。次に、実行中のJavaアプリケーションにVisualVMを接続し、プロファイラを適用します。プロファイリング・セッションが開始され、プロファイリング対象のアプリケーションがVisualVMで開かれると、ライブ・プロファイリング・データを確認できます。CPUデータのコール・ツリーおよびメモリー割当てのスタック・トレースを表示するには、スナップショットを取得します。VisualVMでアプリケーション・プロセスを右クリックし、ヒープ・ダンプ・アクションを起動します。ヒープ・ダンプには、通常、オブジェクトの型およびサイズに関する詳細情報が含まれています。

これで、スタック・トレースの分析を開始できます。ヒープ内の不要なオブジェクトのブロックを見つけ、これらのオブジェクトを解放しないで蓄積するかどうかを判断します。Javaアプリケーションで特定のイベントがトリガーされるたびに割り当てられる一時オブジェクトを確認します。オブジェクト・インスタンスが多すぎる場合は、アプリケーションのバグを示している可能性があります。VisualVMの使用方法の詳細は、公式ドキュメントを参照してください。