1.1什么是jvm栈
虚拟机栈:jvm中用于主管java程序的运行,它保存方法的局部变量,部分结果,并参与方法的调用和返回的栈。
1.2jvm栈的优缺点
优点:跨平台,指令集小,编译器容易实现
缺点:性能下降,实现相同操作需要更多指令。快速有效的分配存储方法,访问速度仅次于PC寄存器。只有入栈和压栈,没有垃圾回收问题,存在OOM问题
1.3jvm栈的介绍
区分于堆主要是,栈存放运行时单位,堆是存储的单位
是线程私有的,声明周期与线程保持一致
线程请求分配的栈容量超过java虚拟机栈允许的最大容量,java虚拟机将会抛出StackOverflowError
如果java虚拟机可以动态扩展,并且在尝试扩展的时候无法申请到足够的内存,或者在创建新的线程是没有足够的内存去创建对应的虚拟机栈,那java虚拟机将会抛出一个OutOfMemoryError
1.4栈中存放什么
每个线程都有自己的栈,栈的数据是栈帧。
而每个方法都各自对应一个栈帧,栈帧是一块内存块,是一个数据集,维系着方法执行过程中的各种数据信息
当前执行的方法的栈帧是当前栈帧,当前方法所属类为当前类,执行引擎运行的所有字节码指令只针对当前栈帧
如果该方法调用了其他方法,则会创建新的栈帧,放在栈的顶端
1.5栈运行原理
不同线程不能使用同一个栈帧,线程隔离了不同的栈。
当前方法执行其他方法,方法返回之际,当前栈帧返回此方法结果。
不管是方法正常return还是抛出异常。栈帧都会被弹出
1.6栈帧的内部结构
局部变量表,操作数栈(表达式栈),动态链接(指向运行时常量池的方法引用),方法返回地址(方法正常退出或者异常退出),一些附加信息
1.6.1 局部变量表(本地变量表,局部变量数组)
定义一个数字数组,主要用于存储方法参数和定义在方法体内的局部变量,基本数据类型,对象应用,returnAddress类型
因为jvm栈是线程独有的,不会有安全问题。
所需大小在编译器确定,后面不会在更改了
下表及时上表的局部变量表
栈帧大小主要有局部变量表决定,局部变量表只在当前栈帧有限。调用时,直接调用局部变量表中的变量
1.6.2,局部变量表的基本单位------>Slot(变量槽)
局部变量表中存放8种基本数据类型,引用数据类型,returnAddress类型,其中32位以内的站一个Slot,64位站两个。
在局部变量中,按照声明的先后存放在Slot当中,构造方法和实例方法会在索引为0的位置存放this
如果变量过了作用域,则回收Slot,继续利用
局部变量表局调优有很大关系,调用引用数据类型的时候,栈指向堆中的对象是决定该对象是否为垃圾的标志。