主管 Java 程序的运行,它保存方法的局部变量、部分结果,并参与方法的调用和返回。每个线程在创建的时候都会创建一个虚拟机栈,其内部保存一个个的栈帧(Stack Frame),对应着一次次 Java 方法调用,是线程私有的,生命周期和线程一致。
特点
1、栈是一种快速有效的分配存储方式,访问速度仅次于程序计数器
2、JVM 直接对虚拟机栈的操作只有两个:每个方法执行,伴随着入栈(进栈/压栈),方法执行结束出栈
3、栈不存在垃圾回收问题
4、可以通过参数-Xss来设置线程的最大栈空间,栈的大小直接决定了函数调用的最大可达深度
该区域有哪些异常?
1、如果采用固定大小的 Java 虚拟机栈,那每个线程的 Java 虚拟机栈容量可以在线程创建的时候独立选定。如果线程请求分配的栈容量超过 Java 虚拟机栈允许的最大容量,Java 虚拟机将会抛出一个 StackOverflowError 异常。
2、如果 Java 虚拟机栈可以动态扩展,并且在尝试扩展的时候无法申请到足够的内存,或者在创建新的线程时没有足够的内存去创建对应的虚拟机栈,那 Java 虚拟机将会抛出一个OutOfMemoryError异常。
栈帧的内部结构?
1、局部变量表(Local Variables)
2、操作数栈(Operand Stack)(或称为表达式栈)
3、动态链接(Dynamic Linking):指向运行时常量池的方法引用
4、方法返回地址(Return Address):方法正常退出或异常退出的地址
5、一些附加信息