美文网首页
虚拟机栈中都有什么?

虚拟机栈中都有什么?

作者: 小凡_8c8f | 来源:发表于2018-08-19 20:08 被阅读0次

    虚拟机栈中都有什么?

    Java虚拟机栈(Java Virtual Machine Stacks) 是线程私有的,它的生命周期与线程相同。虚拟机栈为虚拟机执行Java方法

    (也就是字节码)服务,虚拟机栈描述的是Java方法执行的内存

    模型:每个方法在执行的同时都会创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。

    每一个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程

    经常有人把Java内存区分为堆内存(Heap)和栈内存(Stack),这种方法比较粗糙,Java内存区域的划分实际上远比这复杂。

    这种划分方式的流行只能说明大多数程序员最关注的、与对象内存分配分配关系最密切的内存区域是这两块。其中所指的“堆”

    笔者在后面会专门讲述,而所指的“栈”就是现在讲的虚拟机栈,或者说是虚拟机栈中局部变量表部分

    局部变量表存放了编译期可知的各种基本数据类型(boolean、byte、char、short、int、float、long、double)、对象

    引用(reference类型,它不等同于对象本身,可能是一个指向对象起始地址的引用指针,也可能是指向一个代表对象的句柄

    或其他与此对象相关的位置)和returnAddress类型(指向了一条字节码指令的地址)。

    其中64位长度的long和double类型的数据会占用2个局部变量空间(Slot),其余的数据类型只占用1个。局部变量表所需的

    内存空间在编译期间完成分配,当进入一个方法时,这个方法需要在帧中分配多大的局部变量空间是完全确定的,在方法运行

    期间不会改变局部变量表的大小。

    在Java虚拟机规范中,对这个区域规定了两种异常情况:如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError

    异常:如果虚拟机栈可以动态扩展(当前大部分的Java虚拟机都可动态扩展,只不过Java虚拟机规范中也允许固定长度的虚拟机栈),

    如果扩展时无法申请到足够的内存,就会抛出OutOfMemoryError异常。

    运行时栈帧结构

    栈帧(Stack Frame)是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区中的虚拟机栈(Virtual Machine Stack)

    的栈元素。栈帧存储了方法的局部变量表、操作数栈、动态链接和方法返操作数栈、动态链接和方法返回地址等信息。每一个方法从调用开始至执行完成

    的过程,都对应着一个栈帧在虚拟机栈里面从入栈到出栈的过程。

    每个栈帧都包括了局部变量表、操作数栈、动态链接、方法返回地址和一些额外的附加信息。在编译程序代码的时候,栈帧中需要

    多大的局部变量表,多深的操作数栈都已经完全确定了,并且写入到方法表的Code属性之中,因此一个栈帧需要分配多少

    内存,不会受到程序运行期变量数据的影响,而仅仅取决于具体的虚拟机实现。

    一个线程中的方法调用链可能会很长,很多方法都同时处于执行状态。对于执行引擎来说,在活动线程中,只有位于栈顶的

    栈帧才是有效的,称为当前栈帧(Current Stack Frame),与这个栈帧相关联的方法称之为当前方法(Current Method)。执行

    引擎运行的所有字节码指令都只针对当前栈帧进行操作,

    局部变量表(Local Variable Table)是一组变量值存储空间,用于存放方法参数和方法内部定义的局部变量。在Java程序

    编译为Class文件时,就在方法Code属性的max_locals数据项中确定了该方法所需要分配的局部变量表的最大容量。

    局部变量表的容量以变量槽(Variable,下称Slot)为最小单位,虚拟机规范中并没有明确指明一个Slot应占用的内存空间大小,

    只是很有导向性地说到每个Slot都应该能存放一个boolean、byte、char、short、int、float、reference或returnAddress类型

    的数据,这8种数据类型,都可以使用32位或更小的物理内存来存放,但这种描述与明确指出“每个Slot占用32位长度的内存空间”

    相关文章

      网友评论

          本文标题:虚拟机栈中都有什么?

          本文链接:https://www.haomeiwen.com/subject/tzchiftx.html