首页 > 其他分享 >聊聊栈帧中的局部变量表和操作数栈

聊聊栈帧中的局部变量表和操作数栈

时间:2023-05-24 21:14:36浏览次数:36  
标签:操作数 压入 局部变量 栈顶 参数 栈中 栈帧

前置阅读【图解JVM内存模型及JAVA程序运行原理】:https://developer.aliyun.com/article/1218034?utm_content=g_1000372435 

本文内容和【图解JVM内存模型及JAVA程序运行原理】一文中的“程序样例执行详解”相关。

 

代码示例:

public int operandStackExample(int a, int b) {
    int c = a * b;
    int d = a + b;
    return c - d;
}
  • 操作数栈执行过程:
  1. 将参数 a 压入操作数栈中,操作数栈:[a]。
  2. 将参数 b 压入操作数栈中,操作数栈:[a, b]。
  3. 执行乘法操作,弹出操作数栈顶的两个元素 a 和 b,计算 a * b 的结果 c,将结果 c 压入操作数栈中,操作数栈:[c]。
  4. 将参数 a 压入操作数栈中,操作数栈:[c, a]。
  5. 将参数 b 压入操作数栈中,操作数栈:[c, a, b]。
  6. 执行加法操作,弹出操作数栈顶的两个元素 a 和 b,计算 a + b 的结果 d,将结果 d 压入操作数栈中,操作数栈:[c, d]。
  7. 执行减法操作,弹出操作数栈顶的两个元素 c 和 d,计算 c - d 的结果,将结果压入操作数栈中,操作数栈:[c-d]。
  8. 将操作数栈顶的值返回给方法调用者。

总结:在这个例子中,操作数栈的完整执行过程包括将参数和临时数据压入栈中,执行计算操作,弹出栈顶元素,将计算结果压入栈中,最终将栈顶元素返回给方法调用者。

 

  • 局部变量表执行过程:
  1. 方法开始执行时,创建局部变量表,分配足够的空间存储局部变量。在这个例子中,局部变量表有 4 个槽,分别存储参数 a、参数 b、局部变量 c 和局部变量 d。
  2. 将参数 a 的值存入局部变量表的第 0 个槽中。
  3. 将参数 b 的值存入局部变量表的第 1 个槽中。
  4. 计算 a * b 的结果,并将结果存入局部变量表的第 2 个槽(局部变量 c)。
  5. 计算 a + b 的结果,并将结果存入局部变量表的第 3 个槽(局部变量 d)。
  6. 从局部变量表中取出 c 和 d 的值,计算 c - d 的结果,并将结果压入操作数栈中。
  7. 将操作数栈顶的值返回给方法调用者。

总结:在这个例子中,局部变量表的完整执行过程包括创建局部变量表,将参数和局部变量存入表中,读取表中的值进行计算,最终将计算结果压入操作数栈中。

 

  • 总结:

  局部变量表和操作数栈在 JVM 中分别有不同的作用:

  1. 局部变量表:局部变量表用于存储方法的参数和局部变量,包括基本数据类型和对象引用。它的作用是提供一个临时的存储区域,用于在方法执行过程中存储和访问方法的参数和局部变量。

  2. 操作数栈:操作数栈用于存储方法执行过程中的临时数据,包括基本数据类型和对象引用。它的作用是提供一个临时的存储区域,用于在方法执行过程中进行计算和操作。

因为局部变量表和操作数栈在结构和用途上有明显的区别,所以不能用局部变量表替代操作数栈。局部变量表主要用于存储方法的参数和局部变量,而操作数栈主要用于存储方法执行过程中的临时数据。如果将操作数栈的功能转移到局部变量表中,会导致局部变量表的使用变得复杂,而且会增加 JVM 的实现难度。因此,在 JVM 中,局部变量表和操作数栈都是必不可少的。

 

标签:操作数,压入,局部变量,栈顶,参数,栈中,栈帧
From: https://www.cnblogs.com/jixiegongdi/p/17429516.html

相关文章

  • Java 局部变量
     局部变量声明在方法、构造方法或者语句块中。局部变量在方法、构造方法、或者语句块被执行的时候创建,当它们执行完成后,变量将会被销毁。局部变量必须在使用前声明,并且不能被访问修饰符修饰,因为它们的作用域已经被限制在了声明它们的方法、代码块或构造函数中。局部变量只在......
  • php 操作数组 (合并,拆分,追加,查找,删除等)
    1.合并数组array_merge()函数将数组合并到一起,返回一个联合的数组。所得到的数组以第一个输入数组参数开始,按后面数组参数出现的顺序依次迫加。其形式为:Php代码1.arrayarray_merge(array这个函数将一个或多个数组的单元合并起来,一个数组中的值附加在前一个数组......
  • 局部变量元素加入成员变量QList后,局部变量出了作用域后,为什么QList仍然可以获取元素的
    问题问题:现有一个成员变量QList,在函数中定义了一个局部变量的对象,并将该局部变量加入到QList中。当函数运行结束,局部变量也就出了作用域,这时,由于局部变量只是一个普通对象,而不是指针,所以,应该被销毁。但是,我们在外面仍然可以通过QList对象来访问之前加入进来的数据,这是为什么?实验......
  • pymsql操作数据库
    以下是常用的一些pymysql操作数据库的操作。为了打包后方便读取与写入不同数据库,留出了更改数据库的接口。接口文件类似于:localhostrootxxxxxxtest3306utf8importpymysqlimporttime#读取外部配置withopen('database_config_test.txt','r')asf:item=f.readl......
  • JVM(四)虚拟机栈(一)栈帧结构:局部变量表与操作数栈
    JVM(四)虚拟机栈(一)栈帧结构:局部变量表与操作数栈1虚拟机栈1.1简介虚拟机栈出现的背景:由于跨平台性的设计,Java的指令都是根据栈来设计的,不同平台的CPU架构不同,所以不能基于寄存器。这样做的优点是跨平台,指令集更小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令。......
  • JVM(四)虚拟机栈(二)栈帧结构:动态链接、方法返回地址与附加信息
    JVM(三)虚拟机栈(二)栈帧结构:动态链接、方法返回地址与附加信息1动态链接技术每一个栈帧,都包含着一个指向运行时常量池中该指针所属方法的引用,即方法区中的方法地址,包含该引用的目的就是为了支持当前方法能够实现动态链接。所以动态链接又称为运行时常量池中的方法引用在java源......
  • 【排序最少操作数,最长子序列】MT笔试
    题目:给一个n个数的排列,n的数的范围为1~n且各不相同,比如[3,1,2]为一个3个数的排列。现在要求对这个无序的n个数的排列,排成一个递增序列,但只能进行一种操作:从n个数中任选两个数,大的放最后一位,小的放第一位,问最少进行多少次这种操作,n个数的排列最终变成一个递增序列。例如[1,5,4,2,3......
  • Mongodb 以及 node.js中使用mongoose操作数据库
    Mongodb以及node.js中使用mongoose操作数据库1、lowdb一个简陋的数据库第三方库,使用JSON文件来保存数据,进行增删改查。在没有数据库或者数据量小到不使用数据库的时候可以使用,了解即可。2、Mongodb是什么?MongoDB是一个基于分布式文件存储的数据库。相比于纯文件管理数据,数......
  • 记一次基于FPGA的VGA显示四操作数计算器工程的开发流程——(1)从顶层设计说起
    首先值得说明的是,在这个项目几乎完成之际,笔者才愈发体会到了硬件思维和软件思维的云泥之别。不幸的是,在此项目的实现过程中,绝大部分代码的思维仍然是软件思维,因此该项目主要模块的设计部分可能并不能体现硬件操作的独到之处,不符合硬件工程师的基本设计思维,所以此主题文章仅用于学......
  • 【♨Java基础】浅谈栈帧
    什么是栈帧栈帧是栈中的一个栈元素,是一种用于帮助虚拟机执行方法调用与方法执行的数据结构,当前线程中,每执行一个方法就会往栈中插入一个栈帧。栈帧本身是一种数据结构,封装了方法的局部变量表、动态链接信息、方法返回地址(即返回到方法的调用者)以及操作数栈。Java虚拟机栈(JavaV......