スタックフレームのランタイムに記載の方法

方法5スタックフレームのランタイム

  • スタックフレームは、仮想マシンの呼び出しスタックを実行するための仮想マシンのデータ構造は、スタック内の要素のスタックです。
  • 保存の方法のスタックフレームローカル変数テーブルオペランドスタック動的リンクは方法は、アドレスを返し情報等が挙げられます。
  • コールスタックの仮想マシンのスタックフレーム内のプッシュとポップ操作で、各メソッドの対応を返します。
  • スタックフレームのローカル変数テーブルのサイズはオペランドスタックの深さは、コンパイル時に識別されます。したがって、メモリ・スタック・フレーム・サイズが決定されています。
  1. ローカル変数テーブル

    • ローカル変数テーブルの格納方法のパラメータ及び方法で定義されたローカル変数を
    • ローカル変数テーブルの基本単位として可変スロット(スロット)に、スロットの大きさは、特定の実装に応じて、通常は32/64です。
    • ダブル、長い2つのスロット中に存在してもよいです。
    • スロット存储:ブール、バイト、文字、短い、int型、float型、参照、ダブル、RETURNADDRESS、長いです。
      • 参照によって直接的または間接的に見ることができるオブジェクトへの参照、の代表的なヒープ位置におけるオブジェクトとストレージ・オブジェクトのタイプは、処理ゾーンに属する情報のタイプ
    • 完了方法は、ローカル変数テーブルによって行わ通過可変引数リストに値処理。オブジェクト(すなわち、この基準)のストレージ・スロットの非静的インスタンスのための方法。
    • スロットを再利用することができる変数は、変数の範囲を超えたスロットに格納することができた後、。
    • ローカル変数はクラス変数とは異なり、(デフォルトの初期値を伴う)準備段階に存在し、そのためには、初期化する必要があります
  2. オペランドスタック

    • JVM実行エンジンは、スタック構造、現在実行中の操作指示の数を格納するオペランドスタックの使用です。
    • 例えば、対応する追加操作:スタックの上位2つのスタック要素は、添加後、結果はスタック。
    • オペランドスタックに保存されている要素は厳密にバイトコード命令に対応している必要があります。
  3. メソッドの戻りアドレス

    • この方法は、唯一の2つの方法で終了します。
      • この方法は、コマンドを返しますアッパーメソッドの呼び出し元に値を返すことがあります。
      • 未処理の例外:上位呼び出し元には戻り値はありません。
    • ときにメソッドが終了スタックから現在のスタックフレームに相当:
      1. ローカル変数、オペランドスタックの上位テーブルの回復の方法。
      2. そして、発信者のオペランドスタックの上にいくつかの戻り値に設定します。
      3. PCレジスタを調整します。
  4. メソッド呼び出し

    • 各スタックフレームは、実行時定数プール参照へのポインタを含むスタックフレームは、アプローチに属し、この参照方法は、ダイナミック・リンク・コールを実施するために使用されます。

    • どの呼び出し方法を確認するために使用されています。でコンパイルされたクラスファイルは、参照のみを呼び出すことの象徴方法を保存します。そのため、あなたは直接参照する方法を決定するために実行クラスを/ロードする必要があります。

    • 直接確認クラスローディング位相基準 :(得直接参照プロセスを解析と呼ばれます)

      • このようなプロセスは、変更せずに実行する必要があります
      • 主:静的メソッド、プライベートメソッド、インスタンスコンストラクタ、スーパー方法、ファイナルアプローチ。
      • そのような方法は、継承によって他のバージョンを上書きするか、そうでなければすることができません。解析段階バージョンは、一意の呼を決定します。
    • ランタイム確認への直接参照 :(派遣と呼ばれる)を

      • 静的割り当て

        • Java メソッドのオーバーロードは、静的な割り当てで、静的な割り当ては、コンパイル時に発生します。

        • この方法は、方法を見つけるために、静的な型パラメータに依存しているの過負荷。

          • Human man=new Man();
            //Human是静态类型,是编译器可知的。
            //Man是实际类型,是运行时才可知的。
            void say(Human human){}
            void say(Man man){}
            //若调用上述两个重载的方法
            say(man);//根据man的静态类型是Human则调用的实际上是第一个方法
            say((Man)man);//强制类型转换导致了man的静态类型变换调用的是第二个
        • 静的な型のマッチング順:char-> INT->長期>フローティング状態>ダブル>包装 - >親クラスまたはインタフェース - >可変引数

      • ダイナミックディスパッチ

        • Javaの書き換え処理は、動的な割り当てです。

        • たとえば、オブジェクトのメソッドを呼び出すには:

          • オブジェクトの実際の型を探していることで、この方法は、実際の種類を見つけるために
            • 発見:裁判官のアクセス
            • 私は見つけられませんでした:その親クラスのすべてを見ています。
        • したがって多型は、オブジェクト自体は、親クラスに続くバージョンを、書き換えられた優先呼でオーバーライドされたメソッドを呼び出します。

        • 毎回なので、あなたは、プロセス領域で仮想メソッドテーブルと呼ばれるデータ構造を作成するように、ダイナミックリンクを見つける必要があります。効率を改善するために探しています。

        • これは、テーブル内のレコードのすべてのメソッドではありません。これは、動的ディスパッチサービス、コンストラクタおよび静的メソッドで、プライベートメソッドは記録されません。

公開された27元の記事 ウォンの賞賛1 ビュー900

おすすめ

転載: blog.csdn.net/hu853996234/article/details/103771128