虚拟机栈的概述
总所周知Java是跨平台的的设计,Java的指令都是根据栈来设计,不同平台的CPU架构不同,所以不能设计为基于寄存器的
优势: 跨平台 指令集小,编译器容易实现
不足:性能下降(对比寄存器) 实现同样的功能需要更多的指令
栈(Stack)是运行时的单位
堆(Heap)是存储的单位(理论上是最大的内存空间)
虚拟机栈的基本内容
什么是虚拟机栈?
每个线程在创建时都会创建一个虚拟机栈
内部保存一个个栈帧(Stack Frame) 对应着一次次的Java方法调动
线程私有(与线程生命周期一致)
虚拟机栈有什么作用
1.主管Java程序的运行 程序中的方法与局部变量 部分结果
2. 参与方法的调用与返回
栈的优点
- 栈是一种快速有效的分配存储方式 访问速度仅次于程序计数器
- JVM直接对栈的操作只有两个
每个方法的执行会伴随进栈(入栈 压栈)
执行结束后会出栈(弹栈) - 对于栈来说没有垃圾回收的问题(不存在GC有可能存在OOM)
常见异常
- Java虚拟机规范循序Java栈的大小是动态的或者固定不变的
异常1 StackOverFlowError
若采用固定不变的容量 那么当请求栈容量超过了Java虚拟机栈允许的最大容量
那么Java虚拟机会抛出一个栈内存溢出(StackOverflowError)
异常2 OutofMemoryError
如果Java虚拟机栈可以动态扩展,并且在尝试扩展的时候无法申请到足够内存
或者没有足够内存去创建对于虚拟机栈
抛出OutofMemoryError异常