JVMオペランドスタック - 実行中のプロセスの詳細な説明

オペランド スタック (オペランド スタック) は、操作スタックとも呼ばれ、後入れ先出し (LIFO) スタックです。メソッドおよびバイトコード命令の実行により、定数または変数がローカル変数テーブルまたはオブジェクト インスタンスのフィールドからコピーされてオペランド スタックに書き込まれ、スタック内の要素が計算としてローカル変数テーブルにポップされます。続行するか、メソッドの呼び出し元に戻ります。つまり、ポップ/プル操作です。
次のコードによるオペレーター ステーションの実行を示します。

public class StackDemo2 {
    
    
    public static void main(String[] args) {
    
    
        int i = 1;
        int j = 2;
        int z = i + j;
    }
}

プログラムの実行中

  • 1): プログラム カウンタは、ポインタを実行するために対応するオフセットを見つけます。
    ここに画像の説明を挿入
  • 2): プログラムが初めて実行され、0 番目のアドレスが検索されます (0 はプログラム カウンタによって取得されます)。
    ここに画像の説明を挿入
  • 3): プログラム カウンタが最初の位置 0 を取得したら、対応する最初の保存コマンドを取得する必要があります。
    ここに画像の説明を挿入
  • 4): (int i =1) オペランドスタックに「1」が定義されています
    ここに画像の説明を挿入
    1. : a-offset は下がり続けます (1 がカウンターに再割り当てされます)。

ここに画像の説明を挿入
b- 2回目の退避命令(オペランドスタックの1をローカル変数テーブルにコピーする処理)を実行します。
ここに画像の説明を挿入

  • 6): 次にポインタは下がり続けますので、上記1~5の処理を繰り返します(int j=2)
    ここに画像の説明を挿入
    ここに画像の説明を挿入
    ここに画像の説明を挿入

  • 7): ローカル変数テーブルの 1 がオペランド スタックにロードされます。
    ここに画像の説明を挿入

  • 8): ローカル変数テーブルの 2 がオペランド スタックにロードされます。
    ここに画像の説明を挿入

  • 9): add i + j = 3 を実行します。
    ここに画像の説明を挿入

  • 10): オペランドスタックを追加した後の結果 3 をローカル変数テーブルに保存します。
    ここに画像の説明を挿入

  • 11): 戻る
    ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/qq_31686241/article/details/128063634