Espresso

GraalVMを使用すると、Javaアプリケーションを通常通りHotSpot上でネイティブイメージとして、そしてTruffle上で実行できます。

Espresso(Java on Truffleとも呼ばれる)は、Java仮想マシン仕様(Java SE 8Java SE 11Java SE 17Java SE 21)の実装であり、GraalVMを基盤とするTruffleインタプリタ上に構築されています。これは、VMのすべての主要コンポーネントを含む最小限のJava VMであり、Java Runtime Environmentライブラリ(libjvm.so)と同じAPIを実装し、既存の標準ライブラリを再利用します。実装の詳細を参照してください。

Espressoはオープンソースであり、そのコードベースはGitHubで公開されています。

Espressoは、Truffleフレームワーク(プログラミング言語のインタプリタを作成するためのオープンソースライブラリ)を使用して実装されたJavaバイトコードインタプリタを介してJavaを実行します。Espressoを使用すると、JavaはGraalVMエコシステムの他の言語(JavaScript、Python、Rubyなど)と同じ原理で実行され、それらの言語と直接相互運用し、同じメモリ空間でデータの送受信を行うことができます。完全な言語相互運用性の他に、Espressoでは、

  • ホストJava VMとは別のコンテキストでJavaバイトコードを実行できます。
  • GraalVMのPolyglot APIを使用して、Java 8、Java 11、Java 17、またはJava 21のゲストJVMを実行できます。たとえば、Java 21アプリケーションにJava 17コンテキストを埋め込むことができます。
  • これまでJavaでは利用できなかったTruffleフレームワークによって提供されるツールスタック全体を活用できます。
  • ホストJava VMとTruffle上で実行されるJavaプログラムの分離が向上するため、信頼性の低いゲストコードを実行できます。
  • ネイティブ実行可能ファイルのコンテキストで実行しながら、動的にロードされたバイトコードを許可できます。

EspressoはJava Compatibility Kit(JCKまたはJava SEのTCK)に合格しています。

はじめに #

Espressoは、Java 21環境を提供するスタンドアロンディストリビューションとして提供されています。Oracle GraalVMまたはGraalVM Community Editionに基づいたスタンドアロンをダウンロードできます。

  1. ご使用のオペレーティングシステム用のEspresso 24.0スタンドアロンをダウンロードしてください

  2. アーカイブを解凍します
     tar -xzf <archive>.tar.gz
    
  3. スタンドアロンには、ネイティブランチャーに加えてJVMが含まれています。バージョンを確認して、ランタイムがアクティブになっていることを確認してください。
     # Path to Espresso installation
     ./path/to/bin/java -truffle -version
    

EspressoでのJavaアプリケーションの実行 #

標準のjavaランチャーに-truffleオプションを渡すことで、EspressoでJavaアプリケーションを実行できます。これは、-client-server JVMを切り替える方法に似ています。

クラスファイルを実行するには

java -truffle [options] class

JARファイルを実行するには

java -truffle [options] -jar jarfile

モジュール内のメインクラスからJavaアプリケーションを実行したり、単一のソースファイルプログラムを実行することもできます。

java -truffle [options] -m module[/<mainclass>]
java -truffle [options] sourcefile

デフォルトでは、EspressoはすべてのGraalVMのJARファイルとネイティブライブラリを再利用してGraalVM内で実行されますが、「クロスバージョン」を行い、異なるJavaインストールディレクトリ(java.home)を指定することも可能です。ホストJVMに関係なく、自動的にバージョンを切り替えます。

java -truffle --java.JavaHome=/path/to/java/home -version

パフォーマンスに関する考慮事項 #

起動時間は、通常のGraalVMのJust-In-Time(JIT)実行で提供される速度にはまだ及びませんが、完全に機能するEspressoランタイムを作成したので、開発チームは現在、パフォーマンスに重点を置いています。次のオプションをjava -truffleに渡すことで、パフォーマンスに影響を与えることができます。

  • マルチティアコンパイルを有効にするには--engine.MultiTier=true
  • コンパイルを高速化するために--engine.Inlining=false--java.InlineFieldAccessors=trueを組み合わせて使用します。その代わり、パフォーマンスは低下します。

--vm.XX:構文は、オプションが基盤となるネイティブイメージVMに渡されることを保証します。-XX:構文を使用する場合、VMは最初にEspressoランタイムにそのようなオプションが存在するかどうかを確認します。存在しない場合、このオプションを基盤となるネイティブイメージVMに適用しようとします。これは、MaxDirectMemorySizeなどのオプション(両方のレベルで独立して設定できる)にとって重要になる可能性があります。-XX:MaxDirectMemorySize=256Mは、Espresso(ゲストVM)で実行されているJavaプログラムによって予約できるネイティブメモリの量を制御し、--vm.XX:MaxDirectMemorySize=256Mは、ネイティブイメージ(ホストVM)によって予約できるネイティブメモリの量を制御します。

アプリケーションの実行開始 #

コマンドラインから

Espressoが正常にインストールされたことを確認するには、そのバージョンを確認してください。

# Path to Espresso installation
./path/to/bin/java -truffle -version

このHelloWorld.javaの例では、コンパイルしてコマンドラインから実行します。

public class HelloWorld {
  public static void main(String[] args) {
    System.out.println("Hello, World!");
  }
}
$JAVA_HOME/bin/javac HelloWorld.java
$JAVA_HOME/bin/java -truffle HelloWorld

現実世界のアプリケーションとしては、Spring PetClinic(Spring BootとSpring MVC、Spring Data JPAの使用を示すサンプルWebアプリケーション)を実行してみてください。

  1. プロジェクトをクローンし、プロジェクトのディレクトリに移動します。
    git clone https://github.com/spring-projects/spring-petclinic.git
    cd spring-petclinic
    
  2. JARファイルを作成します(Spring PetClinicはMavenで構築されています)。
    ./mvnw package
    
  3. 次に、-truffleランタイムを選択して、コマンドラインから実行します。
    java -truffle -jar target/spring-petclinic-<version>-SNAPSHOT.jar
    
  4. アプリケーションが開始したら、localhost:8000でアクセスします。

IDEから

IDEからEspressoでJavaプロジェクトを実行するには、プロジェクトのデフォルトJDKとしてGraalVMを設定し、Espresso実行モードを有効にする必要があります。たとえば、Intellij IDEAを使用してSpring PetClinicプロジェクトを実行するには、

  1. ファイル、次にプロジェクト構造に移動します。プロジェクトをクリックし、プロジェクトSDKをクリックします。ドロップダウンを展開し、JDKを追加を押して、GraalVMをインストールしたディレクトリを開きます。macOSユーザーの場合、JDKホームパスは/Library/Java/JavaVirtualMachines/{graalvm}/Contents/Homeになります。名前を付けて、適用を押します。

    Intellij IDEA: Add Project Name

  2. プロジェクトのソースとフォルダを生成して更新します。Mavenサイドバーで、スピナーアイコンが付いたディレクトリをクリックします。

    Intellij IDEA: Generate Project Sources

  3. Espressoを有効にします。メインメニューから実行、次に実行…を選択します。構成の編集をクリックし、環境を選択します。VMオプション-truffle -XX:+IgnoreUnrecognizedVMOptionsコマンドを入力し、適用を押します。

    Intellij IDEA: Enable Environment Configuration

-XX:+IgnoreUnrecognizedVMOptionsを指定する必要があるのは、Intellijが自動的にまだサポートされていない-javaagent引数を追加するためです。

  1. 実行を押します。

デバッグ #

お気に入りのIDEデバッガからEspressoを実行しているJavaアプリケーションをデバッグするために、特別な設定を行う必要はありません。たとえば、IntelliJ IDEAからデバッガセッションを開始することは、実行構成に基づいています。同じ環境でデバッガをJavaアプリケーションに接続するようにするには、メインメニューで実行 -> デバッグ… -> 構成の編集に移動し、環境を展開して、JRE値とVMオプション値を確認します。プロジェクトのJREとしてGraalVMが表示され、VMオプションには-truffle -XX:+IgnoreUnrecognizedVMOptionsが含まれている必要があります。ここで、-truffleはEspressoを有効にし、-XX:+IgnoreUnrecognizedVMOptionsは、EspressoランタイムがまだJavaエージェントの接続をサポートしていないための一時的な回避策です。

Intellij IDEA: Debug Configuration

Espressoは、GraalVMエコシステムの他の言語とのシームレスなJava相互運用性を可能にします。他の言語で記述されたコードのロード方法、言語間のオブジェクトのエクスポートとインポート方法などを学ぶには、Truffle言語との相互運用性ガイドを参照してください。

実装アプローチ、プロジェクトの現在の状況、および既知の制限事項について学ぶには、実装の詳細に進みます。

Eclipse IDE、Scala、またはその他の言語のREPLなど、いくつかの大規模アプリケーションをEspresso実行モードで既に実行できます。デモアプリケーションのコレクションをご覧ください。

ご質問がある場合は、利用可能なFAQを確認するか、GraalVM Slack#espressoチャンネルで直接お問い合わせください。

つながりましょう