実装の詳細

Espressoは、Truffleで実装された他の言語と同様に、ネイティブ実行可能ファイルとして、またはHotSpot上で(現在はLinuxでのみ可能)動作します。最初のケースでは、Espressoランタイムがネイティブ実行可能ファイルにコンパイルされると、Javaを実行するためにHotSpotは必要ありません。ただし、標準のコアJavaライブラリ(Java 8のrt.jarライブラリまたはJava 11以降のlib/modulesファイル、および関連するネイティブライブラリ:libjavalibnioなど)が必要です。

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.sqrtSystem.arraycopyなど、ネイティブへの高コストな移行を回避しています。

一部のネイティブライブラリには、複数のEspressoコンテキストから、またはHotSpotで実行されているEspressoとJavaの両方から使用した場合に競合する可能性のある静的データが含まれている場合があります。Linuxでは、Espressoは、分離された名前空間(dlmopen)にライブラリをロードしようとするTruffle NFIの機能を使用します。これは、glibcを使用するLinuxでのみ利用可能であり、多くの制限があります。ネイティブ実行可能ファイルで実行している場合は、HotSpotとの競合がないため、このモードは使用されません。

現在の制限事項 #

  • Espressoは、JVM Tool Interface (JVMTI)を実装していません。その結果、-agentlibまたは-agentpathVMオプションはサポートされていません。
  • Espressoは、java.lang.instrumentインターフェースを実装していません。その結果、-javaagentVMオプションはサポートされていません。
  • 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言語との相互運用性を参照してください。

お問い合わせ