思考,输出,沉淀。用通俗的语言陈述技术,让自己和他人都有所收获。
作者:毅航😜
自上向下的剖析JVM
的工作原理,抛砖引玉式介绍.java
文件被转换为可执行文件的全过程。同时,分析探讨CPU
执行二进制文件的底层逻辑,
JVM
运行Java
字节码的秘密
众所周知,JVM
是一个允许Java
程序跨平台性的底层保障。其作为一个软件层运行在操作系统之上运行,并提供了一个将Java
字节码转换成机器码的平台。在如图所示的JVM
架构中,不难发现JVM
主要包括:类装载器、运行时数据区、执行引擎、本地库接口这四个关键部分。
其内部工作原理大致如下。在执行Java
代码时,其首先会依靠类似javac
的编译指令来将.java
文件编译为.class
文件,并在此基础上通过类加载器
来将需要执行的 .class
文件加载到虚拟机的内存中,即图中所示的运行时数据区
。
一般而言,被加载后的Java
类会存放于方法区,并进行执行。结合上图不难发现,在JVM
中会划分出堆
和栈
来存放运行时的数据信息,进一步,其又会将栈
细分为面向 Java 方法栈
的 本地方法栈
,以及记录执行位置的 PC
寄存器。
图中的执行引擎
则主要负责将字节码转换成机器码执行,这一过程通常包括解释执行和即时编译
两种形式。此外,JVM
还包含垃圾收集器来回收不再使用的内存资源,并通过本地接口支持Java
与非Java
代码的交互。
换言之,JVM
内部会存在.java
文件到可执行二进制文件的一个转换。而这也是所有高级语言可以运行的底层逻辑。接下来,我们便来看看这个转换过程到底是什么样的。
程序代码转为可执行文件
在你的眼中计算机
可能是个很智能的工具
,因为通过使用各类编程语言我们可以实现与计算机的交互,并命令其实现诸多有挑战性的任务。但就是这么一个很智能的工具
,其底层却只能识别0
和1
两种字符。
换言之,无论你使用什么样高端
的编程语言来与计算机
进行交互,最终落到底层时计算机
内部都会将我们通过高级语言
编写的源代码
转换成机器能够理解和执行的二进制指令
。
如上的这张图,反映了在计算机世界中高级代码
从源代码到机器指令的大致转换过程。为了方便理解,我们以java
源代码代码转换为可执行二进制文件的过程进行分析。
在 Java
中,最开始程序员使用 Java
编程语言编写源代码,并将其保存在 .java
文件中。而这些源代码文件随后通过 Java
编译器被编译成字节码。事实上,这里的提到的字节码是介于二进制文件
和.java
文件的一种中间态,通常称为 .class
文件。由于字节码
具有平台无关性,所以这就意味着它并不直接对应于任何特定硬件或操作系统的机器代码。当.java
文件被"翻译"为字节码后,在JVM
中便会依赖执行引擎
来将其转换为计算机可以识别的二进制文件。
。换言之,最终交由计算机执行文件只能0
和1
组成的机器码,而源代码经过解释执行后生成的这些机器代码,最终会被加载到计算机内存中,等待cpu
的调度执行,执行完毕后输出相关结果信息。
了解了源代码
与二进制文件
的转换的大致逻辑后.接下来,我们便来看看CPU
究竟是如何来执行这些0、1
文件的。
CPU
执行代码的秘密
CPU
从内存中获取这些指令,解码确定执行操作,然后执行。执行过程可能包括算术运算、数据传输、条件分支等操作,并将结果存储回内存或寄存器。在整个过程中,CPU
与内存以及计算机的其他组件(如硬盘、显卡等)不断交互,完成输入输出操作和数据处理。
众所周知,在计算机的世界中,在程序执行前,首先需要将程序载入到内容内存,然后CPU
再从内存中获取这些指令,然后执行。而在执行过程中其又会包括算术运算、数据传输、条件分支判断
等操作,同时在将内容写回到内存或寄存器。这么说可能你可能会有点陌生,我们接下来通过一个厨师做菜的例子来辅助理解。
厨师(即CPU)
在开始做菜之前,首先需要准备好食材。这就像CPU
从内存中获取下一条要执行的指令一样。而食材的准备工作对应于程序计数器(PC)
指向下一条指令的地址,并将其提取到 CPU
中。接着,厨师需要阅读食谱来理解如何处理食材。类似地,CPU
需要解码
取出的指令,以理解需要执行哪种操作。食谱的说明对应于指令中的操作码和操作数。 接下来,厨师根据食谱的指导处理食材,比如切割、搅拌或加热。这一步类似于 CPU
执行解码后的指令。这可能涉及算术运算、数据传输等操作,就像不同的烹饪方法。与此同时, 厨师可能需要从冰箱(内存)
中取出更多食材或将处理过的食材放回去。同样,CPU
在执行指令的过程中可能需要访问内存,读取或存储数据。最后,厨师完成了菜肴的制作,并将其放在盘子上。在CPU
的工作中,这相当于将执行结果写回到寄存器或内存中,完成整个指令的执行过程。
有时,为了提高效率厨师也可能同时负责多道菜肴的烹饪。比如一个菜在煮,另一个菜在切。这类似于现代 CPU
的流水线技术,允许同时处理多个指令的不同阶段,以提高效率。这其实就是计算机中流水线
思想的典型应用。
总结一句话来说CPU
底层执行可执行文件的逻辑就是取址------执行
,也即找寻指令数据
地址,执行指令。
总结
至此,我们也就从JVM
入手,抛砖引玉的介绍了JVM
的组成结构以及工作原理,同时我们还自顶向下的分析了JVM
执行.java
文件的全过程,并对CPU
执行二进制文件的大致逻辑进行阐述。希望本文对你学习了解JVM
有所帮助。
如果觉得文章不错,不妨点一点赞,你的鼓励是笔者一直坚持更新的最大动力!