栈帧
一个栈中可用有多个栈帧,栈帧随着方法的调用而创建,随着方法的结束而消亡
栈
- 又名堆栈,它是一种操作受限的线性表。只允许在一端进行插入和删除操作,这一端被称为栈顶,另一端称为栈底,特性:先进后出
- 栈是线程私有的,生命周期和线程相同
- 方法参数列表中的变量,方法体中的基本数据类型的变量和引用数据类型的引用都存放在栈中
- 栈的变量随着变量作用域的结束而释放,不需要jvm垃圾回收机制回收
- 栈内存的大小的在编译期就确定了的
组成
- 局部变量表:是一组变量值的存储空间,用来存放方法参数和局部变量,虚拟机通过索引定位的方法使用局部变量表
- 操作数栈:是一个先进后进表。方法执行过程中进行运算或者调用其它的方法进行参数传递时通过操作数栈进行操作的
- 动态连接:如果符号引用在类加载阶段或第一次使用时转换为直接引用,那么这种转换称为静态解析;符号引用在允许期间转换为直接引用,那么这种转换就成了动态连接
- 返回地址:纪录当前方法的调用位置。当前方法执行完毕后,恢复上层局部变量表以及操作数栈,如果有返回值,就把返回值压入操作数栈,把程序计数器的值调整为方法调用入口的下一条指令
优点
- 栈帧内存数据共享:栈帧之间数据不能共享,但是同一个栈帧的数据是可用共享的
- 存取速度比堆要快:速度仅次于寄存器
- 在编译期间就申请好内存,所以不需要重新申请大小
- 栈是系统提供的数据结构,计算机会在底层提供支持
- 访问一个堆需要访问两次,第一次获取指针,第二次获得数据,而栈只访问一次
缺点
- 存在栈的数据大小和生命周期必须是缺点的,缺乏灵活性。当运行时,发现内存不够,不会动态的去申请内存,以至报错