ホームページ >Java >&#&チュートリアル >Java 仮想マシン スタック フレームの概要 (画像とテキスト)
この記事では、Java 仮想マシンのスタック フレームについて説明します (写真とテキスト)。必要な方は参考にしていただければ幸いです。あなたに。
前に書いた: Java 仮想マシンは科学であり、多くの Java マスターの傑作であるため、私の個人的なレベルとエネルギーが限られているため、ここでの内容がすべて正しいかどうかは保証できません。慎重に検討した結果、次のようになります。内容の一部は原作から引用していますが、これはすでに非常に優れているので、繰り返しません。もちろん、ここではすべての詳細を詳細に分析することは不可能です。コンピューター構成の原理が深く理解されていないため、それらのほとんどはブラック ボックス理論を使用して分析することしかできません。
実行時のスタック フレーム構造 (スタック フレームとは何ですか?)
スタック フレームは、仮想マシンが呼び出しやメソッドの実行を行うために使用されるデータ構造です。簡単に言うと、スタック フレーム 実際には、JVM ランタイム データ領域の仮想マシン スタック (JVM スタック) のスタック要素であり、各メソッドの実行と呼び出しがスタック フレームに相当します。簡単な例を挙げると、スタックを定義し、スタック フレームと呼ばれるいくつかのオブジェクトをこのスタックに配置します。このオブジェクトには、 ローカル変数テーブル、オペランド スタック、ダイナミック リンク、メソッドの戻りアドレス などのプロパティが含まれています。次に、スタック フレーム オブジェクトの構造について説明します。
まず、スレッド内のメソッドの呼び出しチェーンは非常に長くなる可能性があり、多くのメソッドが実行状態にあることを理解する必要があります。実行エンジンでは 1 つのみが実行状態になります。スタックの先頭が有効です。これを現在のスタック フレーム (Concurrent Satck Frame) と呼びます。このスタック フレームに関連するメソッドは、現在のメソッド (Concurrent Method) と呼ばれます。
スタック フレームの概念モデルを通して、スタック フレーム オブジェクトの関連する属性について話しましょう。データ構造とは何ですか?1. ローカル変数テーブル
これは、メソッドと内部メソッドを保存するために使用される変数のセットの記憶領域です。ローカル変数テーブルの最大容量の割り当ては、Java のコンパイル時に完了します。ローカル変数テーブルは、ローカル変数を格納するテーブルであり、その容量は変数スロット (Variable Slot) によって決まります。スロットとも呼ばれます)。スロットは最小単位でもあります。関連情報については、Zhou Zhiming の『Java 仮想マシン 2 版の詳細』P238 を参照してください。以下は、関連するタイプのデータによって占有されるメモリ領域です。##図からわかるように、double とlong を除く基本的なデータ型は 2 つの 32 ビット (つまり 2 スロット) に分割されて格納されます。つまり、他の型は 32 ビット スロットを 1 つだけ占有しますが、
参照型は 32 ビットまたは 64 ビットの場合がありますが、これは Java では明確に指定されていません。では、仮想マシンはどのようにしてローカル変数にアクセスするのでしょうか?
仮想マシンは、インデックス配置方式を通じてローカル変数テーブルを使用します。インデックス値の範囲は 0 からスロットの最大数です。メソッドが実行されるとき、特にインスタンス メソッドが実行されるとき、インスタンス変数テーブル
の 0 番目のインデックスは、メソッドが属するインスタンス オブジェクトの参照「this」オブジェクトにデフォルト設定され、その後に 1 が Slot パラメータに設定されます。メソッドへの変数 内部ローカル変数。さらに、スタック フレーム スペースを節約するために、ローカル変数のスロット、つまりメソッド パラメータとメソッド内のローカル変数を再利用できます。 =スロットの最大数。スロットは再利用できるため、スペースのオーバーヘッドを節約するだけでなく、システムのガベージ コレクションにおいて予期せぬ役割も果たします。 P2392 を参照してください。オペランド スタック (オペランド スタック)
オペランド スタックは後入れ先出しスタック (LIFO) です。基本的な原則は、メソッドの実行時のスタック容量は、32 ビット データ型の場合は 1、64 ビット データ型の場合は 2 です。オペランドスタックは、max_statcks データ項目の最大値を超えません。 P242を参照して以下にまとめます。
2. Java 仮想マシンは、一部のデータをオペランド スタックにプッシュするための命令を提供します。たとえば、ローカル変数テーブル、インスタンス フィールド、およびその他のデータをスタックにプッシュできます。
3. ポップ操作をサポートする命令もあります。
4. 他のメソッドに渡されるパラメータもオペランド スタックに存在します。
5. 他のメソッドによって返された結果は、返されたときにオペランド スタックに格納されます。
6. スタック フレーム内の一部のオペランド スタックと前のスタック フレームのローカル変数の間には、主にデータの共有のため、ある程度の重複があります。
3.ダイナミックリンク各スタック フレームには、ランタイム定数プール内のスタック フレームに関連付けられたメソッドへの参照が含まれており、メソッド呼び出し中の動的接続をサポートするために保持されます。クラス ファイルの定数プールには多数のシンボル参照があり、バイトコード内のメソッド呼び出し命令は、定数プール内のメソッドを指すシンボル参照をパラメータとして受け取ります。これらのシンボリック参照の一部は、クラスの読み込みフェーズ中、または初めて使用されるときに直接参照に変換されます。この変換は静的解決と呼ばれます。他の部分は各実行時に直接参照に変換され、この部分は動的接続と呼ばれます。
4. メソッドの戻りアドレス
メソッドが実行されたとき、メソッドを終了するには 2 つの方法があります。 1 つ目の方法は、実行エンジンが任意のメソッドによって返されたバイトコード命令に遭遇した場合、上位のメソッドの呼び出し元 (現在のメソッドを呼び出すメソッドを呼び出し元と呼びます) に渡される戻り値がある可能性があります。戻り値? 戻り値の型は、どのメソッド復帰命令が発生したかに基づいて決定されます。このメソッド終了メソッドは、通常のメソッド完了終了 (通常メソッド呼び出し完了) と呼ばれます。
もう 1 つの終了方法は、メソッドの実行中に例外が発生し、その例外が Java 仮想マシン内で生成された例外であるか、メソッド内で athrow を使用しているかにかかわらず、メソッド本体内で処理されない場合です。バイトコード命令によって生成された例外は、このメソッドの例外テーブルに一致する例外ハンドラーが見つからない限り、メソッドを終了させます。この終了メソッドは、突然メソッド呼び出し完了と呼ばれます。メソッドが例外完了出口を使用して終了する場合、その呼び出しに対する戻り値は生成されません。
どのメソッドを使用して終了するかに関係なく、メソッドが終了する前に、プログラムが実行を続行できるように、メソッドが呼び出された場所に戻る必要があります。メソッドが戻ったときに、次の操作が必要になる場合があります。上位レベルのメソッドの実行ステータスをスタック フレームに保存します。一般に、メソッドが正常に終了した場合、呼び出し元の PC カウンタの値を戻りアドレスとして使用でき、このカウンタ値はスタック フレームに保存される可能性が高くなります。メソッドが異常終了した場合、戻りアドレスは例外ハンドラーによって決定される必要があり、情報のこの部分は通常、スタック フレームに保存されません。
メソッド終了のプロセスは、実際には現在のスタック フレームをポップすることと同等です。したがって、終了時に実行される操作には、上位メソッドのローカル変数テーブルとオペランド スタックの復元、および戻り値の返しが含まれます。 value (存在する場合) が呼び出し側スタック フレームのオペランド スタックにプッシュされ、メソッド呼び出し命令に続く命令を指すために PC カウンタの値が呼び出されます。
5. 追加情報
仮想マシンの仕様では、特定の仮想マシンの実装で、仕様に記載されていない情報をスタック フレームに追加できます。高さ 関連情報。情報のこの部分は、特定の仮想マシンの実装に完全に依存します。実際の開発では、動的接続、メソッドの戻りアドレス、およびその他の追加情報は、通常、スタック フレーム情報と呼ばれる 1 つのカテゴリにグループ化されます。
以上がJava 仮想マシン スタック フレームの概要 (画像とテキスト)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。