深入了解Java虚拟机之Java虚拟机栈

 2019-12-22 10:38  阅读(822)
文章分类:JVM

与程序计数器(想了解计数器看我上一篇博客)一样,Java虚拟机栈也是线程私有的,他的生命周期与线程相同,虚拟机栈描述的是Java方法执行的内存模式:每个方法在执行的同时都会创建一个栈帧用于存储局部变量表,操作数栈,动态链接,方法出口等信息,每一个方法从调用直至执行完成的过程,就是对应着一个栈帧在虚拟机中入栈到出栈的过程。

经常有人把java内存区域分为堆内存和栈内存,这种分配比较粗糙,java内存区域的划分实际上比这个复杂得多,这种方式的划分只能说明大多数程序员最关注的、与对象内存

分配关系最密切的内存区域是这两块,其中所指的堆,我会在后面详细的讲解,而所说的 栈 就是现在讲的虚拟机栈,或者说虚拟机栈中局部变量表部分。

局部变量表存放了编译期克制的各种数据类型(boolean,int,short,long,byte,double,float,char)对象引用(reference类型,它不等同于对象本身,可能是指向对象起始地址的引用指针,也可能是只想一个代表对象的句柄或其他于此对象相关的位置)和returnAddresss类型(只想一条字节码指令的地址)

其中64位长度的long和double类型的数据会占用两个局部变量空间,其余的数据类型只占用一个。局部变量表所需的内存空间在编译期间完成分配,当进入一个方法时,这个方法需要在帧中分配大多数的局部变量空间是完全确定的,在方法运行期间不会改变局部变量表的大小。

在java虚拟机规范中,对这个区域规定了两个异常状况,如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常;如果虚拟机栈可以动态扩展(当前大部分java虚拟机栈都可以动态扩展,只不过java虚拟机规范中也允许固定长度的虚拟机栈),如果扩展时无法申请足够的空间内存,就会跑出OutOfMemoryError异常。

点赞(0)
版权归原创作者所有,任何形式转载请联系作者; Java 技术驿站 >> 深入了解Java虚拟机之Java虚拟机栈

相关推荐