阅读 1371

JVM(三)--栈帧(二)

「这是我参与11月更文挑战的第10天,活动详情查看:2021最后一次更文挑战

接上篇 JVM(一),我们继续分析栈帧的操作数栈、动态连接和方法返回地址等各个部分的作用和数据结构 我们先看这幅图

栈帧.png

1. 操作数栈

操作数栈是一个后入先出的栈,一个方法刚开始执行时操作数栈是空的,在方法执行过程中,根据字节码指令,往栈中写入数据或提取数据,即入栈(push)和出栈(pop)操作。操作数栈主要用于保存计算过程的中间结果,同时作为计算过程中变量临时的存储空间。操作数栈的每一个元素可以是任意的Java数据类型,包括long和double,32位数据类型所占的栈容量为1,64位的占2个。方法执行的任何时候,操作数栈的深度都不会超过在max_stacks数据项中设定的最大值。

1. 动态连接

每个栈帧都包含一个指向运行时常量池中该栈帧所属方法的引用,持有这个引用是为了支持方法调用过程中的动态连接,在Java源文件被编译到字节码文件时,所有的变量和方法引用都作为符号引用保存在class文件的常量池里

Constant pool:
   #1 = Methodref          #4.#17         // java/lang/Object."<init>":()V
   #2 = Fieldref           #3.#18
复制代码

描述一个方法调用了另外的其他方法时,就是通过常量池中指向方法的符号引用来表示的,那么动态链接的作用就是为了将这些符号引用转换为调用方法的直接调用

1. 方法返回地址

当一个方法开始执行时,可能有两种方式退出该方法:

  • 正常完成出口
  • 异常完成出口

正常完成出口是指方法正常完成并退出,没有抛出任何异常(包括Java虚拟机异常以及执行时通过throw语句显示抛出的异常)。如果当前方法正常完成,则根据当前方法返回的字节码指令,这时有可能会有返回值传递给方法调用者(调用它的方法),或者无返回值。具体是否有返回值以及返回值的数据类型将根据该方法返回的字节码指令确定。

异常完成出口是指方法执行过程中遇到异常,并且这个异常在方法体内部没有得到处理,导致方法退出

文章分类
Android
文章标签