字节码执行引擎

21 篇文章 0 订阅

概述

  • JVM的字节码执行引擎,功能基本就是输入字节码文件,然后对字节码进行解析并处理,最后输出执行的结果
  • 实现方式可能有通过解释器直接解释执行字节码,或者是通过即时编译器产生本地代码,也就是编译执行,当然也可能两者皆有

栈帧概述

  • 栈帧是用于支持JVM进行方法调用和方法执行的数据结构
  • 栈帧随着方法调用而创建,随着方法结束而销毁
  • 栈帧里面存储了方法的局部变量、操作数栈、动态连接、方法返回地址等信息

栈帧结构概述

局部变量表

  • 局部变量表:用来存放方法参数和方法内部定义的局部变量的存储空间
    • 以变量槽slot为单位,目前一个slot存放32位以内的数据类型
    • 对64位的数据占2个slot
    • 对于实例方法,第0位slot存放的是this,然后从1到n,依次分配给参数列表
    • 根据方法体内部定义的变量顺序和作用域来分配slot
    • slot是复用的,以节省栈帧空间,这种设计可能会影响到系统的垃圾收集行为

操作数栈

  • 操作数栈:用来存放方法运行期间,各个指令操作的数据
    • 操作数栈中元素的数据类型必须和字节码指令的顺序严格匹配
    • 虚拟机在实现栈帧的时候可能会做一些优化,让两个栈帧出现部分重叠区域,以存放公用的数据

动态连接

  • 动态连接每个栈帧有一个指向运行时常量池中该栈帧所属方法的引用,以支持方法调用过程的动态连接
    • 静态解析:类加载的时候,符号引用就转化成直接引用
    • 动态连接:运行期间转换为直接引用

方法返回地址

  • 方法返回地址:方法执行后返回的地址

方法调用

  • 方法调用:方法调用就是确定具体调用哪一个方法,并不涉及方法内部的执行细节
    • 部分方法是直接在类加载的解析阶段,就确定了直接引用关系。(比如说静态方法、私有方法、实例构造器以及父类方法)
    • 但是对于实例方法,也称虚方法、因为重载和多态,需要运行期动态委派

分派

  • 分派:又分为静态分派和动态分派
    • 静态分派:所有依赖静态类型来定位方法执行版本的分派方式,比如:重载方法
    • 动态分派(也叫后期分派):根据运行期的实际类型来定位方法执行版本的方式,比如:覆盖方法
  • 单分派和多分派:就是按照分派思考的维度,多余一个的就算多分派,只有一个的成为单分派
  • 如何执行方法中的字节码指令:JVM通过基于栈的字节码解析执行引擎来执行指令,JVM的指令集也是基于栈的
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JackieLeeee

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值