- GraalVM for JDK 23 (最新)
- GraalVM for JDK 24 (早期アクセス)
- GraalVM for JDK 21
- GraalVM for JDK 17
- アーカイブ
- 開発ビルド
実装の詳細
Espressoは、Truffleで実装された他の言語と同様に、ネイティブ実行可能ファイルとして、またはHotSpot上で(現在はLinuxでのみ可能)動作します。最初のケースでは、Espressoランタイムがネイティブ実行可能ファイルにコンパイルされると、Javaを実行するためにHotSpotは必要ありません。ただし、標準のコアJavaライブラリ(Java 8のrt.jarライブラリまたはJava 11以降のlib/modulesファイル、および関連するネイティブライブラリ:libjava
、libnio
など)が必要です。
Espressoは、以下を含むVMのすべてのコアコンポーネントを実装する縮小版のJava VMです。
- バイトコードインタプリタ
- バイトコードベリファイア
- 単一Javaクラスファイルパーサー
- シンプルなオブジェクトモデル
- Java Native Interface(JNI)のJavaでの実装
- Javaでの仮想マシン実装
- Java Debug Wire Protocol(JDWP)
Espressoは、GraalVMのすべてのJARファイルとネイティブライブラリを再利用します。すべてのネイティブライブラリとメソッドは、Truffle Native Function Interface (JNI)を介してロード/アクセス/呼び出しされます。JNIハンドルはEspressoで実装されており、たとえば、すべてのTruffle NFIメソッドはプリミティブのみを受信および返します。一部のメソッドはパフォーマンスのために置換されており、たとえば、Math.sqrt
、System.arraycopy
など、ネイティブへの高コストな移行を回避しています。
一部のネイティブライブラリには、複数のEspressoコンテキストから、またはHotSpotで実行されているEspressoとJavaの両方から使用した場合に競合する可能性のある静的データが含まれている場合があります。Linuxでは、Espressoは、分離された名前空間(dlmopen
)にライブラリをロードしようとするTruffle NFIの機能を使用します。これは、glibc
を使用するLinuxでのみ利用可能であり、多くの制限があります。ネイティブ実行可能ファイルで実行している場合は、HotSpotとの競合がないため、このモードは使用されません。
現在の制限事項 #
- Espressoは、JVM Tool Interface (JVMTI)を実装していません。その結果、
-agentlib
または-agentpath
VMオプションはサポートされていません。 - Espressoは、
java.lang.instrument
インターフェースを実装していません。その結果、-javaagent
VMオプションはサポートされていません。 - Espressoは現在、Javaコアライブラリの標準ネイティブライブラリを使用しています。これには、ポリグロット
Context
のネイティブアクセスを許可する必要があります。これらのライブラリのロード方法(Truffle NFIを介して)のため、HotSpotでの実行はLinux(glibc
を使用)でのみ機能します。ネイティブ実行可能ファイルの一部として実行する場合は、Linux、Windows、およびmacOSで機能しますが、現在、1つのコンテキストに制限されています。 - Java Management Extensions (JMX)のサポートは部分的であり、一部のメソッドは部分的なデータを返す場合があります。
- Debugger Protocol Implementation (JDWP)には、HotSpotと比較して一部の機能が不足しています。サポートされている機能は正しく報告されます。特に、すべてのJavaオブジェクトを列挙する必要があるアクションはサポートされていません。ただし、HotSpotがサポートしていないいくつかのホットリロードケースをサポートしています。
java.MultiThreaded
オプションが「false」に設定されている場合、参照処理は発生しません。アプリケーションによっては、これによりリソースリークが発生する可能性があります。Espressoがシングルスレッド言語が有効になっているコンテキスト(たとえば、JavaScript)で実行されている場合、このオプションは自動的に「false」に設定されることに注意してください。- EspressoはまだPolyglot APIをサポートしていません。ただし、
polyglot.jar
で説明されているゲストJava Polyglot APIを提供します。詳細については、Truffle言語との相互運用性を参照してください。