JAva仮想マシン構造(概要3)

2898 ワード

JAva仮想マシン構造(概要3)
1、スタックフレーム
スタックフレーム(frame)は、データおよび一部のプロセス結果を格納するためのデータ構造であり、動的リンク、メソッド戻り値、および異常割り当てを処理するためにも使用される.スタックフレームは、メソッドの呼び出しに伴って作成され、メソッドが終了するにつれて破棄されます.メソッドが正常に完了しても例外が完了しても(メソッド内でキャプチャされていない例外が放出されても)メソッドが終了します.スタックフレームの記憶空間は、java仮想マシンスタックに作成されたスレッドによって割り当てられ、各スタックフレームには独自のローカル変数テーブルと、現在のメソッドが属するクラスの実行時定数プールへの参照があります. java , , 。ローカル変数テーブルおよびオペランドスタックの容量は、コンパイル期間中に決定され、関連する方法のcode属性によってスタックフレームに保存および提供される.したがって、スタックフレームデータ構造のサイズはjava仮想マシンの実装にのみ依存し、実装者はメソッドを呼び出すときにメモリを割り当てることができる.スレッド実行中のある時点で、現在実行中のメソッドのスタックフレームのみがアクティブです.このスタックフレームを現在のスタックフレーム(current frame)と呼び、このスタックフレームに対応する方法を現在のメソッドと呼び、このメソッドを定義するクラスを現在のクラスと呼ぶ.ローカル変数テーブルおよびオペランドスタックの様々な動作は、通常、現在のスタックフレームのローカル変数テーブルおよびオペランドスタックに対する動作を指す.
1.1、局所変数表
各スタックフレームの内部には、ローカル変数テーブルと呼ばれる変数のリストが含まれています.スタックフレーム中の局所変数テーブルの長さはコンパイラによって決定され、クラスまたはインタフェースのバイナリ表現、すなわち方法のcode属性によってスタックフレームに保存および提供される.ローカル変数は、boolean、byte、char、short、int、float、reference、またはreturnAddressのタイプのデータを保存できます.2つのローカル変数は、longまたはdoubleのタイプのデータを保存できます.ローカル変数はインデックスを使用して位置決めアクセスを行います.最初のローカル変数のインデックス値は0です.ローカル変数のインデックス値は、ゼロ以上でローカル変数テーブルの長さ未満の整数です.longおよびdoubleタイプのデータは、2つの連続するローカル変数を占有し、この2つのタイプのデータ値は、2つのローカル変数の小さいインデックス値を用いて位置決めされる.JAva仮想マシンは、メソッド呼び出し時のパラメータ伝達を完了するためにローカル変数テーブルを使用します.メソッドクラスを呼び出すと、そのパラメータはローカル変数テーブルの0から始まる連続位置に順次渡されます.インスタンスメソッドを呼び出すと、0番目のローカル変数は、インスタンスメソッドが存在するオブジェクトの参照(java言語のthisキーワード)を格納するために使用されます.後続の他のパラメータは、ローカル変数テーブルの1から始まる連続位置に渡されます.
1.2、オペランドスタック
各スタックフレームの内部には、述語オペランドスタックと呼ばれる後進先出スタックが含まれている.スタックフレームにおけるオペランドスタックの最大深さはコンパイル期間によって決定され、方法のcode属性によってスタックフレームに保存および提供される.スタックフレームが作成されたばかりのとき、オペランドスタックは空です.JAva仮想マシンは、ローカル変数テーブルまたはオブジェクトインスタンスのフィールドから定数または変数値をオペランドスタックにコピーするバイトコード命令を提供し、オペランドスタックからデータを取り出すバイトコード命令も提供します.データを操作し、操作結果をスタックに再入力します.呼び出しメソッドでは、オペランドスタックも呼び出しメソッドのパラメータを準備し、受信メソッドが結果を返すために使用されます.オペランドスタックのデータは正しく動作する必要があります.任意の時点で、オペランドスタックには決定されたスタック深さがあり、1つのlongまたはdoubleタイプのデータは2単位のスタック深さを占め、他のデータタイプは1単位のスタック深さを占めます.
1.3、動的リンク
各スタックフレームの内部には、現在のメソッドが存在するタイプのランタイムプールへの参照が含まれ、現在のメソッドのコードに動的リンクを実装します.classファイルでは、他のメソッドを呼び出したり、メンバー変数にアクセスしたりするには、シンボル参照で表す必要があります.ダイナミックリンクの役割は、これらのシンボル参照で表されるメソッドを実際のメソッドへの直接参照に変換することです.クラスのロード中に、まだ解析されていないシンボル参照が解析され、変数へのアクセスがプログラムの実行時にストレージ構造に存在する変数のオフセット量に変換されます.
1.4、メソッド呼び出しの正常な完了
メソッド呼び出しの正常な完了とは、java仮想マシンから直接投げ出された例外と、実行時にthrow文で明示的に投げ出された例外を含む、メソッドの実行中に例外が投げ出されなかったことを意味します.現在のメソッド呼び出しが正常に完了した場合、呼び出しメソッドに値を返す可能性があります.メソッドの正常な完了メソッドの実行中にメソッドが返すバイトコード命令に遭遇した場合、どの戻り命令を使用するかは、メソッドの戻り値のデータ型に依存します.このようなシナリオでは、現在のスタックフレームは、呼び出し元のローカル変数テーブルとオペランドスタックを復元し、さっき実行したメソッド呼び出し命令をスキップするためにプログラムカウンタを正しくインクリメントするなど、呼び出し元の状態を復元する責任を負う.呼び出し元のコードは、呼び出されたメソッドの戻り値が呼び出し元スタックフレームのオペランドスタックに押し込まれた後も実行されます.
1.5、メソッド呼び出し異常完了
メソッド呼び出し例外完了とは、メソッドの実行中にjava仮想マシンから例外が投げ出され、仮想マシンから投げ出された例外がメソッドで処理されないか、実行中にathrowバイトコード命令に遭遇し、例外が明示的に投げ出され、メソッド内部で例外がキャプチャされないことを意味します.メソッド例外呼び出しが完了した場合、呼び出し元に値を返すメソッドはありません.