从源代码到机器指令,剖析JVM运行的秘密


思考,输出,沉淀。用通俗的语言陈述技术,让自己和他人都有所收获。

作者:毅航😜


自上向下的剖析JVM的工作原理,抛砖引玉式介绍.java文件被转换为可执行文件的全过程。同时,分析探讨CPU执行二进制文件的底层逻辑,

JVM运行Java字节码的秘密

众所周知,JVM是一个允许Java程序跨平台性的底层保障。其作为一个软件层运行在操作系统之上运行,并提供了一个将Java字节码转换成机器码的平台。在如图所示的JVM架构中,不难发现JVM主要包括:类装载器、运行时数据区、执行引擎、本地库接口这四个关键部分。

其内部工作原理大致如下。在执行Java代码时,其首先会依靠类似javac的编译指令来将.java文件编译为.class文件,并在此基础上通过类加载器来将需要执行的 .class 文件加载到虚拟机的内存中,即图中所示的运行时数据区

一般而言,被加载后的Java类会存放于方法区,并进行执行。结合上图不难发现,在JVM中会划分出来存放运行时的数据信息,进一步,其又会将细分为面向 Java 方法栈本地方法栈,以及记录执行位置的 PC 寄存器。

图中的执行引擎则主要负责将字节码转换成机器码执行,这一过程通常包括解释执行和即时编译两种形式。此外,JVM还包含垃圾收集器来回收不再使用的内存资源,并通过本地接口支持Java与非Java代码的交互。

换言之,JVM内部会存在.java文件到可执行二进制文件的一个转换。而这也是所有高级语言可以运行的底层逻辑。接下来,我们便来看看这个转换过程到底是什么样的。

程序代码转为可执行文件

在你的眼中计算机可能是个很智能的工具,因为通过使用各类编程语言我们可以实现与计算机的交互,并命令其实现诸多有挑战性的任务。但就是这么一个很智能的工具,其底层却只能识别01两种字符。

换言之,无论你使用什么样高端的编程语言来与计算机进行交互,最终落到底层时计算机内部都会将我们通过高级语言编写的源代码转换成机器能够理解和执行的二进制指令

如上的这张图,反映了在计算机世界中高级代码从源代码到机器指令的大致转换过程。为了方便理解,我们以java源代码代码转换为可执行二进制文件的过程进行分析。

Java 中,最开始程序员使用 Java 编程语言编写源代码,并将其保存在 .java 文件中。而这些源代码文件随后通过 Java编译器被编译成字节码。事实上,这里的提到的字节码是介于二进制文件.java文件的一种中间态,通常称为 .class 文件。由于字节码具有平台无关性,所以这就意味着它并不直接对应于任何特定硬件或操作系统的机器代码。当.java文件被"翻译"为字节码后,在JVM中便会依赖执行引擎来将其转换为计算机可以识别的二进制文件。

。换言之,最终交由计算机执行文件只能01组成的机器码,而源代码经过解释执行后生成的这些机器代码,最终会被加载到计算机内存中,等待cpu的调度执行,执行完毕后输出相关结果信息。

了解了源代码二进制文件的转换的大致逻辑后.接下来,我们便来看看CPU究竟是如何来执行这些0、1文件的。

CPU执行代码的秘密

CPU从内存中获取这些指令,解码确定执行操作,然后执行。执行过程可能包括算术运算、数据传输、条件分支等操作,并将结果存储回内存或寄存器。在整个过程中,CPU与内存以及计算机的其他组件(如硬盘、显卡等)不断交互,完成输入输出操作和数据处理。

众所周知,在计算机的世界中,在程序执行前,首先需要将程序载入到内容内存,然后CPU再从内存中获取这些指令,然后执行。而在执行过程中其又会包括算术运算、数据传输、条件分支判断等操作,同时在将内容写回到内存或寄存器。这么说可能你可能会有点陌生,我们接下来通过一个厨师做菜的例子来辅助理解。

厨师(即CPU)在开始做菜之前,首先需要准备好食材。这就像CPU从内存中获取下一条要执行的指令一样。而食材的准备工作对应于程序计数器(PC)指向下一条指令的地址,并将其提取到 CPU 中。接着,厨师需要阅读食谱来理解如何处理食材。类似地,CPU 需要解码取出的指令,以理解需要执行哪种操作。食谱的说明对应于指令中的操作码和操作数。 接下来,厨师根据食谱的指导处理食材,比如切割、搅拌或加热。这一步类似于 CPU 执行解码后的指令。这可能涉及算术运算、数据传输等操作,就像不同的烹饪方法。与此同时, 厨师可能需要从冰箱(内存)中取出更多食材或将处理过的食材放回去。同样,CPU 在执行指令的过程中可能需要访问内存,读取或存储数据。最后,厨师完成了菜肴的制作,并将其放在盘子上。在CPU的工作中,这相当于将执行结果写回到寄存器或内存中,完成整个指令的执行过程。

有时,为了提高效率厨师也可能同时负责多道菜肴的烹饪。比如一个菜在煮,另一个菜在切。这类似于现代 CPU 的流水线技术,允许同时处理多个指令的不同阶段,以提高效率。这其实就是计算机中流水线思想的典型应用。

总结一句话来说CPU底层执行可执行文件的逻辑就是取址------执行,也即找寻指令数据地址,执行指令。

总结

至此,我们也就从JVM入手,抛砖引玉的介绍了JVM的组成结构以及工作原理,同时我们还自顶向下的分析了JVM执行.java文件的全过程,并对CPU执行二进制文件的大致逻辑进行阐述。希望本文对你学习了解JVM有所帮助。

如果觉得文章不错,不妨点一点赞,你的鼓励是笔者一直坚持更新的最大动力!

相关推荐
雷神乐乐3 分钟前
File.separator与File.separatorChar的区别
java·路径分隔符
小刘|8 分钟前
《Java 实现希尔排序:原理剖析与代码详解》
java·算法·排序算法
JavaNice哥14 分钟前
1初识别jvm
jvm
涛粒子14 分钟前
JVM垃圾回收详解
jvm
YUJIANYUE18 分钟前
PHP将指定文件夹下多csv文件[即多表]导入到sqlite单文件
jvm·sqlite·php
逊嘘27 分钟前
【Java语言】抽象类与接口
java·开发语言·jvm
morris13134 分钟前
【SpringBoot】Xss的常见攻击方式与防御手段
java·spring boot·xss·csp
monkey_meng1 小时前
【Rust中的迭代器】
开发语言·后端·rust
余衫马1 小时前
Rust-Trait 特征编程
开发语言·后端·rust
monkey_meng1 小时前
【Rust中多线程同步机制】
开发语言·redis·后端·rust