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