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

虚拟机栈中都有什么?

作者: 小凡_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位长度的内存空间”

相关文章

  • 虚拟机栈中都有什么?

    虚拟机栈中都有什么? Java虚拟机栈(Java Virtual Machine Stacks) 是线程私有的,它...

  • HotSpot之栈顶缓存

    能看到栈顶缓存,至少知道HotSpot是基于栈式的虚拟机,每个线程都有自己的虚拟机栈,栈的单位是栈帧,栈帧包含操作...

  • java内存区域与内存异常

    一、内存中到底放了什么?Java虚拟机所管理的内存包括: 程序计数器 Java虚拟机栈 本地方法栈 Java堆 方...

  • 内存管理 - 栈帧

    虚拟机栈是一个先进后出的栈,栈帧是保存在虚拟机栈中的。线程运行过程中,只有一个栈帧是处于活跃状态,称为“当前活跃栈...

  • JVM

    一、 内存模型以及分区,需要详细到每个区放什么?(1)栈区:栈分为java虚拟机栈和本地方法栈虚拟机栈:线程私有的...

  • Java垃圾回收算法

    在Java虚拟机运行时区域的各个部分中,程序计数器,虚拟机栈,本地方法栈声明周期与生成对应线程的生命周期:栈中的栈...

  • 虚拟机字节码执行引擎

    运行时栈帧结构 栈帧是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区中的虚拟机栈的栈元素。...

  • 字节码执行机制

    运行时帧栈结构 帧栈 是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区中的虚拟机栈的栈元素...

  • 运行时栈桢结构

    栈桢是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区中的虚拟机栈的栈元素。栈桢存储了方法的...

  • JVM内存模型

    Java内存模型把Java虚拟机内部划分为线程栈和堆。 Java 内存中堆和栈有什么区别: Stack栈是存放方法...

网友评论

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

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