深入理解JVM(四)-执行引擎

2023-11-07

        本文章是根据《深入理解Java虚拟机》一书,并参考网上其他文档进行的系统性的和简单容易理解的方式进行的整理。

一、执行引擎

        执行引擎是Java最核心的组成部分之一,具有执行代码的能力,如下图所示:

1、运行时栈帧结构

        栈帧是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区虚拟机栈的栈元素。栈帧存储了局部变量表、操作数栈、动态链接、方法返回地址等信息。执行引擎所运行的字节码文件都只对当前栈帧进行操作。栈帧中的局部变量表、操作数栈等的大小已经在编译好的字节码文件(也可以是网络中的字节码信息)中指定好。

        ①局部变量表。一组变量值存储空间,用于存放方法参数和方法内部定义的局部变量。最大容量在Class文件的属性中指定。局部变量表的变量需要手动赋初值。

        ②操作数栈。 操作数栈也常被称为操作栈,它是一个后入先出栈,最大容量在Class文件的属性中指定。

        ③动态链接。每个栈帧都包含一个指向运行时常量池的该栈帧所属方法的引用,持有这个引用是为了支持方法调用过程中的动态连接。

        ④方法返回地址。当一个方法被执行后,有两种方式退出这个方法,一种是正常完成出口(方法遇到返回指令),一种是异常完成出口(JVM虚拟机内部产生异常)。

        ⑤附加信息。虚拟机规范中没有明确要求的其他供应商自行添加的信息。

2、方法调用

        方法调用不等同于方法的执行,Class文件中存储的都是符号引用(给Java带来更强大的动态扩展能力),需要在类加载期间甚至到运行期间才能确定目标方法的直接引用,所以使得Java的调用过程变得相对复杂。

        ①解析:在编译期将方法的符号引用转变为直接引用,符合”编译器可知,运行期不可变“的要求,符合这个要求的主要有静态方法和私有方法(因为这两类方法不可能通过继承或别的方式写出其他版本),其中静态方法时通用的,而私有方法是私有的。主要是针对非虚方法。补充概念:

                虚方法:能被重写的方法,一般指的是实例方法。

                非虚方法:不能被重写的方法,指的是构造方法、静态方法、私有方法和final修饰的方法。

        ②分派:Java虚拟机确定正确的目标方法的过程。分派与解析不是互斥的动作,而是在不同层次去筛选和确定目标方法的过程。主要是针对虚方法

                静态分派:在代码编译期间通过静态类型(方法参数的接收类型,而不是实际类型)来定位方法执行版本的分派动作。主要体现在方法的重载。需要注意的是,在重载情况下,编译器虽然能确定出方法的重载版本,很多情况下这个重载版本并不是“唯一”的,往往只能确定一个更加适合的版本。如下图,当调用sayHello(‘a’)时,编译器会在下面三个方法中选择一个合适的方法:

                动态分派:主要是体现了重写的特性。大概步骤如下:

                        第一步:找到对象的实际类型;

                        第二步:如果在对象中找到同名的方法并校验访问权限,如果通过则返回这个方法的直接引用,查找过程结束。

                        第三步:如果第二步没找到则去其父类中查找同名的方法和进行权限验证,如果通过则返回方法的直接引用,查找过程结束。

                        第四步:如果没有找到合适的方法,则抛出java.lang.AbstractMethodError异常。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

深入理解JVM(四)-执行引擎 的相关文章

  • Grails 3.x bootRun 失败

    我正在尝试在 grails 3 1 11 中运行一个项目 但出现错误 失败 构建失败并出现异常 什么地方出了错 任务 bootRun 执行失败 进程 命令 C Program Files Java jdk1 8 0 111 bin java
  • 为什么 i++ 不是原子的?

    Why is i Java 中不是原子的 为了更深入地了解 Java 我尝试计算线程中循环的执行频率 所以我用了一个 private static int total 0 在主课中 我有两个线程 主题 1 打印System out prin
  • 如何在 Play java 中创建数据库线程池并使用该池进行数据库查询

    我目前正在使用 play java 并使用默认线程池进行数据库查询 但了解使用数据库线程池进行数据库查询可以使我的系统更加高效 目前我的代码是 import play libs Akka import scala concurrent Ex
  • Android:捕获的图像未显示在图库中(媒体扫描仪意图不起作用)

    我遇到以下问题 我正在开发一个应用程序 用户可以在其中拍照 附加到帖子中 并将图片保存到外部存储中 我希望这张照片也显示在图片库中 并且我正在使用媒体扫描仪意图 但它似乎不起作用 我在编写代码时遵循官方的Android开发人员指南 所以我不
  • INSERT..RETURNING 在 JOOQ 中不起作用

    我有一个 MariaDB 数据库 我正在尝试在表中插入一行users 它有一个生成的id我想在插入后得到它 我见过this http www jooq org doc 3 8 manual sql building sql statemen
  • 加速代码 - 3D 数组

    我正在尝试提高我编写的一些代码的速度 我想知道从 3d 整数数组访问数据的效率如何 我有一个数组 int cube new int 10 10 10 我用价值观填充其中 然后我访问这些值数千次 我想知道 由于理论上所有 3d 数组都存储在内
  • 列出jshell中所有活动的方法

    是否有任何命令可以打印当前 jshell 会话中所有新创建的方法 类似的东西 list但仅适用于方法 您正在寻找命令 methods all 它会打印所有方法 包括启动 JShell 时添加的方法 以及失败 被覆盖或删除的方法 对于您声明的
  • 反射找不到对象子类型

    我试图通过使用反射来获取包中的所有类 当我使用具体类的代码 本例中为 A 时 它可以工作并打印子类信息 B 扩展 A 因此它打印 B 信息 但是当我将它与对象类一起使用时 它不起作用 我该如何修复它 这段代码的工作原理 Reflection
  • 禁止的软件包名称:java

    我尝试从数据库名称为 jaane 用户名 Hello 和密码 hello 获取数据 错误 java lang SecurityException Prohibited package name java at java lang Class
  • 加密 JBoss 配置中的敏感信息

    JBoss 中的标准数据源配置要求数据库用户的用户名和密码位于 xxx ds xml 文件中 如果我将数据源定义为 c3p0 mbean 我会遇到同样的问题 是否有标准方法来加密用户和密码 保存密钥的好地方是什么 这当然也与 tomcat
  • AWS 无法从 START_OBJECT 中反序列化 java.lang.String 实例

    我创建了一个 Lambda 函数 我想在 API 网关的帮助下通过 URL 访问它 我已经把一切都设置好了 我还创建了一个application jsonAPI Gateway 中的正文映射模板如下所示 input input params
  • 在 Mac 上正确运行基于 SWT 的跨平台 jar

    我一直致力于一个基于 SWT 的项目 该项目旨在部署为 Java Web Start 从而可以在多个平台上使用 到目前为止 我已经成功解决了由于 SWT 依赖的系统特定库而出现的导出问题 请参阅相关thread https stackove
  • Eclipse Java 远程调试器通过 VPN 速度极慢

    我有时被迫离开办公室工作 这意味着我需要通过 VPN 进入我的实验室 我注意到在这种情况下使用 Eclipse 进行远程调试速度非常慢 速度慢到调试器需要 5 7 分钟才能连接到远程 jvm 连接后 每次单步执行断点 行可能需要 20 30
  • 仅将 char[] 的一部分复制到 String 中

    我有一个数组 char ch 我的问题如下 如何将 ch 2 到 ch 7 的值合并到字符串中 我想在不循环 char 数组的情况下实现这一点 有什么建议么 感谢您花时间回答我的问题 Use new String value offset
  • Java执行器服务线程池[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如果我使用 Executor 框架在
  • 如何从终端运行处理应用程序

    我目前正在使用加工 http processing org对于一个小项目 但是我不喜欢它附带的文本编辑器 我使用 vim 编写所有代码 我找到了 pde 文件的位置 并且我一直在从 vim 中编辑它们 然后重新打开它们并运行它们 重新加载脚
  • 玩!框架:运行“h2-browser”可以运行,但网页不可用

    当我运行命令时activator h2 browser它会使用以下 url 打开浏览器 192 168 1 17 8082 但我得到 使用 Chrome 此网页无法使用 奇怪的是它以前确实有效 从那时起我唯一改变的是JAVA OPTS以启用
  • 获取 JVM 上所有引导类的列表?

    有一种方法叫做findBootstrapClass对于一个类加载器 如果它是引导的 则返回一个类 有没有办法找到类已经加载了 您可以尝试首先通过例如获取引导类加载器呼叫 ClassLoader bootstrapLoader ClassLo
  • 静态变量的线程安全

    class ABC implements Runnable private static int a private static int b public void run 我有一个如上所述的 Java 类 我有这个类的多个线程 在里面r
  • 有没有办法为Java的字符集名称添加别名

    我收到一个异常 埋藏在第 3 方库中 消息如下 java io UnsupportedEncodingException BIG 5 我认为发生这种情况是因为 Java 没有定义这个名称java nio charset Charset Ch

随机推荐

  • Lxc之二—网络设置

    按照博客一所述 应该能够创建lxc虚拟机并运行虚拟机 如果是本地的话 应该能够进入虚拟机操作了 会发现虚拟机只提供了最原始和简单的一些程序 如果使用template方式 甚至连vim gcc python等都没有安装 更别说myql了 安装
  • F5会话保持机制

    1 什么是会话保持 在大多数电子商务的应用系统或者需要进行用户身份认证的在线系统中 一个客户与服务器经常经过好几次的交互过程才能完成一笔交易或者是一个请求的完成 由于这几次交互过程是密切相关的 服务器在进行这些交互过程的某一个交互步骤时 往
  • 一文读懂BERT(原理篇)

    一文读懂BERT 原理篇 2018年的10月11日 Google发布的论文 Pre training of Deep Bidirectional Transformers for Language Understanding 成功在 11
  • python导入机制及importlib模块

    文章目录 写在篇前 import 关键字 先导概念 namespace scope Module Packages module packages regular package namespace package importlib Lo
  • 描述子距离种类

    1 hausdorff距离 微分动力系统原理 这本书里有介绍 Hausdorff距离是描述两组点集之间相似程度的一种量度 它是两个点集之间距离的一种定义形式 假设有两组集合A a1 ap B b1 bq 则这两个点集合之间的Hausdorf
  • TLS/SSL协议

    1 TLS协议的工作原理 TSL设计目的 身份验证 保密性 完整性 Record记录协议 对称加密 Handshake握手协议 验证通讯双方的身份 交换加解密的安全套件 协商加密参数 2 对称加密的工作原理 1 XOR与填充 明文P和密钥K
  • 官网解读-fastcgi_param

    Syntax fastcgi param parameter value if not empty Default Context http server location Sets a parameter that should be p
  • iOS中的数据持久化方式

    iOS中的数据持久化方式 基本上有以下四种 属性列表 对象归档 SQLite3和Core Data 1 属性列表 涉及到的主要类 NSUserDefaults 一般 NSUserDefaults standardUserDefaults 就
  • 教程--从零开始使用BiSeNet(语义分割)网络训练自己的数据集

    引言 为了从图片分割出我们想要的特征 我们采用BiSeNet作为分割模型 并且在自己制作的数据集上进行训练测试 注 训练是在linux环境下的 Win下训练可能会有点问题 一 下载BiSeNet网络的安装包 1 下载地址 GitHub Co
  • matlab 非均匀体素下采样

    目录 一 非均匀下采样 二 代码实现 三 结果展示 1 原始点云 2 采样结果 四 参考链接 一 非均匀下采样 ptCloudOut pcdownsample ptCloudIn nonuniformGridSample maxNumPoi
  • java线程池(四):ForkJoinPool的使用及基本原理

    文章目录 1 ForkJoinPool是什么 1 1 分治法 1 2 工作窃取 work stealing 2 简单使用 2 1 不带返回值的计算 2 2 带返回值的计算 3 ForkJoin源码注释 3 1 类注释 3 2 关于原理的注释
  • 软件测试用例有五十个以上的,软件测试大牛都是这样写测试用例的,你get到了嘛?...

    1 用于语句覆盖的基路径法 基路径法保证设计出的测试用例 使程序的每一个可执行语句至少执行一次 即实现语句覆盖 基路径法是理论与应用脱节的典型 基本上没有应用价值 读者稍作了解即可 不必理解和掌握 基路径法步骤如下 1 画出程序的控制流图
  • C语言函数函数(斐波那契函数)

    作者 几冬雪来 时间 2023年2月2日 内容 C语言函数函数讲解之斐波那契函数篇 目录 前言 斐波那契函数 1 什么是斐波那契函数 2 斐波那契函数怎么实现 3 如何用C语言书写斐波那契函数 4 什么时候使用递归 什么时候使用非递归 结尾
  • uniapp开发微信小程序通过文件流下载文件

    uni downloadFile url xx 请求地址 header token token token 获取 success res gt if res statusCode 200 var filePath res tempFileP
  • 谈一下为什么程序员不要进外包吧

    从2016年毕业到现在入行也有4年多 待过几家公司 外包和非外包都待过 个人感觉 外包和非外包的区别在于后期维护和迭代升级这个阶段上 一般外包都是开发通过验收或者根本就没有通过验收当你把项目推动到某一个阶段之后你就要进入下一个项目组 这样让
  • 什么是编译?

    编译 compilation compile 1 利用编译程序从源语言编写的源程序产生目标程序的过程 2 用编译程序产生目标程序的动作 编译就是把高级语言变成计算机可以识别的2进制语言 计算机只认识1和0 编译程序把人们熟悉的语言换成2进制
  • lambda表达式java项目常用_LAMBDA表达式常用 (全)

    1 select语句 books Select p gt new p Title p UnitPrice p Author 需用匿名方式 2 where语句 books Where p gt p UnitPrice 100 p Title
  • 从七个方面,面试BAT大厂高级工程师,纯干货!

    转载注明 https blog csdn net WantFlyDaCheng article details 100078782 一 框架是重点 但别让人感觉你只会山寨别人的代码 二 别单纯看单机版的框架 适当了解些分布式 三 数据库方面
  • 安装 WebStorm 后的一些基本配置

    前言 在安装完 WebStorm 后我们需要配置一些东西来加快我们的开发效率 下面给大家列出一些基本的配置 1 设置 WebStorm 标签下的默认缩进 问题 在 WebStorm 的 html 文件中 默认在标签下的子标签是没有进行缩进处
  • 深入理解JVM(四)-执行引擎

    本文章是根据 深入理解Java虚拟机 一书 并参考网上其他文档进行的系统性的和简单容易理解的方式进行的整理 一 执行引擎 执行引擎是Java最核心的组成部分之一 具有执行代码的能力 如下图所示 1 运行时栈帧结构 栈帧是用于支持虚拟机进行方