JVM学习(1)——Java 代码为何在虚拟机中运行

前言——为什么要学习JVM

Java虚拟机是想要深入学习Java必须要接触的知识,同时也是Java工程师在面试中一定会遇到的知识方向,所以从今天开始开一个tag来记录JVM的学习。

“知其然”也要“知其所以然”,学习 Java 虚拟机的本质,更多是了解Java程序是如何被执行和优化的,为学习更核心的Java技术打好基础。

为什么 Java 要在虚拟机里运行?

Java 作为一门高级程序语言,它的语法非常复杂,抽象程度也很高。因此,直接在硬件上运行这种复杂的程序并不现实。所以在运行 Java 程序之前,需要对其进行一番转换。

这个转换具体是怎么操作的呢?当前的主流思路是:设计一个面向 Java 语言特性的虚拟机,并通过编译器将 Java 程序转换成该虚拟机所能识别的指令序列,也称 Java 字节码

Java 虚拟机可以由硬件实现,但更为常见的是在各个现有平台(如 Windows_x64、Linux_aarch64)上提供软件实现。这么做的意义在于,一旦一个程序被转换成 Java 字节码,那么它便可以在不同平台上的虚拟机实现里运行。这也就是我们经常说的“一次编写,到处运行”。java能跨平台是因为JVM能跨平台。

JRE 中仅包含运行 Java 程序的必需组件,包括 Java 虚拟机以及 Java 核心类库等。我们 Java 程序员经常接触到的 JDK(Java 开发工具包)同样包含了 JRE,并且还附带了一系列开发、诊断工具。

虚拟机的另外一个好处是它带来了一个托管环境(Managed Runtime)。这个托管环境能够代替我们处理一些代码中冗长而且容易出错的部分。其中最广为人知的当属自动内存管理垃圾回收

除此之外,托管环境还提供了诸如数组越界、动态类型、安全权限等等的动态检测,使我们免于书写这些无关业务逻辑的代码。

之所以要在虚拟机中运行,是因为它提供了可移植性。一旦 Java 代码被编译为 Java 字节码,便可以在不同平台上的 Java 虚拟机实现上运行。此外,虚拟机还提供了一个代码托管的环境,代替我们处理部分冗长而且容易出错的事务,例如内存管理。

您的支持将鼓励我继续创作~