局部变量表也称为局部变量数组或局部变量表
1 .概要
1 .定义为主要用于存储方法参数和方法中定义的局部变量的数字数组。 这些数据类型主要包括各种基本数据类型、对象引用和返回地址类型
2 .局部变量表是堆栈帧的一部分,堆栈帧位于线程堆栈上,是线程的私有数据,所以没有数据安全问题
3 .局部变量表的大小是在编译时确定的,并保存在方法的Code属性的maximum local variables数据项中。 方法执行期间局部变量表的大小不变
4 .局部变量表中的变量仅在当前方法调用中有效,当方法运行时,虚拟机使用局部变量表完成参数值到参数变量列表的传递。 方法调用结束后,如果堆栈帧被丢弃,则局部变量表也会被丢弃。
2 .局部变量表与堆栈大小的关系
方法的嵌套调用次数由堆栈大小决定。 一般来说,堆栈越大,嵌套调用的次数就越多。 但是,这是相对的。 这是因为,一个方法的参数和局部变量较多时,局部变量表会膨胀,堆栈帧会变大,而相同堆栈大小所能容纳的堆栈帧会变少。
3 .局部变量表的拆分
1 .局部变量表最基本的存储单元是Slot
2 .在局部变量表中,32位以内的类型占用一个slot (包括return address ),64位类型) long和double )占用两个slot
3.jvm为局部变量表中的每个slot分配一个访问索引。 使用此索引可以成功访问在局部变量表中指定的局部变量的值
4 .调用实例方法时,该方法参数和方法中定义的局部变量将按顺序复制到局部变量表中的每个slot
5 .如果当前帧是通过构造方法或实例方法创建的,则对象引用this存储在索引为0的slot中,其馀参数继续按参数表顺序排列
4.slot复用问题
堆栈帧中局部变量表的槽位是可重用的,如果局部变量超出了作用域,则在该作用域之后wxdpj中的新局部变量很可能会重用过期局部变量的槽位,从而节省资源
5 .静态变量和局部变量的比较
1 .我知道类变量有两次初始化的机会。 第一次是链接的准备阶段,执行系统的默认初始化,设定零值。 第二个是初始化阶段(),它为程序员提供代码中定义的初始值
2 .局部变量表中没有系统初始化过程。 这意味着一旦定义了局部变量,就需要人为地显示初始化。 否则,会出现编译错误
补充说明
堆栈帧中与性能调整关系最密切的部分是局部变量表,在执行方法时,虚拟机使用局部变量表完成方法的传递。 此外,堆栈框架的大部分区域都是局部变量表,其大小也影响堆栈可以容纳的堆栈框架的数量
局部变量表中的变量也是重要垃圾回收的根节点,不会回收局部变量表中直接或间接引用的对象