虚拟机栈:
优点,跨平台,指令集小,编译器容易实现
缺点,性能下降,实现同样的功能需要更多的指令
栈是运行时的单位,而堆是存储的单位
栈解决程序的运行问题,即程序如何执行,或者说如何处理数据。
堆解决的是数据存储的问题,即数据怎么放、放在哪
java虚拟机栈是什么?
每个线程在创建时都会创建一个虚拟机栈,其内部保存一个个的栈帧,对应着一次次的Java方法调用 ,线程私有的
生命周期和线程一致
作用:
主管Java程序的运行,它保存方法的局部变量、部分结果、并参与方法的调用和返回。
栈的特点(优点):
栈是一种快速有效的分配存储方式,访问速度仅次于程序计数器
JVM直接对于java栈的操作只有两个:
每个方法执行,伴随着进栈
执行结束后的出栈工作
对于栈来说不存在垃圾回收问题
栈的存储单位:
栈中存储什么?
每个线程都有自己的栈,栈中的数据都是以栈帧的格式存在的。
在这个线程上正在执行的每个方法都各自对应一个栈帧。
栈帧是一个内存区块,是一个数据集,维系着方法执行过程的各种数据信息。
栈的运行原理:
栈帧的内部结构:
每个栈帧中存储着:
局部变量表
操作数栈
动态链接(指向运行时常量池的方法引用)
方法返回地址(方法正常退出或者异常退出的定义)
一些附加信息
局部变量表:
局部变量表也称为局部变量数组或本地变量表
** 定义为一个数字数组,主要用于存储方法参数和定义在方法体内的局部变量,**
这些数据类型包括各类基本数据类型,对象引用,以及returnAddress类型
由于局部变量表时建立在线程的栈上,是线程私有的数据,因此 **不存在数据安全性问题**
** 局部变量表所需要的容量大小是在编译期确定下来的**,并保存在方法的Code属性maximun local variabless数据项中。在方法运行期间是不会改变局部变量表的大小的。
**方法嵌套调用的次数由栈大大小决定** 一般来说,栈越大,方法嵌套调用次数越多。
局部变量表中的变量只在当前方法调用中有效,在方法执行时,虚拟机通过使用局部变量表完成
参数值到参数变量列表的传递过程。
**当方法调用结束后,随着方法栈帧的销毁,局部变量表也会随之销毁。**