Java 仮想マシン 4 の構造

1 実行時データ領域

2コマ

2.1 ローカル変数

各フレーム ボックスには、ローカル変数と呼ばれる配列が含まれています。配列の長さはコンパイル時に決定され、バイナリ表現のクラスまたはインターフェイスのフレーム ボックスに対応するメソッド コードに従います。ローカル変数に割り当てられる値の型には、boolean、byte、char、short、int、float、reference、returnAddress が含まれ、ローカル変数のペアに割り当てられる値の型には、long、double (64 ビット) が含まれます。

ローカル変数はインデックスによってアドレス指定されます. 最初のローカル変数のインデックス値は 0 です. ローカル変数配列の長さを n とすると, そのインデックスの正当な範囲は 0 から n-1 です. long または double 値は、2 つの連続したローカル変数スペースを占有します。ローカル変数が配列の n インデックスに存在すると仮定すると、実際には位置 n および n+1 を占有します。したがって、n インデックス ビットまたは n+ を個別にロードすることはできません。 1 インデックス ビットの値は、全体として同時に n および n+1 インデックス ビットをロードする必要があります。

JVM は、メソッドの呼び出し中にローカル変数を使用してパラメーターを渡します。メソッドのパラメーターによって渡されるインデックス ビットは、インデックス ビット 0 から開始して連続しています。Java インスタンス メソッドの呼び出し中、インデックス ビット 0 はインスタンス自体です ( this)、その他のパラメータはインデックス ビット 1 から始まります。

2.2 オペランドスタック

各フレーム ボックスには、オペランド スタックと呼ばれる後入れ先出しスタックが含まれます. スタックの最大深度はコンパイル時に決定され、クラスまたはインターフェイスのフレーム ボックスに対応するメソッド コードに従います. 一般に,呼び出しのコンテキストは、現在のフレームのオペランドをオペランド スタックとして使用します。オペランド スタックは、作成時に空です。JVM は、定数、値、またはスコープをローカル変数からオペランド スタックにロードする命令を提供します。 . JVM 命令は、オペランド スタックからオペランドを取り出し、オペランドで命令計算を実行して結果を取得し、計算結果を次の JVM 命令のオペランドとしてオペランド スタックにプッシュします。メソッドのパラメーターを準備し、メソッドを受け入れます。返された結果。

たとえば、JVM 命令 iadd は 2 つの int 型の加算であり、そのオペランドは 2 つの int 型の値に対応します. int 型の値がスタックからポップされ、加算の計算が実行されて結果が取得されます. JVM は、計算の結果値を次の JVM 命令のオペランドとしてオペランド スタックにプッシュします。オペランド スタック内の型は、JVM 命令で指定されたオペランド型に準拠する必要があります.たとえば、型 int のオペランドは、型 long または double のパラメーターとして計算することはできません.オペランド スタックの深さの計算では、 long または double 型のオペランドは 2 単位の深さとして計算されますが、他のオペランドは 1 単位の深さとして計算されます。

2.3 動的リンク

各フレーム ボックスには、ランタイム定数プールへの参照が含まれています。これは、メソッド コードの動的リンクをサポートする現在のメソッドのタイプを参照します。メソッドのクラス クラス ファイル コードは、呼び出されたメソッドを参照し、シンボル参照を使用して関与します。動的リンクは、これらのシンボリック メソッドの参照を特定のメソッド参照に変換し、依存する必要があるクラスを読み込み、変数アクセスをメモリ ストレージ構造内の適切なオフセット アドレス (実行時の変数のアドレス) に変換します。

2.4 通常のメソッド呼び出しの完了

メソッド呼び出しは、JVM 型の例外またはコードによってスローされる例外なしで正常に完了します. メソッドが正常に実行できる場合、メソッドはメソッドの戻り値の型の値を正しく返すことができます. 現在のフレームには、関連する変数が含まれ、保存されます.呼び出し元とオペランド スタックに対して、JVM はメソッド呼び出しの戻り値をオペランド スタックに保持します。

2.5 メソッド呼び出しの突然の完了

JVM タイプの例外またはコードによってスローされた例外は、メソッド呼び出し中に発生します。例外がコードでキャッチされない場合、呼び出し元はメソッドによって返された結果を取得できません。メソッドの呼び出しプロセスは、例外呼び出し。

(つづく)

おすすめ

転載: blog.csdn.net/uesowys/article/details/129648835