【JVM 札记】浅谈 JVM

2023-02-18 17:02:40 浏览数 (1)

最近看了点关于 JVM 的东西,这里简单的梳理并记录一下。并不保证我梳理的每一句都是正确的,但是对于我而言应该是最容易方便我记忆的。

JVM 是每个 Java 程序员必学的内容,毕竟 Java 运行在 JVM 之上。就好比学习 C 语言一样,因为 C 语言编译连接后生成的二进制文件通过操作系统的装载器装在后,可以让其直接运行在 CPU 上,因此,去学习操作系统对 CPU 的调度、对内存的管理等知识可以很好的理解 C 语言代码编译连接后生成二进制文件的运行机制。而学习 Java 去学习 JVM 也是相同的道理。

JVM 的全称是 Java Virtual Machine,就是 Java 虚拟机。它被称为虚拟机,但是它是建立在操作系统之上;对于 class 文件而言,JVM 就是操作系统了。那为什么 Java 编译后的 class 需要运行在虚拟机上,而 C 语言编译后的文件可以运行在 CPU 上呢?因为 Java 语言需要跨平台,但是各个平台的实现是不同的,因此 Java 的跨平台,实际上真正跨平台的是 JVM 的跨平台,它是对操作系统的一层抽象。如下图:

从上图可以看出,JVM 是装载 .class 文件后,将 .class 文件的字节码转换为机器码由 CPU 进行运行。在我们通过 java 执行一个 .class 文件时(比如 HelloWorld.class)文件时,就会启动一个 JVM,此时 JVM 是操作系统上的一个进程,当程序执行完成后,JVM 进行随之退出。

JVM 虽然是 Java 虚拟机,但是 JVM 是一个标准,通常我们说的 JVM 实际指的是 Oralce 的 HotSpot 实现。既然 JVM 是标准,那么就可以有多种实现。因此,JVM 除了 Oralce 的 HotSpot 外还有其他一些实现。每种实现的细节都会有所不同。这就好比软件的面向接口编程,接口定义在那里,调用时面向接口进行调用,具体实现根据不同的场景,实现自然不同。

又因为 JVM 是标准,我们可以理解为它对 .class 文件进行了标准化,那么无论是什么语言,只要编译后的能生成符合 JVM 标准的 .class 文件,就可以运行在 JVM 之上。因此,有人说 Java 是跨平台语言,而 JVM 是跨语言的平台。如下图:

JVM 实际是运行 .class 文件的,与具体的语言是无关的,只要编译后能生成符合 JVM 规范的 .class 文件即可。

学习 JVM 我觉得就是学习 .class 文件的运行环境,它当中的很多知识和操作系统比较类似。操作系统中比较重要的就是 CPU 的管理和内存的管理,比如进程的调度、线程的调度,比如内存的段页式管理等。JVM 其实也是如此,比较常说的 JVM 的垃圾回收,不就是 JVM 对内存的管理方式么。

补充:虚拟机这个概念是广义的,比如我们常用的 VMWARE、VBOX 是在物理机上又模拟了一台完整的计算机。JVM 是为了在操作系统之上构建更高抽象和跨平台而抽象出来的一个供 .class 文件运行的环境。操作系统其实也是一层虚拟机,它抽象和管理了 CPU、内存 和 I/O 等硬件。

注:

1.还记得我开头的话么,内容不保证是对的。

2.当我看 JVM 相关的内容时,很快能想到和操作系统的知识相关联,可惜大部分操作系统的知识都已经忘记,不然以类比的方式进行学习,可能会更深入,更透彻。

0 人点赞