JVM与虚拟机栈相关的-下篇:操作数栈和动态链接、方法返回地址

操作数栈

1、概念

操作数栈:Operand Stack
每一个独立的栈帧除了包含局部变量表外,还包含一个后进先出的操作数栈,可以称之为表达式栈

在方法的执行过程中,根据字节码指令,往栈中写入数据,称为入栈(push),提取数据,称为出栈(pop)

  • 某些字节码指令将值压入操作数栈,其余的字节码指令将操作数取出栈,使用他们后再把结果压入栈
  • 比如:执行复制、交换、求和等操作
    在这里插入图片描述
    代码举例:
    代码:
    在这里插入图片描述
    字节码指令
    在这里插入图片描述
    操作数栈,主要用于保存计算过程中的中间结果,同时作为计算过程中变量的临时存储空间。
    操作数栈就是jvm执行引擎的一个工作区,当一个方法开始执行的时候,一个新的栈帧也会随之被创建出来,这个方法的操作数栈就是空的
    这个时候数组是有长度的,因为数组一旦创建,那么长度就已经确定下来。

每一个操作数栈都会有一个明确的栈深度用于存储数值,其所需的最大深度在编译器就已经定义好了。保存在方法的code属性中,为maxstack的值。

栈中的任何一个元素都可以是任意的java数据类型

  • 32bit的类型占用一个栈的单位深度
  • 64bit的类型占用两个栈单位的深度

操作数栈并非采用访问索引的方式来进行数据访问的,而是只能通过标准的入栈和出栈操作来完成一次数据访问

如果被调用的方法带有返回值的话,其返回值将会被压入当前栈帧的操作数栈中,并更新PC寄存器中下一条需要执行的字节码指令。

操作数栈中元素的数据类型必须与字节码指令的序列严格匹配,这由编译器在编译器期间进行验证,同时在类加载过程中的类检验阶段的数据流分析阶段要再次验证。

另外,我们说Java虚拟机的解释引擎是基于栈的执行引擎,其中的栈指的就是操作数栈。

动态链接

1、动态链接(执行运行时常量池的方法引用)

1)、动态链接又称为指向运行时常量池中的方法引用
2)、一个方法对应一个栈帧,每一个战争中都包含一个执行运行时常量池中该栈帧所属方法的引用
3)、java源文件被编译到字节码文件中时,所有的变量和方法引用都作为符号引用,Symbolic Reference)保存在class文件的常量池里。例如:描述一个方法调用了另外其他的方法时,就是通过常量池中指向方法的符号引用来表示的,动态链接的作用是为了将这些符号引用转换为调用方法的直接引用。
在这里插入图片描述
如图所示,每一个线程都有自己的PC计数器、本地方法栈、虚拟机栈。虚拟机栈中存储的时一个个的栈帧,栈帧中包含局部变量表、方法返回地址、操作数栈、动态链接执行运行时常量池的方法引用)
在这里插入图片描述
图中Constant Pool Reference就是动态链接,指向的是方法区中运行时常量池的方法引用(method reference)。

举例:

package jvn;
public class DynamicLinkingTest {
   
    int num = 10;
    public void methodA(){
   
        System.out.println("methodA()....");
    }
    public void methodB(){
   
        System.out.println("methodB()....");
        methodA();
        num++;
    }
}

使用javap -v DynamicLinkingTest 反编译上面的java代码产生的class文件。得到下面的字节码输出。
1.其中的Constant pool就是常量池,当程序运行起来的时候,就是运行时常量池。
2.第一列#1,#2等等,这些就是符号引用。
3.methodB调用methodA对应的指令是9: invokevirtual #36 // Method methodA:()V。
4.为什么需要常量池?
常量池的作用就是为了提供一些符号和常量,便于指令的识别。

C:\Users\12558>javap -v D:\Eclipse_workspace\JVM\jvn\bin\jvn\DynamicLinkingTest.class
Classfile /D
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值