Bootstrap

java文件如何被编译成机器码?JDK,JRE,JVM之间的区别和联系

一.JDK,JRE,JVM之间的区别和联系

      这张图简单的概括了他们三者之间的关系,先简单解释上图中出现的概念

1.JDK:Java 的开发工具包。

2.开发工具:主要有编译器(javac),调试工具(jdb),打包工具(jar)。

3.JRE:运行java程序的环境。

4.标准类库:如 java.langjava.util 等,提供了 Java 程序的基础功能,如数据结构、I/O 操作、网络连接等。

5.JVM:Java 程序的运行环境,用于执行 .class 字节码文件。

二.java文件被编译成机器码的过程

       看一下.java文件被执行的过程可以帮助我们理解:

       在一个 .java文件被编译和执行时,大致可以分为两个主要阶段:编译阶段执行阶段

①编译阶段

      编译阶段的主要工作是将 Java 源代码(.java 文件)编译为字节码(.class 文件)。这一步主要是由 JDK 提供的工具 javac(Java 编译器)完成。编译后的 Java 字节码,是一个中间语言,能够在任何支持 JVM 的平台上运行。

②执行阶段

  1. 运行编译后的 .class 文件时继续运行时会启动 JRE,JRE 提供运行环境,包括 JVM 和标准类库(如 java.langjava.util 等)。当你的 Java 程序需要使用一些标准库时,JRE 会提供这些库的支持。例如,当你使用 System.out.println() 打印输出时,JRE 中包含的标准类库负责执行这些操作。

  2. 而 JRE 会加载 JVM。JVM 负责执行 MyProgram.class 文件中的字节码。JVM 执行时,会将字节码转换为机器代码,以便在特定平台上运行。

总结

       编写的 .java 文件通过 Java 编译器(javac)编译成字节码(.class 文件),然后 Java 运行时环境(JRE)提供的 Java 虚拟机(JVM)加载该字节码,并将其解释或编译为机器码,最终在 CPU 上执行,完成程序运行。

三.扩展

 一.java代码能在各个操作系统上运行的本质原因

       Java 源代码经过编译后,生成的不是平台特定的机器码,而是平台无关的字节码。字节码是一种中间形式,它不依赖于操作系统或硬件架构。

       Java 程序运行时依赖于 JVM,而 JVM 是针对不同平台实现的。每个操作系统或硬件平台都有专门的 JVM 实现,JVM 负责将平台无关的字节码转换为具体平台的机器码。相当于充当了一个中间层,每个操作系统(如 Windows、Linux、macOS)都有自己的 JVM,但这些 JVM 都能执行相同的字节码。JRE也提供了一致的类库支持。

       JVM 中的 JIT(Just-In-Time)编译器 在运行时会将字节码转换为平台特定的机器码,并进行一些特定平台的性能优化。这使得 Java 程序不仅能在多个平台上运行,而且能够获得接近本地代码的执行效率。

       Java 的 类加载机制 使得 Java 程序可以根据需求动态加载类文件。由于字节码文件与平台无关,类加载器会根据不同的需求和平台来加载合适的类,这进一步增强了 Java 的跨平台能力。

二.全称

1. JDK(Java Development Kit,Java 开发工具包)

2. JRE(Java Runtime Environment,Java 运行时环境)

3. JVM(Java Virtual Machine,Java 虚拟机)

;