Java虚拟机(JVM)平台无关?相关?

计算机的概念模型

计算机实际上就是实现了一个图灵机模型。即,输入参数,根据程序计算,输出结果。图灵机模型如图。

在这里插入图片描述

Tape是输入数据,Program是针对这些数据进行计算的程序,中间横着的方块表示的是机器的状态。

目前使用的电子计算机都是实现了这样一个抽象模型的产物,只不过物理实现上不一样。

比如,典型的加法运算。

c = a + b

a和b是输入参数,c是加法的输出。

如何实现运算?

设计一台电脑。CPU里面有一个加法器。现在如何实现加法运算,并将结果输出呢?实际上可以采用如下的方式。

  • 有一根内存条
  • 有一个CPU
  • CPU含有3条指令(加法,读取内存,写入内存)

在这里插入图片描述

那么如何实现上述的加法运算呢?我们可以采用下面的模式

在这里插入图片描述

第一步,将a放入内存

第二步,将b压栈

第三步,CPU从内存读取a和b,并进行加法运算

第四步,将内存中的a和b清空,并将计算后的结果c放入内存

这种计算机被称为栈式计算机。我们不仅可以在CPU中执行加法,还可以加入减法,乘法,除法,等等。

这种计算机的好处是指令集紧凑精简,所有操作都以栈顶元素为对象。

但是,它也存在一些固有缺陷,如执行效率较低(因为对于计算机而言,访问内存操作是一种时间开销极大的行为)、寻址能力受限等。

改进

为了让栈式计算机能够快速地进行运算。CPU可以在内部加入一个寄存器(register),用于总是保存栈顶数据。其计算过程如图。

在这里插入图片描述

由于寄存器处于CPU内部,其访问速度远远大于对内存的直接访问,

后来随着技术的发展,CPU内部的寄存器越来越多。不同的厂商针对各自的架构设计特点,发展出了属于各自架构的寄存器。以x86架构为例(也就是我们常见的AMD或Intel CPU),整数寄存器有32个,并且针对每一个寄存器都标记了一个编号以及别名。 下面以0-2号寄存器为例进行说明。

编号别名
0rax
1rcx
2rdx

于是,CPU发展出下面的形式。

在这里插入图片描述

架构类型

由于不同厂商实现寄存器和访问内存(简称访存)方式的不同,发展出了复杂指令集架构(CISC)和精简指令集架构(RISC)。比如,在x86CISC指令集)上实现加法的指令为

ADD EAX, EBX

该指令将EAX寄存器中的值与EBX寄存器中的值相加后,将结果放入EBX

而典型的ARM架构(RISC指令集)实现加法则为

ADD X0, X1, X2

其含义为将x1x2寄存器中的值相加,将结果放入x0寄存器中。

实际上,不仅二者汇编指令的编写不一致,而且由此翻译成的机器码也不一直。对于x86的加法例子,CPU执行上述加法的机器码为

0x01C3

而对于ARM架构的例子机器码为

0x8B000000

平台相关性

对于同样的加法,在x86和ARM上实现的指令机器码是不一样的。所以,如果有程序要实现一个加法,那么在计算机底层执行时,其执行的内容是不一样的。

对于C语言这样的高级语言而言,当实现一个加法运算。例如

int a,b,c;
a = b + c;

在经过编译器(如gcc)编译后,其源文件被编译生成了可被指定平台识别的二进制可执行文件。该文件中关于实现加法的指令是不同的。因此,尽管高级语言编写的内容一致,但可执行程序在最后一步执行时是平台相关的。

Java程序的平台无关性

所谓的Java程序平台无关性是指由Java语言编写的源程序经过Java虚拟机(JVM)编译后,生成的二进制文件(.class)是一致的。即不管是在ARM上编译生成的.class文件还是x86上生成的.class文件,其内容是一样的。不管什么平台的Java虚拟机都可根据这些.class文件执行。这就与gcc编译器完全不同,gcc生成的二进制文件必须符合平台的要求,否则不能执行。

原因

Java虚拟机(JVM)在运行Java程序的时候首先会读取这些.class文件,将其内容加载到虚拟机内部。至于为什么JVM称为虚拟机呢?这是因为JVM内部实际上是一个由纯软件方式实现的栈式计算机。该栈式计算机被称为hotspot,几乎全部由C++实现。,在hotspot之外,包裹了一层Java语言编写的外壳(jdk)供开发者调用。

在这里插入图片描述

本质上说,在软件层面,所有的Java程序运行都通过纯软件的栈式计算机实现计算。但是栈式计算机的具体计算过程,则由平台的具体指令实现。

这也是为什么openjdk的源码目录结构中会出现不同架构的文件夹。

在这里插入图片描述

不仅如此,为了能够实现**“一次编译,处处执行”**,Java虚拟机还能根据不同的操作系统进行适配,对于有些与操作系统和CPU结合的部分,也提供了不同的实现。

在这里插入图片描述

结论

Java虚拟机即是平台无关,也是平台相关。平台无关是因为其执行过程是由纯软件实现的栈式计算机实现,而平台相关是因为Java虚拟机的具体操作跟平台指令和操作系统相关。

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

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

相关文章

satoken的奇奇怪怪的错误

发了 /user/getBrowseDetail和/user/getResponDetail,但为什么进入handle里面有三次?且第一次的handle类型是AbstractHandleMapping$PreFlightHttpRequestHandlerxxx,这一次进来的时候flag为false,StpUtils.checkLogin抛出了异常 第二次进来的…

【KWDB 创作者计划】_上位机知识篇---SDK

文章目录 前言一、SDK的核心组成API(应用程序接口)库文件(Libraries)开发工具文档与示例依赖项与环境配置二、SDK的作用简化开发流程确保兼容性与稳定性加速产品迭代功能扩展与定制三、SDK的典型应用场景硬件设备开发操作系统与平台云服务与API集成游戏与图形开发四、SDK与…

golang处理时间的包time一次性全面了解

本文旨在对官方time包有个全面学习了解。不钻抠细节,但又有全面了解,重点介绍常用的内容,一些低频的可能这辈子可能都用不上。主打一个花最少时间办最大事。 Duration对象: 两个time实例经过的时间,以长度为int64的纳秒来计数。 常见的durati…

PyCharm Flask 使用 Tailwind CSS 配置

使用 Tailwind CSS 步骤 1:初始化项目 在 PyCharm 终端运行:npm init -y安装 Tailwind CSS:npm install -D tailwindcss postcss autoprefixer初始化 Tailwind 配置文件:npx tailwindcss init这会生成 tailwind.config.js。 步…

【英语语法】基本句型

目录 前言一:主谓二:主谓宾三:主系表四:主谓双宾五:主谓宾补 前言 英语基本句型是语法体系的基石,以下是英语五大基本句型。 一:主谓 结构:主语 不及物动词 例句: T…

隔离DCDC辅助电源解决方案与产品应用科普

**“隔离”与“非隔离的区别** 隔离: 1、AC-DC,也叫“一次电源”,人可能会碰到的应用场合,起安全保护作用; 2、为了抗干扰,通过隔离能有效隔绝干扰信号传输。 非隔离: 1、“安全特低电压&#…

DS-SLAM 运动一致性检测的源码解读

运动一致性检测是Frame.cc的Frame::ProcessMovingObject(const cv::Mat &imgray)函数。 对应DS-SLAM流程图Moving consistency check的部分 把这个函数单独摘出来&#xff0c;写了一下对两帧检测&#xff0c;查看效果的程序&#xff1a; #include <opencv2/opencv.hpp…

安全测试的全面知识体系及实现路径

以下是安全测试的全面知识体系及实现路径,结合最新工具和技术趋势(截至2025年): 一、安全测试核心类型与工具 1. 静态应用安全测试(SAST) 知识点: 通过分析源代码、字节码或二进制文件识别漏洞(如SQL注入、缓冲区溢出)支持早期漏洞发现,减少修复成本,适合白盒测试场…

GPT-4o Image Generation Capabilities: An Empirical Study

GPT-4o 图像生成能力:一项实证研究 目录 介绍研究背景方法论文本到图像生成图像到图像转换图像到 3D 能力主要优势局限性与挑战对比性能影响与未来方向结论介绍 近年来,图像生成领域发生了巨大的变化,从生成对抗网络 (GAN) 发展到扩散模型,再到可以处理多种模态的统一生成架…

Redis之全局唯一ID

全局ID生成器 文章目录 全局ID生成器一、全局ID生成器的定义定义核心作用 二、全局ID生成器需满足的特征1. 唯一性&#xff08;Uniqueness&#xff09;​2. 高性能&#xff08;High Performance&#xff09;​3. 可扩展性&#xff08;Scalability&#xff09;​4. 有序性&#…

nginx中的代理缓存

1.缓存存放路径 对key取哈希值之后&#xff0c;设置cache内容&#xff0c;然后得到的哈希值的倒数第一位作为第一个子目录&#xff0c;倒数第三位和倒数第二位组成的字符串作为第二个子目录&#xff0c;如图。 proxy_cache_path /xxxx/ levels1:2 2.文件名哈希值

静态时序分析STA——8.1 时序检查(建立时间检查)

文章目录 一、时序路径组二、建立时间检查1. 触发器到触发器路径1&#xff09;时钟单元UCKBUF0的延迟计算2&#xff09;时钟源延迟&#xff08;clock source latency&#xff09; 2. 输入到触发器路径1) 虚拟时钟的输入路径2) 具有实际时钟的输入路径 3. 触发器到输出路径4. 输…

了解高速设计的信号完整性仿真

高速设计需要精确的信号传输&#xff0c;以确保最佳性能。信号完整性差会导致关键应用中的误码、数据损坏甚至系统故障等问题。介电常数、损耗角正切和插入损耗等因素会显著影响信号质量。通过使用信号完整性仿真&#xff0c;您可以及早发现并解决这些挑战。这种主动方法有助于…

RAGFlowwindows本地pycharm运行

Python环境准备 1. 安装pipx。如已经安装&#xff0c;可跳过本步骤&#xff1a; python -m pip install --user pipxpython -m pipx ensurepath## 验证安装pipx --version2. 安装 uv。如已经安装&#xff0c;可跳过本步骤&#xff1a; pipx install uv ## 设置为阿里云 PyPI…

STM32-FreeRTOS的详细配置

配置FreeRTOS 原文链接&#xff1a;https://ydamooc.github.io/posts/c9defcd/ 1.1 下载FreeRTOS 打开FreeRTOS官网&#xff1a;https://www.freertos.org/ 点击下载&#xff0c;并且选择"FreeRTOS 202212.01"版本&#xff0c;再点击Download按钮下载官方的资源包…

Linux笔记---动静态库(原理篇)

1. ELF文件格式 动静态库文件的构成是什么样的呢&#xff1f;或者说二者的内容是什么&#xff1f; 实际上&#xff0c;可执行文件&#xff0c;目标文件&#xff0c;静态库文件&#xff0c;动态库文件都是使用ELF文件格式进行组织的。 ELF&#xff08;Executable and Linkable…

HVV-某田相关经历

一、背景 本次项目为期两周&#xff0c;由集团主导招募攻击队员对集团下属及其子公司进行的攻防演练。本次项目主导研判分析应急排查内部Nday发掘。 二、研判分析 2.1、帆软V10 漏洞概述 帆软 V10 及 V11 版本报表软件存在反序列化漏洞&#xff0c;攻击者可利用该漏洞使用…

AI与物联网的深度融合:开启智能生活新时代

在当今数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;和物联网&#xff08;IoT&#xff09;作为两大前沿技术&#xff0c;正在加速融合&#xff0c;为我们的生活和工作带来前所未有的变革。这种融合不仅提升了设备的智能化水平&#xff0c;还为各行各业带来了新的机…

Linux `init` 相关命令的完整使用指南

Linux init 相关命令的完整使用指南—目录 一、init 系统简介二、运行级别&#xff08;Runlevel&#xff09;详解三、常用 init 命令及使用方法1. 切换运行级别2. 查看当前运行级别3. 服务管理4. 紧急模式&#xff08;Rescue Mode&#xff09; 四、不同 Init 系统的兼容性1. Sy…

UNet 改进(12):UNet with ECA (Efficient Channel Attention) 网络

详解 下面将详细解析这个实现了ECA注意力机制的UNet网络代码。 1. 代码概述 代码实现了一个带有Efficient Channel Attention (ECA)模块的UNet网络架构。 UNet是一种常用于图像分割任务的编码器-解码器结构网络,而ECA模块则是一种轻量级的通道注意力机制,可以增强网络对重…