Java虚拟机栈

Java虚拟机栈是线程私有的,它的生命周期与线程相同。

虚拟机栈描述的是Java方法执行的线程内存模型:每个方法被执行的时候,Java虚拟机都会同步创建一个栈帧用于存储局部变量表、操作数栈、动态连接、方法出口等信息。
每一个方法被调用直至执行完毕的过程,
就对应着一个栈帧在虚拟机中从入栈到出栈的过程。
(栈帧是方法运行期很重要的基础数据结构)

经常把Java内存区域笼统的划分为堆内存和栈内存
其中,栈通常指的就是虚拟机栈,或者只是虚拟机栈中局部变量表部分

局部变量表存放了编译期可知的各种Java虚拟机基本数据类型(8大基本类型)、对象引用、returnAddress类型(指向了一条字节码指令的地址)

这些数据类型在局部变量表中的存储空间以局部变量槽(Slot)来表示,
其中64位长度的long和double类型会占用2个变量槽,其余数据类型只占用一个

局部变量表所需的内存空间在编译期间完成分配
当进入一个方法时,这个方法需要在栈帧中分配多大的局部变量空间是完全确定的,
在方法运行期间不会改变局部变量表的大小。
这里的大小指的是变量槽的数量,虚拟机真正使用多大的内存空间(比如1个变量槽占用32个比特)来实现一个变量槽,这是完全由具体的虚拟机实现自行决定。

《Java虚拟机规范》中,对这个内存区域规定了两类异常状况:
如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常;
如果Java虚拟机栈容量可以动态扩展,
当栈扩展时无法申请到足够的内存会抛出OutOfMemoryError异常。

本地方法栈

与虚拟机栈所发挥的作用是非常相似的

区别只是虚拟机栈为虚拟机执行Java方法(就是字节码)服务,
而本地方法栈则是为虚拟机使用到的本地方法服务

《Java虚拟机规范》对本地方法栈中方法使用的语言、使用方式与数据结构并没有任何强制规定。
因此具体的虚拟机可以根据需要自由实现它,甚至有的Java虚拟机直接就把本地方法和虚拟机栈合二为一。
与虚拟机栈一样,本地方法也会在栈深度溢出的时候抛出StackOverflowError
在栈扩展失败时,抛出OutOfMemoryError

posted @ 2021-01-30 22:22  张三丰学Java  阅读(113)  评论(0编辑  收藏  举报