《深入理解JAVA虚拟机(第2版)》- 第8章 - 学习笔记

news2024/11/13 14:30:21

第8章 虚拟机字节码执行引擎

8.1 概述

  1. 执行引擎是Java虚拟机最为核心的组成部分之一。
  2. 在不同的虚拟机里面,执行引擎在执行Java代码的时候可能会有解释执行(通过解释器执行)和编译执行(通过即时编译器生成本地代码执行)两种选择,也会有两者结合执行,甚至还会有包含不同等级编译器的执行引擎。

8.2 运行时栈帧结构

  1. 栈帧是用来支持虚拟机进行方法调用和方法执行的数据结构。
  2. 栈帧是运行时数据区中虚拟机栈中的栈元素。
  3. 方法从开始调用到执行完成的过程,就是栈帧在虚拟机栈中进栈和出栈的过程。
  4. 在编译程序代码的时候,栈帧中的需要多大的局部变量表,多深的操作数栈都已经确定好了,并且存储在方发表的Code属性中。
  5. 处于虚拟机栈栈顶的栈帧,称为当前栈,与该栈相关的方法称为当前方法。

栈帧中包含:局部变量表、操作数栈、动态连接、方法返回地址。

8.2.1 局部变量表
  1. 用来存储方法参数以及方法内部定义的局部变量。
  2. 局部变量表最小的单位是变量槽(Variable Slot,即Slot),虚拟机规范中没有规定一个Slot占用多大的内存空间。只是说一个Slot可以存放下一个32位以内的数据类型,例如:boolean、byte、char、short、int、float、reference或returnAddress类型的数据。
  3. 对于64位长度的数据类型来说(例如:long和double),虚拟机会采用高位对齐的方式为其分配2个连续的Slot空间。
8.2.2 操作数栈
  1. 操作数栈又称为操作栈,是一个后进先出(Last In First Out, LIFO)栈
  2. 操作数栈有多深,也是在编译的时候就确定了,并且存放在方发表中的Code属性中。
  3. 32位的数据类型所占的栈容量为1,64的数据类型所占栈容量为2。
  4. 概念模型中,栈帧和栈帧之间是相互独立的,但是虚拟机在实现的时候,通常会将下边栈帧的操作数栈和上边栈帧的局部变量表重合,这样做的目的是可以避免一些复制传递的操作,如下图: 在这里插入图片描述
8.2.3 动态连接
  1. 每个栈帧中都包含一个指向运行时常量池该栈帧所属方法的引用。用于方法调用过程当中的动态连接。

  2. 什么是静态解析? 什么是动态连接?

    在类加载过程中的解析阶段,会将部分符号引用转换为直接应用,称为静态解析。另外一部分符号引用在每次运行期间转换为直接引用,称为动态连接

8.2.4 方法返回地址
  1. 方法无论以何种方式退出,都需要返回到被调用的位置,继续执行,所以栈帧中保存的方法返回地址信息,就是为了帮助恢复上层方法的执行状态。
  2. 一般来说,方法正常退出,可以用调用者的PC计数器的值作为方法返回地址,栈帧中很可能保存了这个PC计数器的值。异常退出,方法返回地址是通过显示处理异常表来确定的,栈帧中一般不会保存这部分信息。

8.3 方法调用

  1. 方法调用不等同于方法执行,它要做的事情是确定方法调用的版本(因为多态)。
  2. Class文件在编译过程中不存在传统编译中的连接步骤,一切方法调用在Class文件中存储的都只是一个符号引用,而不是直接引用(即方法在实际执行时内存布局中的入口地址)。
8.3.1 解析
  1. 在类加载的解析阶段,会将符合特定条件的符号引用转换为直接引用,这个特定的条件是:编译器在编译的时候方法就有一个可确定的调用版本,并在运行期该版本也不会发生变化。这类方法的调用称为解析(Resolution)。

    这类方法包括:静态方法、私有方法、实例构造器、父类方法。这类方法也称为非虚方法,与之相反,其他方法称为虚方法除了被final关键字修饰的方法以外)。

  2. 解析调用是一个静态过程, 在编译期间就可以确定方法调用的版本,所以在类加载的解析阶段会将涉及到的方法的符号引用都转换为直接引用,不会延后到运行期去完成。

8.3.2 分派
  1. 相对于解析调用时一个静态的过程,分派即可以是静态的也可以是动态的。

  2. 根据分派依据的宗量数多少,分派可以分为单分派和多分派。

  3. 通过静态分派、动态分派、单分派、多分派,可以两两组合4种不同的分派方式:静态单分派、静态多分派、动态单分派、动态多分派。

  4. 面相对象的三大特征:封装、继承、多态。

  5. 什么是静态分派?什么是动态分派?

    • 首先我们需要知道什么是静态类型,什么是实际类型。例如:Human man = new Man(),这里的Human就是静态类型,Man就是实际类型。
    • 在编译期基于静态类型来确定方法调用版本的分派,称为静态分派,典型应用是:方法重载。静态分派是在编译期发生的,所以静态分派这个动作不是虚拟机来完成的
    • 在运行期基于实际类型来确定方法调用版本的分派,称为动态分派,典型应用是:方法重写。
  6. 什么是单分派?什么是多分派?

    • 首选我们需要了解两个概念接收者宗量

      接收者:以 User u = new User(); u.sayHello() 代码为例,其中对象u是方sayHello()的所有者,则对象u称为接收者(Receiver)

      宗量:方法的接收者和参数统称为方法的宗量

    • 根据1个宗量来确定方法调用版本称为单分派

    • 根据多个宗量来确定方法调用版本称为多分派

  7. 动态分派如何实现的?

    动态分派的方法版本确定过程需要在运行期在类的方法元数据中搜索合适的目标方法,基于效率的考虑,虚拟机采用的是在方法区建立一个虚方法表(Vritual Method Table,也称为vtable),以此替代在方法元数据中搜索。虚方法表中存放的是各个方法在内存布局中的实际入口地址。

    如果子类中没有对父类方法进行重写,则该方法在子类的虚方法中存放的入口地址和父类的方法的入口地址一致。反之,如果方法重写了,则该方法在子类的虚方法表中存放的就是指向子类实现版本的入口地址。

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

  1. 大部分程序代码到物理机的目标代码或虚拟机可执行的指令集之前,都需要经过下图中的各个步骤: 在这里插入图片描述
  2. 在Java语言中,Javac编译器的编译过程是:源码经过了词法分析、语法分析到生成抽象语法树(Abstract Syntax Tree,AST),再遍历抽象语法树生成线性的字节码指令流。这个过程是在虚拟机之外执行的,所以Java程序的编译器是半独立实现的,而解释器是在虚拟机内部的。
  3. 指令集架构分为:基于栈、基于寄存器。
    • 基于栈的指令集

      Java编译器输出的字节码指令流,基本上是基于栈的指令集架构(Instruction Set Architecture,ISA),指令流中的指令大都是零地址指令,它们需要依赖操作数栈进行工作。优点是可移植性好,缺点是执行效率低。

    • 基于寄存器的指令集

      最典型的就是x86的二地址指令集,通俗点来说,就是目前主流PC机所支持的指令集架构。由于要与硬件绑定,所以可移植性差,但是执行效率高。

    • 两者的区别

      基于栈的指令集中的指令只包含操作码,操作数是在栈帧中的操作数栈中存储的。

      基于寄存器的指令集中的指令包含了操作码和操作数两部分。

上一篇:《深入理解JAVA虚拟机(第2版)》- 第7章 - 学习笔记
下一篇:《深入理解JAVA虚拟机(第2版)》- 第10章 - 学习笔记

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

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

相关文章

监控平台之nodejs模拟后端接口

github:可以下载进行实验 https://github.com/Mr-Shi-root/sdk-platform/tree/master 1.配置node环境,安装express cors body-parser babel/cors body-parser - node.js 中间件,用于处理 JSON, Raw, Text 和 URL 编码的数据。cookie-parse…

光伏清洁机器人4G之痛,LoRa通讯取而代之?

光伏清洁机器人是一种专门用于清洁光伏组件(太阳能电池板)的自动化机器人。通过自主或者远程控制自动清洁光伏板上的尘土、鸟粪、树叶等污染物,在提升清洁效果的同时提高光伏电站的发电效率。然而,面对偏远无人区的孤岛效应及复杂…

交友系统“陌陌”全方位解析

交友系统在现代社会中扮演着越来越重要的角色,尤其是随着互联网技术的发展,各种交友软件层出不穷。陌陌作为其中的佼佼者,其全方位解析对于理解交友系统的商业开发至关重要。 陌陌的核心功能是提供基于地理位置的社交服务,用户可…

MES生产制造执行系统源码,使用代码生成器可以一键生成前后端代码 + 单元测试 + Swagger 接口文档 + Validator 参数校验。

企业需要MES生产制造执行系统来提供实现从订单下达到完成品的生产活动优化所得信息,并运用及时准确的数据,指导、启动、响应并记录车间生产活动,对生产条件的变化做出迅速的响应,减少非增值活动,提高效率,为…

# 利刃出鞘_Tomcat 核心原理解析(十)-- Tomcat 性能调优--1

利刃出鞘_Tomcat 核心原理解析(十)-- Tomcat 性能调优–1 一、Tomcat专题 - Tomcat性能调优 - 性能测试 1、tomcat 性能测试: 对于系统性能,用户最直观的感受就是系统的加载和操作时间,即用户执行某项操作的耗时。从…

SketchUp Pro 2024 for Mac/Win:专业3D建模软件的卓越之选

SketchUp Pro 2024作为一款在业界广受好评的三维建模软件,不仅适用于Mac系统,也完美兼容Windows平台,为用户提供了跨平台的强大建模能力。该软件以其直观易用的界面设计著称,无论是初学者还是资深设计师,都能迅速上手并…

介绍冯诺依曼体系结构和操作系统

🌈个人主页:Yui_ 🌈Linux专栏:Linux 🌈C语言笔记专栏:C语言笔记 🌈数据结构专栏:数据结构 🌈C专栏:C 文章目录 1. 冯诺依曼体系结构2. 操作系统(O…

【数据结构取经之路】位图全解

目录 前言 C标准库里的位图 位图的设计及实现 位图几个关键接口的实现 set() reset() test() 完整代码 位图的使用场景 位图的优缺点 位图的使用演示 —— 几道面试题的讲解 前言 位图(Bitmap)是一种非常高效的数据结构,主要用于处…

Claude Enterprise:Anthropic 推出企业级AI助手挑战OpenAI

Anthropic公司推出了Claude Enterprise,这是一项新的企业级AI服务,旨在提供更安全、更可控的AI聊天机器人体验。通过这个服务,企业可以将内部知识库与Claude机器人连接,使其能够访问和分析公司数据,从而回答员工的查询…

【MySQL】MySQL Workbench下载安装、环境变量配置、基本MySQL语句、新建Connection

1.MySQL Workbench 下载安装: 进入网址:MySQL :: MySQL Workbench Manual :: 2 Installation (1)点击“MySQL Workbench on Windows”(下载Windows版本)(2)点击“Installing” &…

前端Vue框架,本地数据库nedb

封装 db.js(文章nedb版本^1.8.0) // db.js// 导入 NeDB 模块 const Datastore require(nedb)// 创建数据库实例,最大600M或100W行 const db new Datastore({ filename: ./database.db, autoload: true, inMemoryOnly: false, maxFileSize: 600 * 1024…

如何将 Redshift Cryptomatte AOV 与 teamrender 结合使用,成都渲染101云渲染

这篇文章将讨论在 Cinema 4D 中将 cryptomatte AOV 与 teamrender 结合使用时常见的问题和解决方案。在 Cinema 4D 中使用 AOV 时,用户希望它们的工作方式与其他 AOV 完全相同。但事实并非如此,尤其是与 teamrender 结合使用时。 在 Cinema 4D 中&#x…

【JAVA高级】并发同步工具CyclicBarrier 的使用介绍

📝个人主页🌹:个人主页 ⏩收录专栏⏪:JAVA进阶 🌹🌹期待您的关注 🌹🌹,让我们共同进步! 文章目录 CyclicBarrier 简介CyclicBarrier 的场景示意图&#xff1…

AI绘画时代的自媒体引流攻略:如何实现粉丝暴涨与盈利

一、AI绘画在自媒体引流和赚钱中的应用 创作独特视觉内容,吸引粉丝关注 AI绘画技术可以帮助自媒体从业者创作出独一无二的视觉内容,这些内容在社交媒体上具有很高的辨识度和吸引力。通过以下方式,AI绘画助力引流和赚钱: &#xf…

软件厂商与集成平台协同--打造无缝企业解决方案

引言 在现在的众多项目当中,很多企业面临着日益复杂的业务需求和不断变化的市场环境。为了保持竞争力,企业会选择采用高效的工具和系统来管理和运营。CRM(客户关系管理)软件和ERP(企业资源规划)系统是企业…

PMF源解析软件下载、安装、运行;Fpeak模式运行结果优化及误差评估;大气颗粒物理化性质等基础知识和通过PMF方法对其来源解析

目录 专题一 PMF源解析技术简要及其输入文件准备 专题二 PMF源解析技术的原理,PMF软件的实操及应用举例 专题三 PMF源解析结果的优化及误差评估 更多应用 颗粒物污染不仅对气候和环境有重要影响,而且对人体健康有严重损害,尤其在一些重污…

计算机毕设选题推荐-基于python的校园班级课程表管理系统

💖🔥作者主页:毕设木哥 精彩专栏推荐订阅:在 下方专栏👇🏻👇🏻👇🏻👇🏻 实战项目 文章目录 实战项目 一、基于python的校园班级课程表…

【C++】简述STL——string类的使用

文章目录 一、STL的简述1.STL的框架2.STL版本 二、string1、string的介绍2、为什么string类要实现为模板? 三、string的构造接口四、string的容量相关的接口五、string对象修改相关的接口1、insert2.earse3、assign4、replace 六、string对象字符串运算相关接口1、c…

【Linux】《Linux 常见指令全攻略》

📢博客主页:https://blog.csdn.net/2301_779549673 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📢本文由 JohnKi 原创,首发于 CSDN🙉 📢未来很长&#…

JavaScript 知识:this、apply/call/bind、Promise、async/await、HTTP 库 Axios

1、变量、声明、传递 (值、引用) javascript:void(0) 含义 javascript:void(0) 中最关键的是 void 关键字, void 是 JavaScript 中非常重要的关键字,该操作符指定要计算一个表达式但是不返回值。void() 仅仅是代表不返回任何值,但是括号内的表…