业余生活要有意义,不要越轨。——华盛顿

引导语

“虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机的执行引擎则是由软件自行实现的。

在《Java虚拟机规范》中制定了Java虚拟机字节码执行引擎的概念模型,这个概念模型成为各大发行商的Java虚拟机执行引擎的统一外观。

从外观上来看,所有的Java虚拟机的执行引擎输入、输出都是一致的:输入的是字节码二进制流,处理过程是字节码解析执行的等效过程,输出的是执行结果。

1 运行时栈帧结构

栈帧,是用于支持虚拟机进行方法调用和方法执行背后的数据结构,它也是虚拟机运行时数据区中的虚拟机栈的栈元素。

栈帧存储了方法的局部变量表、操作数栈、动态连接和方法返回地址等信息。

每一个方法从调用开始至执行结束的过程,都对应着一个栈帧在虚拟机栈里面从入栈到出栈的过程。

一个栈帧需要分配多少内存,并不会受到程序运行期变量数据的影响,而仅仅取决于程序源码和具体的虚拟机实现的栈内存布局形式。

对于执行引擎来讲,在活动线程中,只有位于栈顶的方法才是在运行的,只有位于栈顶的栈帧才是生效的,其被称为“当前栈帧”,与这个栈帧所关联的方法被称为“当前方法”。执行引擎所运行的所有字节码指令都只针对当前栈帧进行操作。

虚拟机栈和栈帧的总体结构,如图:

2 局部变量表

局部变量表是一组变量值的存储空间,用于存放方法参数和方法内部定义的局部变量。

在Java程序被编译为Class文件时,就在方法的Code属性的max_locals数据项中确定了该方法所需分配的局部变量表的最大容量。

这里说下reference类型,它表示对一个对象实例的引用。一般来说,虚拟机实现通过这个引用做到:

①从根据引用直接或间接地查找到对象在Java堆中的数据存放的起始地址或索引。

②根据引用直接或间接地查找到对象所属数据类型在方法区中的存储的类型信息

由于局部变量表是建立在线程堆栈中的,属于线程私有的数据,无论读写两个连续的变量槽是否为原子操作,都不会引起数据竞争和线程安全问题。

Java虚拟机通过索引定位的方式使用局部变量表,索引值的范围是从0开始至局部变量表最大的变量槽数量。

当一个方法被调用时,Java虚拟机会使用局部变量表来完成参数值到参数变量列表的传递过程,即实参到形参的传递。

为了尽可能节省栈帧耗用的内存空间,局部变量表中的变量槽是可以重用的,方法体中定义的变量,其作用域并不一定会覆盖整个方法体,如果当前字节码PC计数器的值已经超出了某个变量的作用域,那这个变量对应的变量槽就可以交给其他变量来重用。

推荐编码规则:

a. 不使用的对象应手动赋值为null。(从编码角度讲,以恰当的变量作用域来控制变量回收时间才是最优雅的解决方法;从执行角度来讲,使用赋null操作来优化内存回收是建立在对字节码执行引擎概念模型的理解之上的)

b. 如果一个局部变量定义了但没有赋初始值,那它是完全不能使用的。所以不要认为Java中任何情况下都存在诸如整型变量默认为0、布尔型变量默认为false等这样的默认值规则。

3 操作(数)栈

操作数栈是一个后入先出(LIFO)栈。操作数栈的最大深度也在编译的时候被写入到Code属性的max_stacks数据项之中。

当一个方法刚刚开始执行的时候,这个方法的操作数栈是空的,在方法的执行过程中,会有各种字节码指令往操作数栈中写入和提取内容,也就是出栈和入栈操作。

两个栈帧之间的数据共享:

4 动态连接

每个栈帧都包含一个指向运行时常量池中该栈帧所属方法的引用,持有这个引用是为了支持方法调用过程中的动态连接。

字节码中的方法调用指令就以常量池里指向方法的符号引用作为参数。这些符号引用一部分会在类加载阶段或者第一次使用的时候就被转化为直接引用,这种转化被称为静态解析。另外一部分将在每一次运行期间都转化为直接引用,这部分就称为动态连接。

5 方法返回地址

当一个方法开始执行后,只有两种方式退出这个方法。

正常调用完成:执行引擎遇到任意一个方法返回的字节码指令。

异常调用完成:在方法执行的过程中遇到了异常,并且这个异常没有在方法体内得到妥善处理。

一个方法使用异常完成出口的方式退出,是不会给它的上层调用者提供任何返回值的。

一般来说,方法正常退出时,主调方法的PC计数器的值就可以作为返回地址,栈帧中很可能会保存这个计数器值。而方法异常退出时,返回地址是要通过异常处理器表来确定的,栈帧中就一般不会保存这部分信息。

java虚拟机栈帧_Java虚拟机,运行时栈帧结构相关推荐

  1. java帧结构_Java虚拟机运行时栈帧结构--《深入理解Java虚拟机》学习笔记及个人理解(二)...

    Java虚拟机运行时栈帧结构(周志明书上P237页) 栈帧是什么? 栈帧是一种数据结构,用于虚拟机进行方法的调用和执行. 栈帧是虚拟机栈的栈元素,也就是入栈和出栈的一个单元. 2018.1.2更新(在 ...

  2. Java虚拟机运行时栈帧结构--《深入理解Java虚拟机》学习笔记及个人理解(二)

    Java虚拟机运行时栈帧结构(周志明书上P237页) 栈帧是什么? 栈帧是一种数据结构,用于虚拟机进行方法的调用和执行. 栈帧是虚拟机栈的栈元素,也就是入栈和出栈的一个单元. 2018.1.2更新(在 ...

  3. java 虚拟机的原理_java虚拟机的原理

    所谓虚拟机,就是一台虚拟的机器.它是一款软件,用来执行一系列虚拟计算机指令,大体上虚拟机可以分为系统虚拟机和程序虚拟机,Visual Box .Vmare就属于系统虚拟机.他们完全是对物理计算机的仿真 ...

  4. JVM007_运行时栈帧结构

    运行时栈帧结构 执行引擎是JVM的核心组件之一. 所有Java虚拟机的执行引擎输入输出都是一致的:输入的是字节码二进制流,处理过程是字节码解析执行的等效过程,输出的是执行结果. JVM以方法作为作基本 ...

  5. java虚拟机工作原理_Java虚拟机工作原理具体解释

    一.类载入器 首先来看一下java程序的运行过程. 从这个框图非常easy大体上了解java程序工作原理.首先,你写好java代码,保存到硬盘其中.然后你在命令行中输入 javac YourClass ...

  6. Java的JVM运行时栈结构和方法调用详解

    详细介绍了Java 的JVM的运行时栈结构,以及和方法调用详解,包括解析调用和分派调用. JVM对于方法的执行是基于栈的,方法调用--入栈,方法调用完毕--出栈,了解JVM的运行时栈结构,有助于我们更 ...

  7. java虚拟机手机下载_java虚拟机下载

    java虚拟机是一款可以运行Java代码的虚拟计算机软件.java虚拟机是根据规格描述将java解释器移植到指定计算机上,就能保证经过用户编译的任何Java代码能够在虚拟系统上完美运行. java虚拟 ...

  8. java虚拟机手机下载_java虚拟机

    java虚拟机是一款可以运行Java代码的虚拟计算机软件.java虚拟机是根据规格描述将java解释器移植到指定计算机上,就能保证经过用户编译的任何Java代码能够在虚拟系统上完美运行. java虚拟 ...

  9. x86_64 Linux 运行时栈的字节对齐

    前言 C语言的过程调用机制(即函数之间的调用)的一个关键特性(起始大多数编程语言也是如此)都是使用了栈数据结构提供的后进先出的内存管理原则.每一个函数的栈空间被称为栈帧,一个栈帧上包含了保存的寄存器. ...

最新文章

  1. 【错误记录】Android 应用安装报错 ( The application could not be installed: INSTALL_FAILED_CONFLICTING_PROVIDER )
  2. python程序代码解析_Python源码分析3 – 词法分析器PyTokenizer
  3. Tomcat6.0.37,tomcat6.0.37,下访问Web项目,jsp项目不需要输入项目名称和端口号的配置方法...
  4. 敏捷开发需求文档_需求的长期,敏捷文档
  5. java程序在centos7里面开机自启动
  6. class会不会回收?用不到的class怎么回收_5分钟!用Java实现目标检测 | PyTorch
  7. C#通过COM组件操作IE浏览器(三):了解IHTMLDocument2
  8. windows temp用户问题
  9. We7开通问答系统:进一步开发社区的力量
  10. c语言新手的无奈,几个新手容易犯的错误
  11. 外卖红包返利小程序源码系统
  12. MAC 如何强制关闭程序
  13. Android 仿小米的全面屏手势-侧滑返回
  14. MQTT C Client实现消息推送(入门指南)
  15. 计算机知识高级试题,计算机高级技能证试题目计算机操作员高级理论知识复习.doc...
  16. 基础数论算法(4) 中国剩余定理
  17. Excel VBA(04)数组和字典
  18. C语言中的静态变量和静态函数
  19. 爆肝!!! orcale 期末复习资料整理
  20. 密码学研究-Provider

热门文章

  1. InfluxDB 2.0 Alpha展开测试!将会加入查询语言Flux
  2. SHELL训练营--day5__shell脚本(1)
  3. 给女友讲讲设计模式——适配器模式(JAVA实例)5
  4. Java堆内存分配与回收策略
  5. Swift 值类型和引用类型的内存管理
  6. SDT(software-defined Things)?软件定义的物件
  7. 一款基jquery超炫的动画导航菜单
  8. jquery autocomplete实现solr查询字段自动填充并执行查询
  9. 七喜携手AMD,摆脱英特尔“潜规则”
  10. 描述C#多线程中 lock关键字