Java JVM:字节码执行引擎(六)

news2024/9/22 15:52:03

执行引擎是 Java 虚拟机核心的组成部分之一,执行引擎由软件自行实现

目录

    • 一、运行时栈帧结构
    • 二、方法调用
    • 三、基于栈的字节码解释执行引擎
    • 四、OSGI:灵活的类加载器架构

一、运行时栈帧结构

  • Java 虚拟机以方法作为最基本的执行单元,“栈帧”则是用于支持虚拟机进行方法调用和方法执行背后的数据结构
  • 栈帧包括局部变量表、操作数栈、动态链接、方法返回地址和一些额外的附加信息
  • 在编译 Java 源码的时候,需要多大的局部变量表,多深的操作数栈已经被计算出来了,并写入了 Code 属性之中
  • 在活动线程中,只有位于栈顶顶方法才是在运行的(当前栈帧)
  • 局部变量表
    • 一组变量值的存储空间,存放方法参数和方法内部定义的局部变量,容量以变量槽为最小单位
    • 每个变量槽应占用 32 位长度的内存空间
      • 可以随着处理器、操作系统或虚拟机实现的不同而发生变化
      • 需要用对齐和补白的手段让变量槽在外观上看起来与 32 位虚拟机中一致
      • Java 虚拟机会以高位对齐的方式为其分配两个连续的变量槽空间(long、double)
  • 操作数栈
    • 操作栈,后入先出,最大深度在编译的时候被写入到 Code 属性的max_stacks 数据项中
    • Javac 编译器的数据流分析工作保证了在方法执行的任何时候,操作数栈道深度都不会超过在 max_stacks 数据项中设定的最大值
    • 刚刚开始执行时,各种字节码指令往操作数栈中写入和提取内容,也就是出栈入栈
    • 两个不同的栈帧作为不同方法的虚拟机栈元素,是相互独立的
    • Java 虚拟机的解释执行引擎被称为“基于栈道执行引擎”,栈就是操作数栈
  • 动态连接
    • 每个栈帧都包含一个指向运行时常量池中该栈帧所属方法都引用,这个引用是为了支持方法调用过程中的动态连接
    • 符号引用一部分会在类加载阶段或者第一次使用的时候就被转化为直接引用,这就是静态解析
    • 每一次运行期间都转化为直接引用,这部分就称为动态连接
  • 方法返回地址
    • 方法退出方式
      • 执行引擎遇到任意一个方法返回的字节码指令(正常调用完成)
        • 正常退出时,主调方法的 PC 计数器的值可以作为返回地址,栈帧中很可能会保存这个计数器值
      • 方法执行过程中遇到异常(异常调用完成)
        • 异常退出时,通过异常处理器表来确定的
    • 退出时可能的操作
      • 恢复上层方法的局部变量表和操作数栈,把返回值压入调用者栈帧的操作数栈中,调整 PC 计数器的值以指向方法调用指令后面的一条指令等

二、方法调用

  • 解析
    • 所有方法调用的目标方法在 Class 文件里面都是一个常量池中的符号引用
    • 在类加载的解析阶段,会将其中的一部分符号引用转化为直接引用
      • 方法在程序真正运行之前就有一个可确定的调用版本,并且这个方法的调用版本在运行期是不可改变了
  • 分派
    • 静态分派
      • 重载
    • 动态分派
      • 重写
    • 单分派和多分派
  • 动态类型语言
    • 关键特征就是它的类型检查的主体过程是在运行期而不是编译期进行的

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

  • 解释执行
    • 代码执行过程
      • javac 编译器完成了程序代码经过词法分析、语法分析道抽象语法树,再遍历语法树生成线性的字节码指令流的过程
      • 这一部分动作在 Java 虚拟机之外进行,而解释器在虚拟机内部,所以Java 程序的编译就是半独立的实现

在这里插入图片描述

  • 基于栈的指令集与基于寄存器的指令集
    • javac 编译器输出的字节码指令流,基本上是一种基于栈的指令集架构,字节码指令流里面的指令大部分都是零地址指令,他们依赖操作数栈工作
  • 基于栈的解释器执行过程

在这里插入图片描述

四、OSGI:灵活的类加载器架构

  • 基于 Java 语言的动态模块化规范
  • 在 OSGI 里面,Bundle 之间的依赖关系从传统的上层模块依赖底层模块转变为平级模块之间的依赖,而且类库的可见性能得到非常精确的控制
    • 一个模块只有被 Export 过的 Package 才可能被外界访问,其他的 Package 和 Class 将会被隐藏起来
  • OSGI 的 Bundle 类加载器之间只有规则,没有固定的委派关系
  • Bundle 类加载器为其他 Bundle 提供服务时,会根据 Export-Package 列表严格控制访问范围
    • 如果没有 Export,不会提供给其他 Bundle 使用,也不会把其他 Bundle 的类加载请求分配给这个 Bundle 来处理

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/188425.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何用ffmpeg截取视频片段 以及 截取时间不准确的坑

之前在工作中,有遇到需要程序化截取视频片段的场景,这里使用ffmpeg命令行就可以很容易实现,这里也记录下我们使用过程中遇到的坑,希望对大家也有所帮助。    举个例子,当我们要截取视频文件中input.mp4的第15秒到第9…

【C语言练习】逻辑分析题

目录题目一:求名次题目详情:解题思路:题目二:找凶手题目详情:解题思路:题目一:求名次 题目详情: 5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果: A…

(02)Cartographer源码无死角解析-(52) 2D点云扫描匹配→ceres扫描匹配:CeresScanMatcher2D→栅格地图残差

讲解关于slam一系列文章汇总链接:史上最全slam从零开始,针对于本栏目讲解(02)Cartographer源码无死角解析-链接如下: (02)Cartographer源码无死角解析- (00)目录_最新无死角讲解:https://blog.csdn.net/weixin_43013761/article/details/127350885 文末…

上海洲邦携手图扑建设数字孪生工厂,获 2022 智能制造优秀场景

前言 12 月 2 日,工信部公示了 2022 年度智能制造示范工厂揭榜单位和优秀场景名单。图扑软件和上海洲邦合作建设的宁波甬友数字孪生工厂被评为优秀场景,全国共有 369 个智能制造典型场景入选。 《智能制造试点示范行动实施方案》包括智能制造优秀场景和…

ESP-IDF:快速排序测试

ESP-IDF:快速排序测试 /快速排序测试/ void printArray(int arr[], int len) { for (int i 0; i < len; i) { cout << arr[i] << " "; } cout << endl; } void QuickSort(int arr[], int start, int end) { int i start; int j end; // 找…

【IoT】蔽障智能车设计:带有无线调试系统的蔽障小车

说明 近年来随着计算机在社会领域的渗透和大规模集成电路的发展&#xff0c;单片机的应用正在不断地走向深入&#xff0c;由于它具有功能强&#xff0c;体积小&#xff0c;功耗低&#xff0c;价格便宜&#xff0c;工作可靠&#xff0c;使用方便等特点&#xff0c;因此越来越广…

Activiti7工作流-使用idea插件actiBPM设计请假流程---工作流工作笔记005

首先我们看一下我们之前写的测试类, ProcessEngine 这个流程引擎,打开 看源码可以看到有几个常用的, HistoryService就是用来管理之前_hi表的,关于历史的 TaskService用来管理任务的 RuntimeService用来管理_run那些运行时的表的 然后我们还可以通过,上面定义的processEngi…

程序员的成长离不开哪些软技能?

道破一个残忍的真相&#xff1a;一个程序员的成长往往是软技能&#xff1e;硬技能&#xff0c;想纯靠技术能力一路挺过35岁基本是不可能的任务&#xff0c;作为一个优秀的程序员&#xff0c;离不开以下这些软技能。 较真 所有在技术上的较真都是一次专业技能的提升&#xff0…

Ruoyi-Cloud框架学习-【07 新增功能模块】

根据该博客新建模块后&#xff0c;在添加具体的数据表实现增删改查 在ruoyi-cloud中建立数据表 新建business_device表中【与gen_table、gen_table_column在一个库】 CREATE TABLE business_device (id bigint NOT NULL AUTO_INCREMENT COMMENT 主键,name varchar(255) COLLA…

USB转双串口芯片 CH342 兼容替代CP2105

概述CH342是一个USB总线的转接芯片&#xff0c;实现USB转两个异步串口。每个串口都支持高速全双工&#xff0c;支持奇偶校验&#xff0c;提供了常用的MODEM联络信号&#xff0c;用于为计算机扩展异步串口&#xff0c;或者将普通的串口设备或者MCU直接升级到USB总线。特点全速US…

PySpark数据分析基础:核心数据集RDD原理以及操作一文详解(一)

目录 前言 一、RDD概念 二、RDD与DataFrame之间的区别 特性区别 本质区别 三、PySpark中RDD的操作 1.aggregate 2.aggregateByKey 3.map 4.mapPartitions 5.getNumPartitions 6. glom() 点关注&#xff0c;防走丢&#xff0c;如有纰漏之处&#xff0c;请留言指教&am…

< 每日算法 - JavaScript解析:用两个栈实现队列 >

每日算法 - JavaScript解析&#xff1a;用两个栈实现队列一、任务描述&#xff1a;拓展知识二、问题解析三、解决方案&#xff1a;参考文献往期内容 &#x1f4a8;一、任务描述&#xff1a; 用两个栈实现一个队列。队列的声明如下&#xff0c;请实现它的两个函数 appendTail 和…

JS扩展运算符(...)的用法

参考链接&#xff1a; 本文可以说是完全抄写的参考链接的内容&#xff0c;本文的目的只用于自己进行记录&#xff0c;加深理解。原文参考链接 一、定义&#xff1a; 扩展运算符(...)是ES6的新增语法&#xff0c;用于取出参数对象中的所有可遍历属性&#xff0c;然后拷贝到当前…

vue移动端适配方案

一、基于rem的适配方案 rem是什么&#xff1f; rem是指相对于根元素的字体大小的单位&#xff0c;在日常开发过程中我们通常把根元素&#xff08;html/body&#xff09;的字体设置为10px,方便于我们计算&#xff08;此时子元素的1rem就相当于10px&#xff09;。 适用场景 不…

开学季,给上小学的孩子送什么比较好?小学生比较实用的礼物

很快来临开学的日子&#xff0c;对于上小学的孩子们&#xff0c;送写学习用具之类&#xff0c;或者是孩子自身喜欢的玩具也可以的&#xff0c;但是因为大部分小朋友在学习时都会眨眼睛&#xff0c;也有些近视的现象了&#xff0c;所以我会选择送护眼的用具比较合适的&#xff0…

DBCO-SS-NHS;CAS NO:1435934-53-4 二苯并环辛炔-二硫键-活性酯,科研实验用试剂

DBCO-SS-活性酯|DBCO-SS-NHS酯 名称;二苯并环辛炔-二硫键-活性酯&#xff1b;DBCO-SS-NHS CAS NO&#xff1a;1435934-53-4 分子量&#xff1a;565.66 分子式&#xff1a;C28H27N3O6S2 含 量&#xff1a;>95% 用 途&#xff1a;仅供科研实验使用&#xff0c;不用于诊治…

Kettle(三)数据写入错误如何处理?

Kettle作为数据治理工具&#xff0c;总是会涉及到数据的搬迁&#xff0c;在原始数据过大、种类过多时写入肯定会出现一些错误&#xff08;缺少必填项、数据格式错误、主键冲突等等&#xff09;&#xff0c;那么Kettle如何解决&#xff1f;其实Kettle与我们自己写程序的思维不会…

从零开发一个非常有意思的 Python 项目:手势识别

最近开发了一个手势处理的项目&#xff08;零基础也可以学&#xff0c;就是针对零基础的&#xff09;&#xff0c;我在这儿简单的复述一下原理&#xff0c;总体来说还是比较简单的&#xff0c;主要运用的知识就是opencv&#xff0c;python基本语法&#xff0c;图像处理基础知识…

OCR文字识别技术

OCR全称是optical character recognition&#xff0c;中文光学字符识别。主要技术是&#xff1a;把图像形状转变为文本字符。简单来说&#xff0c;OCR技术就是通过图像处理和模式识别技术对光学的字符进行识别&#xff0c;即&#xff0c;对文本资料进行扫描&#xff0c;然后对图…

呕心沥血保姆级Fiddler移动端抓包

本篇文章&#xff0c;博主想使用通俗易懂的话语&#xff0c;让大家明白以下内容&#xff1a;什么是抓包哪些场景需要用到抓包Fiddler抓包的原理怎样使用Fiddler进行移动端抓包抓包包 (Packet) 是TCP/IP协议通信传输中的数据单位&#xff0c;一般也称“数据包”。我们平常测试过…