JVM运行时栈帧内部结构

栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

简而言之,类似于弹夹,填弹为入栈,开枪为出栈,先进后出,后进先出。

在这里插入图片描述

运行时栈帧结构

栈帧(Stack Frame)是用于支持虚拟机进行方法调用和方法执行的数据结构,他是虚拟机运行时数据区中的虚拟机栈(Virtual Machine Stack)的栈元素。每个栈帧中存储了方法的局部变量表、操作数栈、动态连接、方法返回地址和附加信息等数据信息。每个方法从调用开始到执行结束,对应着一个栈帧在虚拟机栈中的入栈到出栈的过程。

图中表示线程中当前线程运行时栈帧内部数据信息,位于栈顶的栈帧被称作当前栈帧,当前栈帧所处的方法被称作当前方法,当前方法所处的类被称作当前类。当前方法是当前线程正在执行的方法,也就是弹夹中下一发被开出去的子弹。

在这里插入图片描述
方法中方法参数和局部变量越多,当前栈帧所占空间越大,调用链越深,开辟的栈帧也就越多。

若栈空间最大容量固定,当剩余空间不足以开辟新的栈帧时,就会抛出 StackOverflowError,可以通过虚拟机参数 -Xxs 设置栈空间的大小。
好比一瓶水,有他固定的容量,总有溢出的时候。
在这里插入图片描述
若栈空间容量为动态扩展,当栈空间容量不足以开辟新的栈帧时,就会向内存中申请空间,当内存中空间不足时,就会抛出 OutOfMemoryError
好比一个气球,注水越多,他越膨胀,但是也有炸的时候。

在这里插入图片描述

局部变量表

局部变量表

猜你喜欢

转载自blog.csdn.net/qq_37132814/article/details/106436471
今日推荐