`
wangwengcn
  • 浏览: 172740 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

栈帧、局部变量表、操作数栈

    博客分类:
  • JVM
阅读更多

1.定义
     栈帧(stack frame)是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区中的虚拟机栈的栈元素。栈帧存储了方法的局部变量表、操作数栈、动态连接和方法返回地址等信息。
     每一个方法从调用开始到执行完成的过程,就对应着一个栈帧在虚拟机栈里面从入栈到出栈的过程。
     对于执行引擎来说,活动线程中,只有栈顶的栈帧是有效的,称为当前栈帧,这个栈帧所关联的方法称为当前方法。执行引擎所运行的所有字节码指令都只针对当前栈帧进行操作。

 

 

2.组成
 (1)局部变量表
      局部变量表是一组变量值存储空间,用于存放方法参数和方法内部定义的局部变量。在Java程序被编译成Class文件时,就在方法的Code属性的max_locals数据项中确定了该方法所需要分配的
      最大局部变量表的容量。
      局部变量表的容量以变量槽(Slot)为最小单位,32位虚拟机中一个Slot可以存放一个32位以内的数据类型(boolean、byte、char、short、int、float、reference和returnAddress八种)。
      reference类型虚拟机规范没有明确说明它的长度,但一般来说,虚拟机实现至少都应当能从此引用中直接或者间接地查找到对象在Java堆中的起始地址索引和方法区中的对象类型数据。
      returnAddress类型是为字节码指令jsr、jsr_w和ret服务的,它指向了一条字节码指令的地址。
      虚拟机是使用局部变量表完成参数值到参数变量列表的传递过程的,如果是实例方法(非static),那么局部变量表的第0位索引的Slot默认是用于传递方法所属对象实例的引用,在方法中通过this访问。
      Slot是可以重用的,当Slot中的变量超出了作用域,那么下一次分配Slot的时候,将会覆盖原来的数据。Slot对对象的引用会影响GC(要是被引用,将不会被回收)。
  系统不会为局部变量赋予初始值(实例变量和类变量都会被赋予初始值)。也就是说不存在类变量那样的准备阶段。
 (2)操作数栈
      Java虚拟机的解释执行引擎被称为"基于栈的执行引擎",其中所指的栈就是指-操作数栈。
      操作数栈也常被称为操作栈。
     和局部变量区一样,操作数栈也是被组织成一个以字长为单位的数组。但是和前者不同的是,它不是通过索引来访问,而是通过标准的栈操作—压栈和出栈—来访问的。比如,如果某个指令把一个值压入到操作数栈中,稍后另一个指令就可以弹出这个值来使用。
      虚拟机在操作数栈中存储数据的方式和在局部变量区中是一样的:如int、long、float、double、reference和returnType的存储。对于byte、short以及char类型的值在压入到操作数栈之前,也会被转换为int。
      虚拟机把操作数栈作为它的工作区——大多数指令都要从这里弹出数据,执行运算,然后把结果压回操作数栈。比如,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

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


  

分享到:
评论
6 楼 空城回转 2018-01-13  
永洁童心 写道
最后的图中,在afterload_1步骤中,operand stack中的顺序是不是应该98在上面,100在下面啊?
先把变量0入栈,再变量1入栈,应该是98,100吧

操作数栈是向下增长的,栈顶在最底部。
5 楼 永洁童心 2017-11-09  
最后的图中,在afterload_1步骤中,operand stack中的顺序是不是应该98在上面,100在下面啊?
先把变量0入栈,再变量1入栈,应该是98,100吧
4 楼 a492846462 2016-12-01  
    
3 楼 projim_tao 2016-11-25  
感谢楼主了,写得还是比较详细了,解答了我关于局部变量区和操作数栈的疑惑。
2 楼 wangwengcn 2015-12-20  
manxisuo 写道
写的非常好,谢谢博主。

难得有人光临我的博客
1 楼 manxisuo 2015-05-14  
写的非常好,谢谢博主。

相关推荐

    JVM教程吐血整理干货.md

    局部变量表 操作数栈 动态连接 方法出口 本地方法栈 堆 方法区 JavaVirtualMachineError StackOverflowError OutOfMemoryError JVM PS:JVM部分参考了《深入理解Java虚拟机 - 第二版》(周志明). 个人认为《深入理解...

    【jvm】01- java内存结构分析

    java内存结构分析java内存结构java栈结构分析:栈帧局部变量表操作数栈动态连接返回地址运行时常量池对象的创建过程类加载的执行流程图对象创建的过程:对象内存分配方式指针碰撞空闲列表栈上分配:内存逃逸:对象...

    xiaozhengyu#StudyNotes#8.2.1局部变量表1

    栈帧中存储的数据大致有:局部变量表、操作数栈、动态连接、方法返回地址图1 虚拟机运行时数据区域图2 栈帧的结构2. 局部变量表的说明局部变量表(Local Va

    【JVM】虚拟机栈的五脏六腑

    操作数栈 动态链接 方法返回地址 局部变量表 可以将局部变量表理解为一个数组,数组中的内容为所在的栈帧对应的方法上参数以及方法体内的局部变量,可以有基本数据类型、对象引用(真正的对象在堆上)。 既然是...

    精简版JVM总结.pdf

    栈帧中包括局部变量表、操作数栈、动态链接、方法出口等信息 线程请求的栈深度大于虚拟机规定的栈深度,会抛出 StackOverflowError,当栈空间动态扩 展,但无法申请足够的内存,将抛出 OutOfMemoryError 本地方法栈 ...

    Java虚拟机栈--栈帧.docx

    1.局部变量表 (Local Variables) 2.操作数栈 (Operand Stack)(或表达式栈) 3.动态链接 (Dynamic Linking)(或执行"运行时常量池"的方法引用)----深入理解Java多态特性必读!! 4.方法返回地址(Return ...

    15.运行时栈帧结构1

    1.局部变量表 2.操作数栈 3. 动态链接 4. 法返回地址

    虚拟机运行时栈帧的结构

    执行引擎是 java 虚拟机最核心的组成部分之一.在虚拟机规范中制定了虚拟机字节码执行引擎的概念...栈帧中存储了方法的局部变量表、操作数栈、动态链接和方法返回地址等信息. 每个方法从调用开始到执行完成,对应着栈帧

    最新java面试专题01-JVM

    栈是线程私有的内存区域,每个方法执行时都会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接等信息;程序计数器是线程私有的,用于记录当前虚拟机正在执行的线程指令。 JVM生命周期:JVM的生命周期始于启动...

    JAVA面试冲刺—通过代码深入理解JVM—(未完待续)

    (Verify)3.2 准备(Prepare)3.3 解析(Resolve)3、初始化4、类加载器五、运行时数据区(Runtime Data Area)1、PC寄存器(Program Counter Register)2、虚拟机栈2.1 栈帧2.1.1局部变量表2.1.2 操作数栈2.1.3...

    java8rt.jar源码-JVM:学习JVM

    2.java虚拟机栈:线程私有,虚拟机栈描述的是java方法执行的内存模型:每个方法在执行的时候都会创建一个栈帧,存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个 方法从调用到执行完成的过程中,就对应...

    JVM内存模型及垃圾回收

    定义 通俗的来讲,jvm主要...栈: 线程私有存储空间,访问速度仅次于寄存器,栈里面的存储单位为,栈帧, 栈帧对应着方法, 存放着方法的 局部变量表,操作数栈,常量池引用,方法返回地址。 本地方法栈:用于管理本

    Java虚拟机面试问题

     Java虚拟机栈描述的是java方法的执行的内存模型,每个方法在执行的时候都会创建一个栈帧,用于存储局部变量表,操作数栈,方法出口等,一个方法从调用到执行完成对应着栈帧在虚拟机中入栈到出栈的过程。...

    leetcode能不能引入头文件-Starzhang:Starzhang

    虚拟机栈描述的是java方法执行的内存模型,每个方法在执行的时都会创建一个栈帧用于存储局部变量表,操作数栈、动态链接、方法出口等信息。每个方法从调用到结束就会有栈帧在虚拟机栈中入栈和出栈。一个方法的调用链...

    Java常见面试问题整理.docx

    2.Java虚拟机栈:描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧 ,用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用直至执行完成的过程,就对应着一个栈帧在...

    Java虚拟机规范.Java SE 8版

    第3章详述如何将Java语言编写的程序转换为Java虚拟机指令集,涉及常量、局部变量、控制结构、算术运算、参数接收、方法调用、数组、操作数栈、异常处理、同步与注解等;第4章深入分析用来表示编译后的类和接口的...

    【带书签】Java虚拟机规范(Java SE 7).pdf

    第3章详述如何将Java语言编写的程序转换为Java虚拟机指令集,涉及常量、局部变量、控制结构、算术运算、参数接收、方法调用、数组、操作数栈异常处理、同步与注解等。第4章深入分析了用来表示编译后的类和接口的...

    Java虚拟机规范(Java SE 7)中文版

    第3章详述如何将Java语言编写的程序转换为Java虚拟机指令集,涉及常量、局部变量、控制结构、算术运算、参数接收、方法调用、数组、操作数栈异常处理、同步与注解等。第4章深入分析了用来表示编译后的类和接口的...

    java虚拟机规范 jdk8.

    第3章详述如何将Java语言编写的程序转换为Java虚拟机指令集,涉及常量、局部变量、控制结构、算术运算、参数接收、方法调用、数组、操作数栈、异常处理、同步与注解等;第4章深入分析用来表示编译后的类和接口的...

Global site tag (gtag.js) - Google Analytics