`

JVM学习笔记-操作数栈(Operand Stack)

 
阅读更多

 

Like the local variables, the operand stack is organized as an array of words. But unlike the local variables, which are accessed via array indices, the operand stack is accessed by pushing and popping values. If an instruction pushes a value onto the operand stack, a later instruction can pop and use that value.

和局部变量区一样,操作数栈也是被组织成一个以字长为单位的数组。但是和前者不同的是,它不是通过索引来访问,而是通过标准的栈操作—压栈和出栈—来访问的。比如,如果某个指令把一个值压入到操作数栈中,稍后另一个指令就可以弹出这个值来使用。

 

The virtual machine stores the same data types in the operand stack that it stores in the local variables: int, long, float, double, reference, and returnType. It converts values of type byte, short, and char to int before pushing them onto the operand stack.

虚拟机在操作数栈中存储数据的方式和在局部变量区中是一样的:如int、long、float、double、reference和returnType的存储。对于byte、short以及char类型的值在压入到操作数栈之前,也会被转换为int。

 

Other than the program counter, which canít be directly accessed by instructions, the Java Virtual Machine has no registers. The Java Virtual Machine is stack-based rather than register-based because its instructions take their operands from the operand stack rather than from registers. Instructions can also take operands from other places, such as immediately following the opcode (the byte representing the instruction) in the bytecode stream, or from the constant pool. The Java Virtual Machine instruction set's main focus of attention, however, is the operand stack.

不同于程序计数器,Java虚拟机没有寄存器,程序计数器也无法被程序指令直接访问。Java虚拟机的指令是从操作数栈中而不是从寄存器中取得操作数的,因此它的运行方式是基于栈的而不是基于寄存器的。虽然指令也可以从其他地方取得操作数,比如从字节码流中跟随在操作码(代表指令的字节)之后的字节中或从常量池中,但是主要还是从操作数栈中获得操作数。

 

The Java Virtual Machine uses the operand stack as a work space. Many instructions pop values from the operand stack, operate on them, and push the result. For example, the iadd instruction adds two integers by popping two ints off the top of the operand stack, adding them, and pushing the int result. Here is how a Java Virtual Machine would add two local variables that contain ints and store the int result in a third local variable:

虚拟机把操作数栈作为它的工作区——大多数指令都要从这里弹出数据,执行运算,然后把结果压回操作数栈。比如,iadd指令就要从操作数栈中弹出两个整数,执行加法运算,其结果又压回到操作数栈中,看看下面的示例,它演示了虚拟机是如何把两个int类型的局部变量相加,再把结果保存到第三个局部变量的:

begin

iload_0 // push the int in local variable 0 onto the stack

iload_1 // push the int in local variable 1 onto the stack

iadd // pop two ints, add them, push result

istore_2 // pop int, store into local variable 2

end

 

In this sequence of bytecodes, the first two instructions, iload_0 and iload_1, push the ints stored in local variable positions zero and one onto the operand stack. The iadd instruction pops those two int values, adds them, and pushes the int result back onto the operand stack. The fourth instruction, istore_2, pops the result of the add off the top of the operand stack and stores it into local variable position two. In Figure 5-10, you can see a graphical depiction of the state of the local variables and operand stack while executing the above instructions. In this figure, unused slots of the local variables and operand stack are left blank.

在这个字节码序列里,前两个指令iload_0和iload_1将存储在局部变量中索引为0和1的整数压入操作数栈中,其后iadd指令从操作数栈中弹出那两个整数相加,再将结果压入操作数栈。第四条指令istore_2则从操作数栈中弹出结果,并把它存储到局部变量区索引为2的位置。图5-10详细表述了这个过程中局部变量和操作数栈的状态变化,图中没有使用的局部变量区和操作数栈区域以空白表示。

  • 大小: 20.8 KB
分享到:
评论

相关推荐

    rewolf-jvm-operand-stack-viewer:Java VM Operand堆栈查看器

    总之,rewolf-jvm-operand-stack-viewer是学习和研究JVM操作数栈的宝贵资源,通过这个工具,我们可以将抽象的字节码指令与具体的栈操作联系起来,加深对Java程序执行过程的认识,进而提高编程能力。

    深入理解JVM-java虚拟机栈.docx

    2. 操作数栈(Operand Stack):操作数栈用于执行算术运算和逻辑运算,它是一个后入先出(LIFO)的数据结构。每当执行一条字节码指令,操作数栈可能会进行压栈或弹栈操作。 3. 动态连接(Dynamic Linking):每个...

    慢慢的回味.entry_point–JVM Java栈桢的创建1

    * 操作数栈(Operand Stack):存储方法执行过程中的操作数。 * 方法返回地址(Return Address):存储方法返回时的地址。 * 动态链接(Dynamic Link):存储方法之间的调用关系。 三、栈桢的创建 栈桢的创建是...

    JVM中[虚拟机栈]的所有内容-pdf

    2. 操作数栈(Operand Stack):这是一个后进先出(LIFO)的数据结构,用于保存计算过程的中间结果。每当执行一个Java字节码指令,可能涉及向操作数栈压入数据或从栈中弹出数据。它是基于栈的执行引擎的核心组件,与...

    java虚拟机运行时数据区分析

    按照JVM规范,操作指令需要的参数是从操作数栈获得的(the operand stack)。 在JVM中,操作码可以分为不同的类别,例如: * Constants:将常量池的值或者已知的值压入操作数栈。 * Loads:将局部变量值压入操作数...

    JVM 50道面试题和答案.docx

    - 操作数栈(Operand Stack) - 动态连接(Dynamic Linking) - 返回地址(Return Address) - 附加信息(Frame Data) 7. **JVM内存模型** - JVM内存模型规定了线程如何访问和共享数据,分为工作内存(线程...

    jvm 详细介绍,了解jvm各个组成部分和功能

    - **Operand Stack Pointer**:操作数栈指针,用于指向操作数栈顶部。 - **Frame Pointer**:帧指针,指向当前执行方法的帧的起始位置。 - **Vars Pointer**:变量指针,指向局部变量表中下一个可用的位置。 这些...

    JVM内幕:java虚拟机详解

    7. **操作数栈(Operand Stack)** - 操作数栈用于暂存中间结果,支持方法内表达式的计算。它是一个后进先出的数据结构,在执行字节码指令时用于存放临时变量和操作结果。 8. **动态链接(Dynamic Linking)** - ...

    JAVA高级知识,JVM篇

    - **操作数栈(Operand Stack)**:在方法执行过程中用于存放中间结果,也可用于实现数据和地址的传递。 - **动态链接(Dynamic Linking)**:用于支持方法调用过程中动态链接到具体的方法实现。 - **方法出口(Method...

    深入java虚拟机(一)——java虚拟机底层结构详解1

    2. **操作数栈顶指针(Operand Stack Pointer)**:指向操作数栈的顶部,操作数栈是一个后进先出(LIFO)的数据结构,用于存储计算过程中的数据。 3. **当前执行环境指针(Frame Pointer)**:指向当前执行的方法的...

    JVM执行子系统.zip

    7. 操作数栈(Operand Stack): 在每个线程的虚拟机栈中,每个方法调用对应一个栈帧,其中包含了操作数栈。执行Java字节码时,会将操作数压入栈,进行计算后再弹出结果。 8. CPU指令集与字节码执行: JVM通过...

    2024年java面试题-jvm性能调优面试题第二部分

    - **操作数栈(Operand Stack)**:用于存储临时结果或操作数。 - **方法出口(Method Exit)**:用于保存返回地址和其他控制信息。 3. **方法区(Method Area)**:有时也被称作“永久代”,但自Java 8起已经被...

    JVM虚拟机面试题汇总

    - **操作数栈(Operand Stack)**:主要用于保存计算过程中产生的中间结果,也用来存放操作数。 - **动态链接(Dynamic Link)**:包含一个指向运行时常量池中该栈帧所属方法的引用。 - **方法返回地址(Return ...

    02.Java虚拟机栈1

    2. **操作数栈**(Operand Stack):也叫表达式栈,是执行计算和操作的地方。在执行Java字节码指令时,会将操作数压入操作数栈,进行运算后将结果出栈。例如,在执行`int a = 1 + 2;`时,会先将1和2分别压入操作数栈...

    java虚拟机简介 jvm介绍

    2. **操作数栈顶寄存器**(Operand Stack Top Register, optop):指示操作数栈顶的位置。 3. **帧指针寄存器**(Frame Pointer Register, frame):指向当前方法调用帧的起始位置。 4. **变量槽指针寄存器**...

    Java虚拟机栈--栈帧.docx

    2. **操作数栈** (Operand Stack):也称为表达式栈,用于存储计算过程中的中间结果。在执行Java字节码指令时,操作数栈会被用来进行算术运算、对象创建等操作。栈顶元素经常作为操作的对象,而运算结果会被压入栈中...

    JVM 45道面试题和答案.docx

    - **操作数栈(Operand Stack)**:用于执行算术运算和存储中间结果。 - **动态连接(Dynamic Linking)**:存储方法的常量池引用,用于方法调用。 - **返回地址(Return Address)**:当方法执行完毕时,返回到...

    Test_istore_1.rar_The Test

    4. **操作数栈**: 执行计算和存储中间结果的地方,它是JVM的五个区域之一(其他包括本地变量表、操作数栈、常量池、方法区和堆)。 5. **索引定位**: `istore`指令需要一个索引参数,指示要存储的变量在局部变量表中...

    一套完整介绍java内存模型和内存结构的文档

    - **操作数栈(Operand Stack)**:支持方法内的表达式计算,通过栈操作(如Push/Pop)进行数据的存取。 - **帧数据区(Frame Data)**:包括常量池解析结果、方法返回时的处理以及异常处理信息。 - **异常处理**:当...

    9 一段java代码是如何执行的?.docx

    - **操作数栈(Operand Stack)**:执行算术运算和逻辑操作,类似于一个临时的工作区,用于存储中间结果。 - **动态链接(Dynamic Linking)**:指向运行时方法的常量池引用,用于方法调用。 - **方法前行地址...

Global site tag (gtag.js) - Google Analytics