【JVM学习笔记】虚拟机字节码执行引擎

虚拟机字节码执行引擎

java虚拟机核心组成部分之一,所有java虚拟机的执行引擎输入、输出都是一致的:输入的是字节码二进制流,处理过程是字节码解析执行的等效过程,输出的是执行结果

运行时栈帧结构

java虚拟机以方法作为最基本的执行单元,栈帧则是用于支持虚拟机进行方法调用和方法执行背后的数据结构,它也是虚拟机运行时数据区中的虚拟机栈的栈元素。栈帧存储了方法的局部变量表、操作数栈、动态连接和方法返回地址等信息,栈帧需要分配多少内存编译期已经确定,并不会收到程序运行期变量数据的影响;以java程序的角度来看,同一时刻、同一线程里面,在调用堆栈的所有方法都同时处于执行状态,但在活动线程中,只有位于栈顶的方法才是在运行的,被称为当前栈帧,执行引擎所运行的字节码执行都只针对当前栈帧进行操作。

局部变量表

是一组变量值的存储空间,属于线程私有,用于存放方法参数和方法内部定义的局部变量,在java程序被编译为class文件时就在方法的Code属性的max_locals数据项中确定了该方法所需分配的局部变量表的最大容量,它以变量槽为最小单位,它允许变量槽的长度可以随着处理器、操作系统或虚拟机实现的不同而发生变化

  • 工作机制

    • 当一个方法被调用时,java虚拟机会使用局部变量表来完成参数值到参数变量的传递过程,即实参到形参的传递。如果执行的是实例方法,那局部变量表的第0位索引的变量槽默认是用于传递方法所属对象实例的引用,可以用this表示,其余参数按照顺序排列,而且局部变量表是可以重用的

操作数栈

常被称为操作栈,是一个后入先出栈,它的最大深度在编译的时候已经确定

  • 工作机制

    • 当一个方法刚刚执行的时候,这个方法的操作数栈是空的,在方法的执行过程中会有各种字节码执行往操作数栈中写入和提取内容(入栈出栈的元素是局部变量表中的局部变量)

栈帧信息

  • 动态链接

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

  • 方法返回地址

    方法退出之后都必须返回到最初方法被调用时的位置

  • 附加信息

    可以返回一些java虚拟机没有描述的信息

方法调用

方法调用并不等于方法中的代码被执行,方法调用阶段唯一的任务就是确定被调用方法的版本(即调用哪一个方法),暂时还未涉及方法内部的具体运行过程

解析

所有方法调用的目标方法在Class文件中都是一个常量池中的符号引用,在类加载的解析阶段,会将一部分符号引用转化为直接引用,前提是方法在程序真正运行之前就有一个可确定的调用版本,并且在运行期不可改变,这类方法的调用被称为解析;符合“编译期可知,运行期不可变”要求的方法主要静包括态方法和私有方法,这两类都不可能重写出其他版本

  • 非虚方法

    私有方法、实例构造器、静态方法、父类方法,被final修饰的方法 这5中方法调用会在类加载的时候就可以把符号引用解析为该方法的直接引用。这些方法统称为“非虚方法”

    • 解析调用

      • 是个静态过程,在编译期就完全确定,在类加载阶段就会将符号引用转变为直接引用
    • 分派调用

      • 静态分派

        • 主要表现为重载,虚拟机在重载时是通过参数的静态类型而不是实际类型作为判定依据的
      • 动态分派

        • 主要表现为重写,在运行期间根据实际类型确定方法执行版本的分派过程叫做动态分派

动态类型语言支持

动态类型语言

类型检查的主体过程是在运行期而不是编译期进行的

java.lang.invoke包

主要目的是在之前单纯依靠符号引用来确定调用的目标方法这条路外提供一种新的动态确定目标方法的机制,称为方法句柄

  • 方法句柄和反射的区别

    • 1、反射是在模拟java代码层次的方法调用,方法句柄是在模拟字节码层次的方法调用
    • 2、反射是重量级的,方法句柄是轻量级的
    • 3、方法句柄可以享受虚拟机的优化策略,因为它是模拟字节码层面的方法调用

基于栈的字节码解释执行引擎

主要功能是配合虚拟机执行方法里面的字节码指令的

解释执行

java现在已经不能单纯归类于解释执行或者是编译执行,因为两者都有

基于栈的指令集与基于寄存器的指令集

javac编译器输出的字节码指令流是一种基于栈的指令集架构

  • 栈:优点: 1、可移植,因为寄存器由硬件直接提供,程序直接依赖这些硬件寄存器则不可避免的受硬件的约束;2、代码相对更紧凑、编译器实现更加简单。缺点:1、理论上执行速度相对慢一些
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值