2010-12-12 24 views
36

C++には複数の継承があります。アセンブリレベルでの多重継承の実装は非常に複雑ですが、これが正常に行われる方法(vtables、ポインタフィックスアップ、サンクなど)にはオンラインでdescriptionsが良いです。Javaインターフェイスはどのように内部実装されていますか? (vtables?)

Javaには複数の実装継承がありませんが、複数のインタフェース継承があるため、クラスごとに1つのvtableを使用した簡単な実装では実装できません。 Javaは内部的にどのようにインターフェイスを実装していますか?

私はJavaがJitコンパイルされていることを認識しています。したがって、異なるコードが異なるように最適化されている可能性があります。ですから、多くのJVMがこれに従う一般的な戦略があるのですか、あるいは特定のJVMの実装を知っている人はいますか?

また、JVMは仮想化とインラインのメソッド呼び出しを行うことがあります。その場合、vtableや同等のものはまったく含まれていないため、仮想/インターフェイスメソッド呼び出しを実装する実際のアセンブリシーケンスについて尋ねるのは理にかなっていませんが、 JVMは、すべてを偽造することができなかった場合でも、クラスの一般的な表現を使用しています。この仮定は間違っていますか?この表現はC++のvtableのように見えますか?もしそうなら、インタフェースには別々のvtableがあり、これらはクラスvtablesとどのようにリンクされていますか?もしそうなら、オブジェクトインスタンスはC++のオブジェクトインスタンスのような複数のvtableポインタ(クラス/インタフェースvtablesへ)を持つことができますか?同じオブジェクトへのクラス型とインタフェース型の参照は常に同じバイナリ値を持っているのでしょうか、あるいはポインタ補完を必要とするC++のように異なることがありますか? (参考:this questionは、私はJavaのための類似した何かを見つけることができていないCLRについて似た何かを要求し、それが今では時代遅れもよいがthis msdn articleで良い説明があるように見える。)

編集:

  • 私はJavaクラスArrayListの」の意味で、Listインタフェースを実装していない、「どのようにGCCコンパイラは、整数加算/機能は、/ etc呼び出しを実装しない」の意味での「道具」を意味"
  • これはJVMのバイトコードレベルでどのように動作するのかを知っています。クラスファイルのロードとバイトコードのコンパイルが完了した後、JVMによってどのようなコードとデータ構造が生成されるのかを知りたいと思います。
+2

あなたはインターフェイスの継承と実装の継承について言及します。実装の継承は、定義された検索順序を持つ必要があるため困難です。インターフェイスの継承は簡単です。実装する必要のあるすべてのメソッドシグネチャを持つマップがあります。検索オーダーは必要ありません(これに実装されている実装がないため)。そこには順序はありません。 – extraneon

答えて

25

ホットスポットJVMの重要な機能はinline cachingです。 これは、実際にターゲットメソッドがインライン化されていることを意味するのではなく、 という仮定がJITコードに入れられることを意味します。これは、今後、仮想メソッドまたはインターフェイスメソッドを呼び出すたびに 単形)。この場合、仮定が実際に保持されているかどうか(すなわち、対象オブジェクトのタイプが前回と同じかどうか)、 チェックがマシンコードにコンパイルされ、次に をターゲットメソッドに直接転送します。仮想テーブルはまったく関与していません。アサーションが失敗した場合、これをメガモフィックコールサイト(すなわち複数の可能なタイプ)に変換しようと試みることができる。これも失敗した場合(または最初の呼び出しである場合)は、vtables(仮想メソッド用)とitables(インタフェース用)を使用して、長時間のルックアップを定期的に実行します。

編集Hotspot WikiはvtableのとのITableスタブの詳細を持っています。多態的なケースでは、インラインキャッシュバージョンをコールサイトに配置します。ただし、コードは実際にvtableまたはitableでルックアップを実行するスタブです。 vtableオフセット(0,1,2、...)ごとに1つのvtableスタブがあります。 Interface calls与えられたオフセットでitable(見つかった場合)を調べる前に、itableの配列に対して線形検索を追加してください。

+0

VirtualCallsとInterfaceCallsのHotspot Wikiページが私が探しているようです。それでも、すべてのことを読むために周りを取得する必要があります。 – JanKanis

+1

Wikiがhttps://wikis.oracle.com/display/HotSpotInternals/Homeに移動されました –

+0

oracle wikiがフリーズしました。https://wiki.openjdk.java.net/display/HotSpot/Mainは更新可能な情報が終了しました。 – JanKanis

関連する問題