一、Java 程序的加载与执行主要涉及以下几个关键步骤:
1.编译:
首先,Java 源代码(.java 文件)通过 Java 编译器(javac)被编译成字节码文件(.class 文件)。在这个过程中,编译器会对源代码进行语法检查和语义分析,将其转换为符合 Java 字节码规范的中间表示形式。例如,如果有一个简单的Java 类 HelloWorld.java:
java
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
使用 javac HelloWorld.java 命令进行编译后,会生成 HelloWorld.class 文件。
2.类加载
当运行 Java 程序时,Java虚拟机(JVM)会启动并负责加载字节码文件。类加载过程由类加载器(ClassLoader)完成,它遵循双亲委派模型。首先,会检查类是否已经被加载,如果没有,则从文件系统、网络或其他来源查找并加载字节码文件到内存中。例如,对于上述的HelloWorld 类,JVM 会通过类加载器将 HelloWorld.class 文件加载到内存中,并在方法区创建对应的类信息结构。
3.字节码验证
加载后的字节码需要经过验证,以确保其符合 Java 虚拟机规范,不会对 JVM造成安全威胁或执行错误。验证过程包括语法验证、语义验证和字节码流验证等。例如,验证字节码中的指令是否合法,操作数类型是否匹配等。
4.解释执行或编译执行
JVM 可以采用解释执行或编译执行的方式来运行字节码。在解释执行模式下,JVM会逐行读取字节码指令并在运行时进行解释执行,这种方式启动速度较快,但执行效率相对较低。而在编译执行模式下,JVM会使用即时编译器(JIT)将频繁执行的字节码片段编译成机器码,后续直接执行机器码,提高执行效率。例如,对于 HelloWorld 类中的main 方法,JVM 可能会先解释执行其中的字节码,当发现 System.out.println 方法被频繁调用时,JIT可能会将其相关字节码编译成机器码以加速执行。
5.运行时环境支持
在执行过程中,Java 程序可以通过 JVM 提供的运行时环境与操作系统和硬件进行交互。JVM提供了内存管理、线程管理、异常处理等功能。例如,当 HelloWorld 类中的 System.out.println 方法执行时,JVM会通过底层的输入输出流机制与操作系统的控制台进行交互,将字符串输出到屏幕上。 Java程序的加载与执行通过编译、类加载、字节码验证以及解释执行或编译执行等一系列步骤,在 JVM的支持下实现了跨平台的运行,并提供了丰富的运行时环境功能。
二、JDK、JRE、JVM分别是什么?他们的关系是什么?
1.JDK(Java Development Kit)
即 Java 开发工具包,是 Java 开发人员用于开发 Java 程序的软件包。它包含了 JRE和一系列开发工具,如编译器(javac)、调试器(jdb)、文档生成器(javadoc)等。这些工具能够帮助开发者将 Java源代码编写、编译成字节码文件,并进行调试和文档生成等操作。例如,使用 JDK 中的编译器可以将 .java 文件转换为 .class 文件。
组成:包括 JVM(Java 虚拟机,是 Java 程序真正运行的地方)、核心类库(Java预先写好可直接使用的代码集合)和众多开发工具(如 Java 编译器 javac、运行工具、调试工具 jdb 等)。
用途:程序员编写和运行Java 代码时需要安装 JDK。
2.JRE(Java Runtime Environment)
即 Java 运行时环境,是运行 Java 程序所必需的环境。它包括了 JVM 和 Java 核心类库。JRE 提供了 Java程序运行时所需的所有组件,使得 Java 字节码能够在不同的操作系统上运行。当用户运行一个已有的 Java 应用程序时,只需要安装 JRE 即可。
组成:包含 JVM、核心类库和运行时所需的一些工具(如运行代码的工具)。
用途:当只需运行已有的 Java 代码(class 文件)时,安装JRE 即可,相比 JDK 占用硬盘空间较小
把 JVM 和核心类库还有在运行的时候所用到的一些工具单独的去抽离出来。又组成了一个 j re,那么这个 j re 呢?就是 JAVA 的运行环境。
3.JVM(Java Virtual Machine)
即 Java 虚拟机,是 Java实现跨平台的核心。它负责加载字节码文件,并将字节码解释或编译成目标机器的机器码在特定的操作系统和硬件平台上运行。不同的操作系统都有对应的JVM 实现。
标签:Java,字节,JVM,执行,运行,加载 From: https://blog.csdn.net/m0_73941339/article/details/144791748它们之间的关系是:JDK 包含 JRE,JRE 包含 JVM。在开发阶段,开发者需要安装 JDK 来进行 Java程序的开发;在运行阶段,用户只需要安装 JRE 就可以运行 Java 程序,而 JVM 则是 JRE 的核心组成部分,负责实际执行 Java字节码。