JVM04_虚拟机栈概述、局部变量表、操作数栈、动态链接、方法的返回地址、附加信息(二)

简介: ③. 操作数栈(operand stack)

③. 操作数栈(operand stack)


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


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


③. 操作数栈,在方法执行过程中,根据字节码指令,往栈中写入数据或提取数据,即入栈或出栈


④. 每一个操作数栈都会拥有一个明确的栈深度用于存储数值,其所需的最大深度在编译期就定义好了,保存在方法的Code属性中,为max_stack的值


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

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

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


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


⑦. 操作数栈,主要用于保存计算机过程的中间结果,同时作为计算过程中变量临时的存储空间 掌握


⑧. 操作数栈的具体说明[一]

这里的代码中操作数栈的长度最大是2,在iload_1、iload_2的时候


  public void testAddOperation(){
      byte i = 15;
      int j = 8;
      int k = i + j;
  }


解释:


微信图片_20220106134110.png


微信图片_20220106134117.png


微信图片_20220106134144.png

微信图片_20220106134148.png

微信图片_20220106134154.png

微信图片_20220106134321.png

微信图片_20220106134339.png

微信图片_20220106134217.png微信图片_20220106134222.png


  • ⑧. 操作数栈的具体说明[二]


  1. 局部变量有多少个?


  1. 操作数栈的最大深度是多少?


微信图片_20220106134440.png


public class OperandStackTest {
    public void testAddOperation(){
        //byte、short、char、boolean:都以int型保存
        byte i=15;
        short j=8;
        int k=i+j;
        long m=12L;
        int n=800;
        //存在宽化类型转换
        m=m*n;
    }
}


解释


微信图片_20220106134508.png


⑨. 操作数栈的具体说明[三]


操作书栈的最大深度是2,这个2是在(new #2 、dup的时候)


public class OperandStackTest {
    public static void main(String[] args) {
        OperandStackTest test=new OperandStackTest();
        int num=10;
        test.testAddOperation();
    }
    public void testAddOperation(){
        //byte、short、char、boolean:都以int型保存
        byte i=15;
        short j=8;
        int k=i+j;
        long m=12L;
        int n=800;
        //存在宽化类型转换
        m=m*n;
    }
 0 new #2 <com/xiaozhi/jvm/OperandStackTest> 将new的对象放入操作数栈中
 3 dup 复制一份出来,在操作数栈中,这时操作数栈的长度为2
 下面用了dup出来的对象
 4 invokespecial #3 <com/xiaozhi/jvm/OperandStackTest.<init>>
 7 astore_1 将new出来的放入了局部变量表为1的位置,0的位置放的是arg
 8 bipush 10 将10放入操作数栈
10 istore_2  将操作数栈中的10放入局部变量表为2的位置
11 aload_1   将巨变变量表1的位置放入操作数栈中
下面调用了方法,也就意味着操作数栈1的位置出栈了
12 invokevirtual #4 <com/xiaozhi/jvm/OperandStackTest.testAddOperation>
15 return


微信图片_20220106134552.png


⑩. 何为栈顶缓存技术? 了解


前面提过,基于栈式架构的虚拟机所使用的零地址指令更加紧凑,但完成一项操作的时候必然需要使用更多的入栈和出栈指令,这同时也就意味着将需要更多的指令分派(instruction dispatch)次数和内存读/写次数。


由于操作数是存储在内存中的,因此频繁地执行内存读/写操作必然会影响执行速度。为了解决这个题,HotSpot JVM的设计者们提出了栈顶缓存(ToS,Top-of-Stack Cashing)技术,将栈顶元素全部缓存在物理CPU的寄存器中,以此降低对内存的读/写次数,提升执行引擎的执行效率


相关文章
|
2月前
|
监控 Oracle Java
《深入浅出Java虚拟机 — JVM原理与实战》带你攻克技术盲区,探索各大JVM虚拟机特色 —— JVM故障排除指南(先导篇)
《深入浅出Java虚拟机 — JVM原理与实战》带你攻克技术盲区,探索各大JVM虚拟机特色 —— JVM故障排除指南(先导篇)
38 0
|
2天前
|
存储 Java
深入理解Java虚拟机:JVM内存模型
【4月更文挑战第30天】本文将详细解析Java虚拟机(JVM)的内存模型,包括堆、栈、方法区等部分,并探讨它们在Java程序运行过程中的作用。通过对JVM内存模型的深入理解,可以帮助我们更好地编写高效的Java代码,避免内存溢出等问题。
|
2月前
|
缓存 Java C#
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍(一)
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍
84 0
|
9天前
|
存储 安全 Java
深入理解Java虚拟机(JVM)
深入理解Java虚拟机(JVM)
14 0
|
10天前
|
存储 安全 Java
JVM之本地方法栈和程序计数器和堆
JVM之本地方法栈和程序计数器和堆
11 0
|
14天前
|
缓存 监控 Java
深入理解Java虚拟机(JVM)性能调优
【4月更文挑战第18天】本文探讨了Java虚拟机(JVM)的性能调优,包括使用`jstat`、`jmap`等工具监控CPU、内存和GC活动,选择适合的垃圾回收器(如Serial、Parallel、CMS、G1),调整堆大小和新生代/老年代比例,以及代码优化和JIT编译策略。通过这些方法,开发者能有效提升应用性能并应对复杂性挑战。性能调优是持续过程,需伴随应用演进和环境变化进行监控与优化。
|
15天前
|
监控 Java 调度
探秘Java虚拟机(JVM)性能调优:技术要点与实战策略
【4月更文挑战第17天】本文探讨了JVM性能调优的关键技术,包括内存模型调优(关注堆内存和垃圾回收),选择和优化垃圾收集器,利用JVM诊断工具进行问题定位,以及实战调优案例。强调了开发者应理解JVM原理,善用工具,结合业务场景进行调优,以应对高并发和大数据量的挑战。调优是持续的过程,能提升系统稳定性和效率。
|
3月前
|
虚拟化
vmware克隆虚拟机后没有ip地址的问题
解决vmware克隆虚拟机后没有内网ip的问题
|
4月前
|
SQL 存储 数据挖掘
【虚拟机数据恢复】VMware虚拟机文件被误删除的数据恢复案例
虚拟机数据恢复环境: 某品牌R710服务器+MD3200存储,上层是ESXI虚拟机和虚拟机文件,虚拟机中存放有SQL Server数据库。 虚拟机故障: 机房非正常断电导致虚拟机无法启动。服务器管理员检查后发现虚拟机配置文件丢失,所幸xxx-flat.vmdk磁盘文件和xxx-000001-delta.vmdk快照文件还在。服务器管理员在尝试恢复虚拟机的过程中,将原虚拟机内的xxx-flat.vmdk删除后新建了一个虚拟机,并分配了精简模式的虚拟机磁盘和快照数据盘,但原虚拟机内的数据并没有恢复。
【虚拟机数据恢复】VMware虚拟机文件被误删除的数据恢复案例
|
Linux 虚拟化 数据安全/隐私保护
VMware使用 - 虚拟机克隆
如果已经安装了一台Linux操作系统,没有必要重新安装,只需要克隆就可以了,有两种方式。
28 0