一.JDK,JRE,JVM之间的区别和联系
这张图简单的概括了他们三者之间的关系,先简单解释上图中出现的概念
1.JDK:Java 的开发工具包。
2.开发工具:主要有编译器(javac),调试工具(jdb),打包工具(jar)。
3.JRE:运行java程序的环境。
4.标准类库:如 java.lang
、java.util
等,提供了 Java 程序的基础功能,如数据结构、I/O 操作、网络连接等。
5.JVM:Java 程序的运行环境,用于执行 .class
字节码文件。
二.java文件被编译成机器码的过程
看一下.java文件被执行的过程可以帮助我们理解:
在一个 .java文件被编译和执行时,大致可以分为两个主要阶段:编译阶段和执行阶段。
①编译阶段
编译阶段的主要工作是将 Java 源代码(.java
文件)编译为字节码(.class
文件)。这一步主要是由 JDK 提供的工具 javac
(Java 编译器)完成。编译后的 Java 字节码,是一个中间语言,能够在任何支持 JVM 的平台上运行。
②执行阶段
-
运行编译后的
.class
文件时继续运行时会启动 JRE,JRE 提供运行环境,包括 JVM 和标准类库(如java.lang
、java.util
等)。当你的 Java 程序需要使用一些标准库时,JRE 会提供这些库的支持。例如,当你使用System.out.println()
打印输出时,JRE 中包含的标准类库负责执行这些操作。 -
而 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 的跨平台能力。