Java仮想マシン仕様(SE8) - Java仮想マシンの構造(III)

2.6。スタックフレーム

  データと部分的な結果を格納するための、また、動的リンク、戻り例外処理を実行するために値を割り当てるためのスタックフレーム。

  メソッドが呼び出されると、新たなスタックフレームを作成します。メソッド呼び出しの端部は、その対応するスタックフレームが破棄されるとき、それは(キャッチされない例外がスローされる)は、通常のまたは偶発通話が終了した終了したか否か。作成した仮想マシンのスレッドスタックに割り当てられたスタックフレーム。各クラスは、多くの場合、プール独自のローカル変数テーブル、オペランドスタック、及び基準電流方式の量を実行し、そのスタックフレームを有しています。

  あなたは、このようなデバッグ情報として、拡張フレームを達成するために、追加の具体的な情報を使用することができます

  ローカル変数とオペランドスタックテーブルコンパイル時に決定するため、およびコード関連するスタックフレームによって方法を提供します。したがって、それは、仮想マシン、およびこれらのメソッド呼び出しは、構造体を割り当てられたスタックフレームメモリのサイズに依存します。

  所与のスレッド上で、アクティブなスタックフレームの方法は、任意の時点で実行された場合にのみ。このフレームは、現在のフレームと呼ばれ、それは現在の方法であり、現在のクラスは、対応するクラスです。ローカル変数とオペランドスタックの動作は、一般的に、現在のフレーム上の操作のことをいいます。

  この方法は、フレームの別のメソッドを呼び出していない、またはこのメソッドのフレームが終わった後、フレームはもはや現在のフレームです。メソッドが呼び出されると、制御は、この新しい方法に転送される場合、新たなスタックフレームが作成され、フレームは、現在のフレームとなります。メソッドの戻りは、現在のフレームは、次にバックを送信し、そして前にそのメソッド呼び出しの結果(もしあれば)である場合に廃棄電流は、現在のフレーム、現在のフレームとなります。

  スレッド作成スタックフレームは、このスレッドの一部であることに注意して、他のスレッドは引用符で囲むことはできません。

2.6.1ローカル変数テーブル

  各スタックフレームは、そのローカル変数テーブルに参照される変数のセットが含まれています。アレイのローカル可変フレーム長は、コンパイル時に決定され、クラスまたはインタフェースのバイナリ表現は、フレームに関連する方法に格納された属性コードを提供しました。

  ローカル変数は、ブール、バイト、文字、ショート、整数、フロート、参照またはRETURNADDRESSの値を保存することができます。ローカル変数の一つのペアは、長いまたはダブルの値を保持することができます。

  ローカル変数テーブルのインデックスの位置。最初のローカル変数の指数はゼロです。0以上に少ないローカル変数テーブルの長さよりもより大きな整数は、ローカル変数テーブルのインデックス値である場合。

  長いまたは二重値は、最小値として二つの連続するローカル変数は、2つのだけの変数のインデックス値を検索するために使用され占めます。例えば、ローカル変数テーブルのインデックスnの二重値の存在は、それが実際にローカル変数の位置N + 1を占めているが、率n + 1に基づいて変数をロードしません。N + 1変数のインデックス値は、そう、ローカル変数nの内容を無効化するために、しかし、書き込むことができます。

  ローカル変数は、N、Java仮想マシンが連続整列ローカル変数に格納された64ビット・モードを使用して二重と長いデータ型に必要とされないnは必ずしも必要ではない偶数値である前述しました。仮想マシンの実装では、2つのローカル変数によって、二重または長期の値を格納するための適切な方法を自由に選択することができます。

2.6.2オペランドスタック

  各スタックフレームは、最後の最初のアウト(LIFO)スタック、すなわち、オペランドスタックを有しています。スタック・フレームのオペランドスタックの最大深さは、フレームが配置され、この属性コードの方法によって提供されるコンパイラによって決定されます。

  スタックフレームを作成したとき、彼のオペランドスタックが空です。Java仮想マシンは、オペランドスタックにロードまたは一定のフィールドまたは変数にローカル変数テーブルから一連の命令を提供します。いくつかの他の仮想マシン命令は、オペランドスタックオペランドから取得し、それらを操作し、その結果をオペランドスタックにプッシュされています。オペランドスタックは、ユーザに送信されるパラメータの方法および方法の結果を受け入れ準備ができています。

いつでも、オペランドスタックは、2つの深さの単位を長く、一定の深さを持っているか、ダブルで、唯一のタイプに深さの他のタイプになります。

  例えば、二つの数のユーザーint型を追加するための指示をIADD。それは、デジタルサムのスタック数の上位int型2つの操作が必要で、前の2つの数字が先行命令スタックのようにする必要があります。int型の値が2オペランドスタックからポップし、それらを追加し、オペランドスタックにプッシュ。副演算は、その結果は、周辺機器を使用して計算することができる、ネストされたオペランドスタックであってもよいです。

  メンバーそれぞれのプッシュ型とlong double型を含む、仮想マシンの任意の型を保持することができます。

2.6.3動的リンク

  各フレームは、メソッドコード(ダイナミックリンク)のリンク動的をサポートする現在の方法の実行時定数プールへの参照を含みます。1つのクラスファイルのコードへの道、シンボリック参照(シンボリック参照)を介してメソッド呼び出しと変数のアクセスを記述する。シンボルを解決するために、特定の基準変換メソッド参照方法の動的リンクのシンボル、必要に応じてロードするクラスが定義され、変数が位置におけるこれらの変数の動作に関する適切な記憶構造にアクセスをオフセットされていません。

2.6.4通常のメソッド呼び出しが完了しました

  メソッドの呼び出しが正常に呼び出しが例外をもたらさなかったという手段を完了し、どちらもJava仮想マシンは、特定のthrowステートメントを実行するために、直接スローされません。あなたは通常、現在のメソッドの完了を呼び出した場合、それは、呼び出し元に値を返すことがあります。方法は戻り値を表示されるリターン命令の特定の種類を実行するために呼び出されたとき、コマンドの戻り値型が返す命令に沿って選択されなければなりません。

  適切メソッド呼び出し命令をスキップするインクリメント発呼者の、プログラムカウンタと、この場合には、現在のフレームの目的は、ローカル変数とオペランドスタックを含む、呼び出し元の状態を復元するために使用されます。FR方法は、次に発呼者の通常の実行が再開され、戻り値(もしあれば)フレームのオペランドスタックにプッシュ。

2.6.5異常呼完了方法

  この方法は、コールの異常終了を意味し、仮想マシンに導いた方法を実行するJava仮想マシン命令は例外をスローし、例外がこの方法で処理されていません。また、現在のメソッドは、この例外をキャッチしていない場合は、例外が、ディスプレイをスローされることがあります命令の実行を投げ、メソッド呼び出しが異常終了しました。メソッド呼び出し異常終了は呼び出し元に値を返しません。

おすすめ

転載: www.cnblogs.com/lfw421935678/p/12576832.html