JVM虚拟机栈中的局部变量表

JVM虚拟机栈中的局部变量表

局部变量存放了编译期可知的各种Java虚拟机基本数据类型(boolean、byte、char、short、 int、float、long、double)、对象引用(reference类型 ,它并不同于对象本身,可能是一个指向对象起始地址的引用指针,也可能是指向一个代表对象的句柄或者其他与此对相象关的位置) returnAddress类型(指向了一条字节码指令的地址 )。

这些数据类型在局部变量表中的存储空间以局部变量槽(Slot)来表示,其中64位长度的long和double的会占用两个变量槽(volatile关键字修饰这两种变量是可以保证原子性的),其余的数据类型只占用一个。局部变量表所需的内存空间在编译期间完成分配,当进入一个方法时,这个方法需要在栈帧中分配多大的局部变量空间是完全确定的,在方法运行期间不会改变局部变量表的大小。这里说的“大小”是指变量槽的数量,虚拟机真正使用多大的内存空间(譬如照1个变量槽占用32个比特、64个比特,或者更多)来实现 一个变量槽,这是完由由具体的虚拟机实现自行决定的事情。

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

HotSpot虚拟机的栈容量是不可以动态扩展的, 以前的Classic虚拟机到是可以。所以HotSpot虚拟机上是不会由于虚拟机栈无法扩展而导致 OutOfMemoryError错误——只要线程申请栈空间成功了就不会有OOM,但是如果申请时就失败,仍然是会出现OOM的

你可能感兴趣的:(JVM,jvm)