- スタックフレームバイトコード実行エンジンの紹介:Java仮想マシン(9)の深い理解

また、(コンパイラによって生成されるネイティブコードは、リアルタイムを実行する)実行可能ファイルをコンパイルしてもよい(インタプリタを介して実行するために)解釈されるJavaコードの実装では、実行エンジン内の別のJava仮想マシンでもあっても、両者の組み合わせであってもよいですまた、コンパイラの実行エンジンのいくつかの異なるレベルが含まれていてもよいです。

スタックフレームは、仮想マシンのメソッド呼び出し及び操作の方法のデータ構造は、仮想マシンがローカル変数テーブル方式、オペランドスタック、動的リンクとリターンアドレスおよび他の情報を格納し、仮想マシンのスタックのスタック要素が実行され、各メソッド最初からスタックフレームに、仮想マシンのスタックのスタックとスタックを実行対応を完了するためにコールします。コードのコンパイル時には、スタックフレームの方法は、多くのローカル変数テーブルを必要とし、オペランドスタックの多くが同定されており、およびメモリを割り当てる必要がどのくらい、プログラムはの影響を受けないようにする方法は、コード表の属性、スタックフレームを書き込み、ランタイムデータの影響は、唯一の特定の仮想マシンの実装に依存します。次のようにモデルは以下のとおりです。

 

 図1に示すように、ローカル変数テーブル

ローカル変数テーブル・ストレージ・スペースは、プロセス変数やパラメータを格納するための変数、ローカル変数のセットです。最小単位、仮想マシンの仕様ないメモリサイズ指定されたスロットが、として可変スロットスロットにローカル変数テーブルは、メモリは、ブール値、バイト、ショート、整数、フロート、文字などの32ビットのデータ・タイプを、ドロップであることがスロットを必要とし、参照、referenceAddress。リファレンスJava仮想マシンは、長さを指定しませんが、以下の二つの機能を達成することができなければなりません

1)直接または間接的に、Java仮想マシンの格納されたインデックスデータからスタックの先頭アドレスを検索します。

2)直接または間接的な参照は、オブジェクトの種類を検索する方法の領域に格納されるデータの種類に属します。デフォルト以外の店舗このポインタスロットの方法の第1例を呼び出すとき、順序定義記憶変数に応じて順次に格納されたパラメータと変数とスコープに従いました。カウンタの現在の値が変数の範囲を超えている場合は、スロットに対応する、この変数は、いくつかのケースでは、スロットの多重化は、GCの挙動に影響を与える、他の変数を使用することができます。

org.xiaofeiyang.classloaderパッケージ; 

/ **
* @author:陽春
* @description:
* @date:2019年11月24日午前7時03分に作成された
* /
publicクラスLocalVaribleTest {
公共の静的な無効メイン(文字列[] args){
バイト[] RES =新しいバイト【×1024×1024 64]。
System.gc();
}
}
如果改成
org.xiaofeiyang.classloaderパッケージ; 

/ **
* @author:陽春
* @description:
* @date:で作成した2019年11月24日午前7時03分
* /
publicクラスLocalVaribleTest {
パブリック静的無効メイン(文字列[] args){
{
バイト[]は新しい新しいバイトRES [* 1024 * 1024 64] =;
}
int型A = 0;
にSystem.gc();
}
}
メモリが回収されます。
ローカル変数およびクラス変数は、準備段階でゼロの値を割り当てたものと同じ、クラス変数ではない、全く割り当ては、初期化段階でもOKではありません。ローカル変数は初期値を許容できない割り当てられていません。
2、オペランドスタック
オペランドスタックを開始する方法が空の場合、バイトコード命令に書き込まれ、またはコンテンツの実行方法を抽出する過程で保持しています。オペランドスタック要素のデータ型が正確にバイトコード命令と一致している必要があり、プログラムがコンパイルされ、コンパイラは厳密にこのことを確認する必要があります。
スタック・フレームとの間でデータを共有するなど、追加のパラメータが場合コピー転送方法渡されないことを確実にします。

 

 3、ダイナミックリンク

各スタックフレームは、動的リンクメソッド呼び出しをサポートする参照を保持するスタックフレームに関連する方法の実行時定数プールへの参照を含みます。パラメータとしてメソッドに向けシンボル参照定数プールを呼び出すバイトコード命令の方法。これらのシンボルは、静的な解像度に変換された直接参照として使用される最初の時間やのクラスローディング・フェーズの一部を引用するのに翻訳します。他の部分は、動的リンクと呼ばれ、直接基準に各動作中に変換されます。

 

図4に示すように、この方法は、アドレスを返します

この方法は、2つだけの方法を返すように開始するために、第一の方法は、通常復帰と呼ばれる上位呼び出し元に結果を返すための命令に従って、エンジン遭遇をメソッドによって返される任意のバイトコード命令を実行することです。処理を行う第2の方法は、例外が発生し、それが異常なまたはスローされた例外athrow内部仮想マシンであるかどうか例外は、メソッド本体で対処されていない限り、一致する例外ハンドラを検索するテーブルに方法がないように、それは上部の呼び出し元には戻り値を返しません、方法が終了するようになります。どちらかと呼ばれるように位置に戻る必要性を終了し、実行方法のリターンを続けることができるプログラムは、その上部の復元方法ヘルプに状態の実現のためのスタックフレーム内のいくつかの情報を格納したいことがあり、カウンタPCとして呼び出し側のリターンアドレス、スタックフレームは、リターンアドレスがスタックフレームは、一般的にこの情報の一部を保存しないであろう、例外ハンドラテーブルによって決定される、異常終了し、この値を保存することができます。

方法出口プロセスがスタック出口可能な操作で現在のスタックフレームであり、それはローカル変数とオペランドスタックの上部と呼ばれるメソッドテーブルを復元することで、PCカウンタを調整し、呼び出し元のスタックフレームのオペランドスタックに結果を返します呼び出し側の次の命令を指します。

 

5.追加情報

主情報は、そのようなデバッグ情報として、Java仮想マシン仕様のために提供されていません

おすすめ

転載: www.cnblogs.com/xiaofeiyang/p/11921254.html