虚拟机字节码执行引擎

  • Java执行引擎的过程为:输入的是字节码文件,处理过程是字节码解析的等效过程,输出的是执行结果。
  • 栈帧是支持虚拟机方法调用与执行的数据结构,栈帧存储了方法的局部变量表,操作数栈,动态连接,方法返回地址等信息。每一个方法的调用都是栈帧在虚拟机栈中入栈和出栈的过程。在活动线程中,只有位于栈顶的栈帧才是有效的,称为当前栈帧。
    • 局部变量表
      • 局部变量表是一组变量值存储空间,用于存放方法参数与方法内部定义的局部变量。
      • 在方法执行时,虚拟机使用局部变量表完成参数值到参数变量列表的传递过程。
      • 类变量在类加载的过程中有两次赋值阶段,准备阶段与初始化阶段;实例变量在对象创建的时候也有两次赋值;但是一个局部变量在定义之后必须赋初始值,不然无法使用。
    • 操作数栈
      • 在方法执行过程中,会有各种字节码指令往操作数栈中进行写入与读取内容。
    • 动态连接
      • Class文件中常量池中有大量符号引用,这些符号引用在类加载时会有一部分在解析阶段转换为直接引用(指向实际的内存地址),称为静态解析;还有一部分在运行期间解析,称为动态连接。
    • 方法返回地址
  • 方法调用:
    • 一切方法调用在Class文件中存储的都是符号引用,而不是方法在实际运行时在内存的入口地址(直接引用)。在类加载阶段,会将其中一部分符号引用转换为直接引用,这种解析能成立的前提是:方法在程序运行之前就有一个可确定的调用版本,并且这个方法在运行期间是不可改变的。
    • 在Java中符合“编译期可知,运行期不变”这个要求的方法主要包括:静态方法,私有方法,实例构造器,父类方法,前者与类型相关联,后者在外部不可访问。
  • 分派:
    • 静态分派
      • 变量的静态类型在编译期可知,而实际类型只有到了运行期才能确定,编译器在编译程序的时候根本不知道变量的实际类型。
      • 虚拟机(准确来说是编译器)在重载的时候是根据参数的静态类型作为判断依据;javac编译器会根据参数的静态类型决定使用哪个版本。
      • 静态分派的典型应用是方法重载
    • 动态分派:
      • 在运行期根据实际类型确定方法执行版本的分派称为动态分派。
      • 动态分派主要应用于方法的重写


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值