与PC寄存器一样,Java虚拟机栈也是线程私有的。每一个JVM线程都有自己的java虚拟机栈,这个栈与线程同时创建,它的生命周期与线程相同。
“虚拟机栈”描述的是Java方法执行的内存模型:
栈帧(Stack Frame)
用于存储:局部变量表
、操作数栈
、动态链接
、方法出口
等信息。(栈帧我的理解就是一个对象,用来存储信息用)除64位 long 和 duble 占2个局部空间外,其余的数据类型只占1个。 注意,局部变量表所需的内存空间在编译期间完成分配,所以进入某个方法时,这个方法需要在栈桢中分配多大的空间完全是确定的,在方法运行时是不会改变局部变量表的大小的。
注,大部分 Java 虚拟机分为:固定长度
和 动态扩展
两种
JVM stack 可以被实现成固定大小,也可以根据计算动态扩展。 如果采用固定大小的JVM stack设计,那么每一条线程的JVM Stack容量应该在线程创建时独立地选定。JVM实现应该提供调节JVM Stack初始容量的手段;如果采用动态扩展和收缩的JVM Stack方式,应该提供调节最大、最小容量的手段。
如果线程请求的栈深度大于虚拟机所允许的深度将抛出StackOverflowError;
如果JVM Stack可以动态扩展,但是在尝试扩展时无法申请到足够的内存时抛出OutOfMemoryError
。