jvmのスロットの理解

jvmのスロットの理解

  • パラメータ値の格納は、常にローカル変数配列のindex0から始まり、配列の長さ-1のインデックスで終わります。
  • ローカル変数テーブル、最も基本的なストレージユニットはスロット(変数スロット)
  • ローカル変数テーブルには、さまざまな基本データ型(8種類)、参照型(参照)、およびコンパイル時に認識できるreturnAddress型の変数が格納されます。
  • ローカル変数テーブルでは、32ビットタイプは1つのスロット(returnAddressタイプを含む)のみを占有し、64ビットタイプ(longおよびdouble)は2つのスロットを占有します。
    • Byte、short、charは格納前にintに変換され、booleanもintに変換されます。0はfalse、0以外はtrueを意味します。
    • ロングとダブルは2つのスロットを占有します。
  • JVMはローカル変数テーブルの各スロットにアクセスインデックスを割り当てます。このインデックスを通じて、ローカル変数テーブルで指定されたローカル変数値に正常にアクセスできます
  • インスタンスメソッドが呼び出されると、そのメソッドのパラメーターとメソッド本体で定義されたローカル変数が、ローカル変数テーブルの各スロットに順番にコピーされます。
  • ローカル変数テーブルの64ビットのローカル変数値にアクセスする必要がある場合は、以前のインデックスを使用するだけで済みます(例:longまたはdoubleタイプの変数にアクセスする)
  • 現在のフレームがコンストラクターまたはインスタンスメソッドによって作成された場合、これを参照するオブジェクトはインデックス0のスロットに格納され、残りのパラメーターはパラメーターリストの順序で配置され続けます。

ここに画像の説明を挿入

コードは次のように示されます。

package com.lbl.LocalVariables;

import java.util.Date;

public class LocalVariablesSoltTest {
    
    
    int count = 0;

    //关于slot的使用理解
    public void test01() {
    
    
        count = 1;
    }

    //this在index0处
    public void test02(){
    
    
        Date date = new Date();
        String s="lbl";
        System.out.println(s+date);
    }

    //double占两个slot
    public void test03(){
    
    
        Date date = new Date();
        double d=2.3;
        String s="lbl";
        System.out.println(s+date);
    }

}

図:

test01:

ここに画像の説明を挿入

test02:

ここに画像の説明を挿入

test03:

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/qq_37924905/article/details/108761222