当前位置: 首页 > news >正文

「JVM 执行引擎」栈架构的字节码的解释执行引擎

JVM 执行引擎在执行 Java 代码时有解释执行(通过解释器执行)和编译执行(通过即时编译器产生本地代码执行)两种选择;

HotSpot 实际的实现中,模版解释器工作时,并不是按照概念模型中进行机械式计算,而是动态生成每一条字节码对应的汇编代码来运行;

文章目录

      • 1. 解释执行
      • 2. 基于栈的指令集与基于寄存器的指令集
      • 3. 基于栈的解释器执行过程

1. 解释执行

笼统的说 Java 是解释执行是没有意义的,需要结合具体 JVM 实现版本和执行引擎运行模式来看;

Java 还发展出了直接生成本地代码的编译器(Jaotc、GCJ、Excelsior JET),C/C++ 语言也出现了通过解释器执行的版本(CINT);

大部分程序语言(基于物理机、Java 虚拟机、其他非 Java 高级语言虚拟机 HLLVM)代码转换成物理机的目标代码或虚拟机能执行的指令集之前,需要经过如下步骤;

请添加图片描述

Java 中 javac 编译器完成了程序代码的词法分析、语法分析最终经过抽象语法树生成字节码指令流;这部分是独立于 JVM 之外完成,而解释器实在 JVM 内部,所以 Java 的编译是半独立实现的;

2. 基于栈的指令集与基于寄存器的指令集

基于栈的指令架构Instruction Set Architecture,ISA),大部分指令是零地址指令,依赖于操作数栈进行工作;
基于寄存器的指令集,典型的如 x86 的二地址指令集,主流 PC 机物理硬件直接支持的指令集架构,依赖于寄存器进行工作;

1 + 1 演示

// 基于栈的指令集
iconst_1
iconst_1
iadd
istore_0

iconst_1 指令将常量 1 压入栈,连续两次,iadd 指令将栈顶两个值出栈、相加、把结果放回栈顶;最后 istore_0 指令把栈顶的值放回局部变量表的第 0 个变量槽;

// 基于寄存器的指令集mov eax, 1add eax, 1

mov 指令将 EAX 寄存器的值设置为 1,add 指令再把这个值加 1,结果就保存在 EAX 寄存器中;每个指令包含两个单独的输入参数,依赖于寄存器来访问和存储数据;

基于栈的指令集 vs. 基于寄存器的指令集

  • (优点)由于寄存器与硬件绑定,基于栈的指令集不直接使用寄存器,因此可移植,而基于寄存器的指令集的代码受硬件的约束;
  • (优点)基于栈的指令集可以有 VM 自行实现,可将一些访问最频繁的数据(程序计数器、栈顶缓存等)放到寄存器以获得更好的性能;
  • (优点)基于栈的指令集代码更紧凑,编译器实现更简单(不需要考虑空间分配问题);基于计数器的指令集还要存参数;
  • (缺点)基于栈的指令集理论上稍慢于寄存器架构的指令集(解释执行状态),完成相同功能所需的指令数量一般也会更多(出入站操作都需要相应指令);
  • (缺点)基于栈的指令集操作在内存中,相对处理器来说,内存是执行速度的瓶颈;

3. 基于栈的解释器执行过程

算术代码演示

public int calc() {int a = 100;int b = 200;int c = 300;return (a + b) * c;
}

javap 查看字节码

 public int calc();descriptor: ()Iflags: ACC_PUBLICCode:stack=2, locals=4, args_size=10: bipush        1002: istore_13: sipush        2006: istore_27: sipush        30010: istore_311: iload_112: iload_213: iadd14: iload_315: imul16: ireturnLineNumberTable:line 18: 0line 19: 3line 20: 7line 21: 11LocalVariableTable:Start  Length  Slot  Name   Signature0      17     0  this   Ledu/aurelius/jvm/clazz/GrandFather;3      14     1     a   I7      10     2     b   I11       6     3     c   I

解释执行过程演示

请添加图片描述

  • 执行偏移地址为 0 的指令,bipush 将单字节的整型常量(-128 ~ 127)压入操作数栈顶,这里是 100;

请添加图片描述

  • 执行偏移地址为 2 的指令,istore_1 将操作数栈栈顶的整型值出栈并放入第 1 个局部变量槽(后续 4 条指令做相同的事情,这里略过);

请添加图片描述

  • 执行偏移地址为 11 的指令,iload_1 指令将局部变量表第 1 个变量槽的整型值压入操作数栈(后续 1 条指令做相同事情,这里略过);

请添加图片描述

  • 执行偏移地址为 13 的指令,iadd 将操作数栈的头两个栈顶元素出栈,做整型加法,并将结果压入栈顶;

请添加图片描述

  • 执行偏移地址为 14 的指令,iload_3 指令将局部变量表第 3 个变量槽的整型值压入操作数栈(后续 1 条指令对栈顶头两个元素做出栈、整型乘法、结果入栈的操作,与 iadd 类似,这里略过);

请添加图片描述

  • 执行偏移地址为 16 的指令,ireturn 指令是方法返回指令,结束方法执行,并将操作数站定的整型值返回给方法的调用者;

实际执行过程会经过解释器(对字节码指令做合并、替换)和即时编译器对字节码的一系列性能优化,与上面的概念模型差距可能非常大,这里仅演示栈架构指令集的一般运行过程(中间变量以操作数栈的出入栈交换信息);


上一篇:「JVM 执行引擎」动态类型语言支持
下一篇:「JVM 原理使用」 实际开发中的应用

PS:感谢每一位志同道合者的阅读,欢迎关注、评论、赞!


参考资料:

  • [1]《深入理解 Java 虚拟机》

相关文章:

「JVM 执行引擎」栈架构的字节码的解释执行引擎

JVM 执行引擎在执行 Java 代码时有解释执行(通过解释器执行)和编译执行(通过即时编译器产生本地代码执行)两种选择; HotSpot 实际的实现中,模版解释器工作时,并不是按照概念模型中进行机械式计…...

SSM项目-商城后台管理系统

SSM项目-商城后台管理系统开发说明开发环境项目界面演示项目功能具体的技术指标开发过程1、搭建SSM框架1.1、建库建表1.2、新建Maven工程1.3、配置pom.xml1.4、目录结构1.5、jdbc.properties1.6、mybatis-config.xml1.7 两个Spring的配置文件applicationContext_dao.xmlapplica…...

什么是装运单IFTMIN?

符合EDIFACT国际报文标准的IFTMIN主要用于传输电子运输订单,这些装运单作为EDI数据交换的一部分,由客户或托运人发送给物流服务提供商。通过EDI传输的运输信息可以被用来计划当前所需的运输能力,并且物流服务提供商也可以据此提前将包装材料准…...

深度负反馈

负反馈放大电路的方块图因为负反馈放大电路有四种组态,而且对于同一种组态,具体电路也各不相同;所以为了研究负反馈放大电路的共同规律,可以利用方块图来描述所有电路一.负反馈放大电路的方块图表示法任何负反馈放大电路都可以用下…...

【每日随笔】手指训练 ( 产品需求探索、技术无关 | 手指训练作用 | 哪些人需要手指训练 | 手指操 | 手指康复训练器材 )

文章目录一、手指训练作用二、哪些人需要手指训练三、手指操四、手指康复训练器材产品需求探索 , 研究下手指训练的市场 , 前景 , 是否可以开发 ; 一、手指训练作用 手指训练作用 : 改善 上肢协调性手眼 协调性训练提高 手指 抓握 能力提高 手指 灵活性提高 上肢运动 准确性 和…...

Apple Safari 16.3 - macOS 专属免费浏览器 (独立安装包免费下载)

Safari 浏览器 16 for macOS Montery, Big Sur 请访问原文链接:https://sysin.org/blog/apple-safari-16/,查看最新版。原创作品,转载请保留出处。 作者主页:www.sysin.org 之前 Safari 浏览器伴随 macOS 更新一起发布&#xff…...

【java】Spring Boot --Spring Boot 集成 MyBatis

文章目录1. 前言2. 实例场景3. 数据库模块实现4. Spring Boot 后端实现4.1 使用 Spring Initializr 创建项目4.2 引入项目依赖4.3 数据源配置4.4 开发数据对象类4.5 开发数据访问层4.6 添加 MyBatis 映射文件5. 测试6. 小结1. 前言 企业级应用数据持久层框架,最常见…...

python正则表达式

python正则表达式 作者:AOAIYI 创作不易,如果觉得文章不错或能帮到你学习,记得点赞收藏评论一下哦 文章目录python正则表达式一、实验目的二、实验原理三、实验环境四、实验内容五、实验步骤总结一、实验目的 学会使用常见的正则表达式 二、…...

【C++】二叉树的非递归遍历

非递归遍历二叉树一、二叉树的前序遍历二、二叉树的中序遍历三、二叉树的后序遍历3.1 方法一3.2 方法二一、二叉树的前序遍历 题目链接 我们可以把任何一棵树看成左路节点,左路节点和右子树。先访问左路节点,再访问左路节点的右子树。在右子树中也重复这…...

Linux——线程同步(条件变量、POSIX信号量)和线程池

一.线程同步(一).概念线程同步是一种多线程关系,指的是线程之间按照特定顺序访问临界资源,进而能够避免线程饥饿问题。所谓线程饥饿指的是某个线程长期“霸占”临界资源,导致其他线程无法访问该资源。而通过线程同步机…...

leaflet 上传CSV文件,导出geojson格式文件(064)

第064个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet中加载CSV文件,将图形显示在地图上。点击导出geojson,下载成geojson文件。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果. 文章目录 示例效果配置方式示例源代码(共114行)安装插件…...

Java内部类

文章目录一、内部类的概念二、内部类的分析三、内部类的分类1. 成员内部类2. 静态内部类3. 局部内部类4. 匿名内部类匿名内部类与Lambda表达式一、内部类的概念 在 Java 中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。内部类…...

Centos系统里运行java的jar包

目前使用springboot开发是嵌入方式的tomcat,不需要单独使用tomcat,那么经常在服务器上运行jar包,这里记录一下在centos7系统里运行jar的方式。在运行之前需要确定centos7系统是否安装了java环境以及配置环境变量,还有jar需要运行的…...

招标采购流程的电子招标采购,是管理复杂供应链和多层供应商的高效方式。

负载均衡(Load Balance) 由于目前现有网络的各个核心部分随着业务量的提高,访问量和数据流量的快速增长,其处理能力和计算强度也相应地增大,使得单一的服务器设备根本无法承担。在此情况下,如果扔掉现有设…...

【C语言】C程序结构和基本语法

1、C语言程序结构 我们学习一门编程语言&#xff0c;第一个实例都是"hello world!"&#xff0c;下面看一个最简单的C程序结构。 #include <stdio.h>int main() {/* 我的第一个 C 程序 */printf("Hello, World! \n");return 0; }程序的第一行 #incl…...

YOLOv8 目标检测 | 自定义数据集

本文介绍了使用用于目标检测的自定义数据训练 YOLOv8 模型。我正在使用来自 kaggle 的 yolo 格式的“Face Mask Dataset”&#xff0c;数据集链接如下&#xff1a;https://www.kaggle.com/datasets/maalialharbi/face-mask-dataset?resourcedownloadYOLOv8 是目前最先进的 YOL…...

Lua语法入门

注意&#xff1a;文章将持续更新完善 文章目录一. 初识Lua二. HelloWorld三. Lua的数据类型四. 变量五. 循环六. 函数七. 条件控制一. 初识Lua Lua 是一种轻量小巧的脚本语言&#xff0c;用标准C语言编写并以源代码形式开放&#xff0c; 其设计目的是为了嵌入应用程序中&#…...

华为OD机试真题JAVA实现【最小步骤数】真题+解题思路+代码(20222023)

🔥系列专栏 华为OD机试(JAVA)真题目录汇总华为OD机试(Python)真题目录汇总华为OD机试(C++)真题目录汇总华为OD机试(JavaScript)真题目录汇总文章目录 🔥系列专栏题目输入输出示例一输入输出说明示例二输入输出解题思路...

预检请求OPTIONS

这里写目录标题简单请求和非简单请求简单请求非简单请求预检请求OPTIONS简单请求和非简单请求 浏览器将请求分为两大类&#xff1a;简单请求&#xff08;simple request&#xff09;和非简单请求&#xff08;not-so-simple request&#xff09; 简单请求 简单请求&#xff0…...

引入短信服务发送手机验证码进行安全校验

其他方案>引入QQ邮箱发送验证码进行安全校验 相对短信验证码&#xff0c;操作更简单而且免费 最近想给自己的项目在注册时加点安全校验&#xff0c;准备使用免费的邮箱验证来着&#xff0c;在上一篇引入QQ邮箱进行安全校验时&#xff0c;看有朋友说阿里云会送一些短信服务免…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank&#xff1f;由于时间太久&#xff0c;我真忘记了。搜搜发现&#xff0c;还真有人和我一样。见下面的链接&#xff1a;https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的&#xff0c;比GNOME简单得多&#xff01; 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在 GPU 上对图像执行 均值漂移滤波&#xff08;Mean Shift Filtering&#xff09;&#xff0c;用于图像分割或平滑处理。 该函数将输入图像中的…...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...

Reasoning over Uncertain Text by Generative Large Language Models

https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...

服务器--宝塔命令

一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行&#xff01; sudo su - 1. CentOS 系统&#xff1a; yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中&#xff0c;我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道&#xff0c;它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...

Redis:现代应用开发的高效内存数据存储利器

一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发&#xff0c;其初衷是为了满足他自己的一个项目需求&#xff0c;即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源&#xff0c;Redis凭借其简单易用、…...

pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)

目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 &#xff08;1&#xff09;输入单引号 &#xff08;2&#xff09;万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...

在树莓派上添加音频输入设备的几种方法

在树莓派上添加音频输入设备可以通过以下步骤完成&#xff0c;具体方法取决于设备类型&#xff08;如USB麦克风、3.5mm接口麦克风或HDMI音频输入&#xff09;。以下是详细指南&#xff1a; 1. 连接音频输入设备 USB麦克风/声卡&#xff1a;直接插入树莓派的USB接口。3.5mm麦克…...