虚拟机栈
内存中的栈和堆
栈时运行时的单位,堆是存储的单位 即:栈解决程序运行问题,即程序如何执行,或者说如何处理数据,堆解决的是数据存储的问题,即数据怎么放,放哪里
虚拟机栈生命周期
虚拟机栈是随着线程的产生而产生,是线程私有的,当主线程结束随即消亡吗,所以生命周期和线程一致
作用
主管java程序的运行,它保存方法的局部变量(8中基本数据类型,对象的引用地址)、部分结果,并参与方法的调用和返回
栈的特点:
- 栈是一种快速有效的分配存储方式,访问速度仅次于程序计数器
- JVM直接对Java栈的操作只有两种,每个方法执行,伴随者进栈,和执行结束后的出栈工作,栈不存在垃圾回收的问题
栈帧的内部结构
局部变量表
- 局部变量表也称为局部变量数组或本地变量表
- 定义为一个数字数组,主要用于存储方法参数和定义在方法体内部的局部变量,这些数据类型包括基本引用类型、对象引用,以及returnAddress;
- 由于局部变量表是建立在线程的栈上,是线程的私有数据,因此不存在数据的安全问题。
- 局部变量表所需的容量大小是在编译期确定下来的,并保存在方法的Code属性的maxmum local variables数据项中,在方法运行期间是不会改变局部变量表大小的
关于Slot的理解
- 局部变量表最基本的存储单元是Slot(变量槽)
- 局部变量表中存放编译期可知的各种基本数据类型(8种),引用类型(reference),returnAddress类型的变量。
- 局部变量表里,32位以内的类型占用一个slot,64位的类型占用两个slot.
- JVM为局部变量表中的每一个slot都分配一个访问索引,通过这个索引即可成功访问到局部变量表中指定的局部变量值
- 如果需要访问局部变量表中一个64bit的局部变量值,只需要使用前一个索引即可。
- 如果当前帧是由构造方法或者实例方法创建的,那么该对象应用this将会放在index为0的slot处,其余的参数按照参数表顺序继续排列。