虚拟机字节码执行引擎

1.运行的栈帧结构
栈帧(Stack Frame)是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区中的虚拟机栈(Virtual Machine Stack)的栈元素。栈帧存储了方法的局部变量表、操作数栈、动态连接和方法返回地址等信息。每一个方法从调用开始到执行完成的过程,就对应 着一个栈帧在虚拟机栈里面从入栈到出栈的过程。每个栈帧都包括了局部变量表、操作数栈、动态连接、方法连接、方法返回地址和一些额外的附加信息。在编译程序代码的时候,栈帧中需要多大的局部变量表、多深的操作数栈都已经完全确定了,并且写入到方法表的code属性之中,因此一个栈帧需要分配多少内存,不会受到程序运行期变量数据的影响,而仅仅取决于具体的虚拟机的实现。
1.1局部变量表
局部变量表是一组变量值存储空间,用于存放方法参数和方法内部定义的局部变量。
1.2操作数栈
操作数栈也常被称为操作栈,同局部变量表一样,操作数栈的最大深度也在编译的时候被写入到Code属性的max_stacks数据项之中。操作数据栈的每个元素可以是任意的java数据类型,包括long和double.32位数据类型所占的栈容量为1,64位数据类型所占的栈容量为2。在方法执行的任何时候,操作数栈的深度都不会超过max_stacks数据项中设定的最大值。
1.3动态连接
每个栈帧都包含一个指向运行时常量池中该栈帧所属方法的引用,持有这个引用是为了支持方法调用过程 中的动态连接。
1.4方法返回地址
当一个方法被执行后,有两种方式退出这个方法。第一种方式是执行引擎遇到任意一个方法返回的字节码指令,属于正常完成返回;另一种退出方式是,在方法执行过程遇到异常,并且这个异常没有在方法体内得到处理,属于异常退出。
1.5附加信息
虚拟机规范允许具体的虚拟机实现增加一些规范里没有描述的信息到栈帧之中,例如与调试相关的信息,这部分信息完全取决于具体的虚拟机实现,这里不再详述。在实际开发中,一般会把动态连接、方法返回地址与其他附加信息全部归为一类,称为栈帧信息。
2.方法调用
方法调用并不等同于方法执行,方法调用阶段唯一的任务就是确定被调用方法的版本(即调用哪一个方法),暂时还不涉及内部的具体运行过程。在程序运行,进行方法调用是最普遍、最频繁的操作。解析调用一定是个静态的过程,在编译期间就完全确定,在类装载的解析阶段就会把涉及的符号引用全部转变为可确定的直接引用,不会延迟到时运行期再去完成。而分派(Dispatch)调用则可能 是静态的也可能是动态的,依据分派的宗量数可分为单分派、动态多分派四种分派情况。
2.1解析
方法在程序真正运行之前就有一个可确定的调用版本,并且这个方法的调用版本在运行期是不可改变的,这类方法的调用称为解析。在java语言中编译期可知,运行期不可变,这个要求的方法有静态方法和私有方法,前者与类型直接关联,后者在外部不可被访问,这两种方法都不可能通过继承或别的方式重写其他版本,因此它们都适合在类加载阶段解析。java虚拟机提供了四条方法调用字节码指令,分别是:(1)invokestatic:调用静态方法(2)invokespecial:调用实例构造器方法、私有方法和父类方法(3)invokevirtual:调用所有的虚方法(4)invokeinterface:调用接口方法,会在运行时再确定一个实现些接口对象。
2.2分派
2.2.1静态分派
所有依赖静态类型来定位方法执行版本的分派动作,都称为静态分派。字符’a’重载的顺序char->int->long->float->double,可变长参数的重载优先级是最低的。
2.2.2动态分派
运行期根据实际类型确定方法执行版本的分派过程称为动态分派。
2.2.3单分派与多分派
方法的接收者与方法的参数统称为方法宗量,根据分派基于多少种宗量,可以将分派分为单分派和多分派两种。单分派是根据一个宗量对目标方法进行选择,多分派是根据多于一个的宗量对目标方法进行选择。
2.2.4虚拟机动态分派的实现
方法表是分派调用的 稳定优化手段,虚拟机除了使用方法表之外,在条件允许的情况下,还会使用内联缓存和基于类型继承关系分析技术的守护内联两种激进优化的手段来获得更高的性能。
3.基于栈的字节码解析执行引擎
3.1解析执行
java语言中,javac编译器完成了程序代码经过词法分析、语法分析到抽象方法树,再遍历语法生成线性的字节码指令流的过程。因为这一部分动作是在java虚拟机之外进行的,而解释器在虚拟机的内部,所以java程序的编译就是半独立的实现。
3.2基于栈的指令集与基于寄存器的指令集
java编译器输出的指令流,基本上是一种基于栈的指令集架构,指令流里面的大部分都零地址指令,它们依赖操作数栈进行工作。与之相对的另一套常用的指令集架构是基于寄存器的指令集,最典型的就是x86的二地址指令集,更通俗一些,就是现在我们主流PC中直接支持指令集架构。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值