- 由于跨平台性设计,Java的指令都是根据栈来设计的。不同CPU架构不同,所以不能基于寄存器的。栈的优点就是跨平台、指令集小,编译器容易实现;缺点是性能下降,实现同样的功能需要更多的指令。
- Java虚拟机栈(Java Virtual Machine Stack)早期叫Java栈,每个线程创建时都会创建一个虚拟机栈,其内部保存一个个的栈帧(Stack Frame),对应一次次的Java方法调用。它的生命周期和线程一一致。
- 每个线程都有自己的栈,栈中的数据都是以栈帧的格式存在。栈帧是一块内存区块,是一个数据集,维系着方法执行过程中的各种数据信息。栈内存大小可以通过参数-Xss选项设置线程的最大栈空间,栈的大小直接决定了函数调用的最大可达深度。
- 栈负责Java程序的运行,它保存方法的局部变量、部分结果,并参与方法的调用和返回。它是一种快速有效的分配存储方式,访问速度仅次于程序计数器。
- JVM直接对Java栈的操作有两个:每个方法执行伴随着进栈(入栈、压栈);执行结束后的出栈工作,所以对于栈来说不存在垃圾回收问题。
栈可能出现的异常:
- Java虚拟机规范运行Java栈的大小是动态的或者是固定不变的。如果采用固定的Java虚拟机栈,每个线程的Java虚拟机容量可在创建时独立设置;如果线程请求分配的栈容量超过Java虚拟机栈允许的最大容量,Java虚拟机会抛出异常StackOverflowError。
- 如果Java虚拟机栈可以动态扩展,并且在尝试扩展的时候无法申请到足够的内存或者创建新的线程时没有足够的内存区创建对应的虚拟机栈,Java虚拟机会抛出异常OutOfMemoryError。