jvm中关于slot的理解
- 参数值的存放总是在局部变量数组的index0开始,到数组长度-1的索引结束。
- 局部变量表,最基本的存储单元是slot(变量槽)
- 局部变量表中存放编译期可知的各种基本数据类型(8种),引用类型(reference), returnAddress类型的变量。
- 在局部变量表里,32位以内的类型只占用一个slot(包括returnAddress类型),64位的类型(long和double)占用两个slot。
- byte 、short 、char在存储前被转换为int,boolean也被转换为int,0表示false ,非0表示true。
- long和double则占据两个slot。
- JVM会为局部变量表中的每一个slot都分配一个访问索引,通过这个索引即可成功访问到局部变量表中指定的局部变量值
- 当一个实例方法被调用的时候,它的方法参数和方法体内部定义的局部变量将会按照顺序被复制到局部变量表中的每一个slot上
- 如果需要访问局部变量表中一个64bit的局部变量值时,只需要使用前一个索引即可。(比如:访问long或double类型变量)
- 如果当前帧是由构造方法或者实例方法创建的,那么该对象引用this将会存放在index为0的slot处,其余的参数按照参数表顺序继续排列。
代码演示如下:
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: