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

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虚拟机的具体操作跟平台指令和操作系统相关。

相关文章:

  • BFC详解
  • uniapp上传图片时(可选微信头像、相册、拍照)
  • 基于Canal+Spring Boot+Kafka的MySQL数据变更实时监听实战指南
  • ETL数据集成平台在电商行业五大应用场景
  • 阅读分析Linux0.11 /boot/head.s
  • kotlin + spirngboot3 + spring security6 配置登录与JWT
  • Java如何在遍历集合时删除特定元素
  • 【Pandas】pandas DataFrame get
  • 2025.04.17【Stacked area】| 生信数据可视化:堆叠区域图深度解析
  • 国内外汽车行业供应链导入EDI方式的差异
  • UE5 UE循环体里怎么写延迟
  • Vue 和 Spring boot 和 Bean 不同生命周期
  • Oracle测试题目及笔记(多选)
  • OpenAI发布GPT-4.1系列模型,主打编程能力提升
  • 泛型算法——只读算法(一)
  • Oracle 处理“不允许长度为0的列”(ORA-01723)问题解析
  • Oracle_00000
  • Spring Boot 学习总结(35)—— 使用 SpringAI 实现 MCP 服务并与 Qwen 集成使用?
  • 图形变换算法
  • 通过gird布局实现div的响应式分布排列
  • 独家 |《苏州河》上海上演,编剧海飞:上海的风能吹透我
  • 国税总局上海市税务局回应刘晓庆被举报涉嫌偷漏税:正依法依规办理
  • 澎湃·镜相第二届非虚构写作大赛初选入围名单公示
  • 当番茄霸总遇上晋江古言,短剧IP小变局
  • 当代科技拟召开债券持有人会议 ,对“H20科技2”进行四展
  • 大外交|巴西总统卢拉第六次访华签署20项协议,“双方都视对方为机遇”