JDK(Java Development Kit)、JRE(Java Runtime Environment)和 JVM(Java Virtual Machine)是 Java 平台的核心组成部分,各自承担不同职责:
JDK(Java 开发工具包):提供开发 Java 应用程序所需的全套工具和库,包括编译器(javac)、调试器、文档生成工具等。它包含了 JRE,因此安装 JDK 后即可同时进行开发与运行 Java 程序
JRE(Java 运行时环境):包含运行 Java 程序所必需的 Java 类库和 JVM。它是面向最终用户的运行环境,适用于仅需执行 Java 应用而无需开发的场景
JVM(Java 虚拟机):负责加载、验证并执行编译后的 Java 字节码(.class 文件)。JVM 是平台相关的,它将字节码转换为特定操作系统的本地机器指令,从而实现 Java 的“一次编写,到处运行”特性

注意:Java 字节码可以在任何安装了 JVM 的机器上运行,但 JVM 本身的实现是平台相关的——针对不同的操作系统(如 Windows、macOS、Linux 等),需要对应特定版本的 JVM
JDK 是用于开发 Java 应用程序的软件开发工具包,它不仅包含运行 Java 程序所需的 JRE(Java Runtime Environment),还提供了一整套开发工具
主要特性包括:
编译器(javac):将 .java 源代码文件编译为平台无关的字节码(.class 文件)
调试器(jdb):用于诊断和修复代码中的问题
实用工具:如 jar(用于打包 Java 应用)、javadoc(从源码自动生成 API 文档)等,提升开发效率
内置 JRE:因此安装 JDK 后,不仅可以开发,还能直接运行 Java 程序
JDK 是 Java 开发者的必备工具,适用于编写、编译、调试和打包 Java 应用程序
JDK 仅用于开发:它包含编译器、调试器和其他开发工具,普通用户运行 Java 程序时并不需要 JDK,只需安装 JRE(Java Runtime Environment)即可
JDK 是平台相关的:针对不同操作系统(如 Windows、Linux、macOS),Oracle 和其他供应商提供相应版本的 JDK,以确保开发工具能与底层系统兼容
Java 程序的开发与执行过程分为以下三个主要阶段:
编写源代码(.java 文件):开发者使用 Java 语言编写程序,保存为以 .java 为扩展名的源文件
编译(Compilation):JDK 中的编译器 javac 将 .java 源文件编译成平台无关的字节码(bytecode),并存储在 .class 文件中
执行(Execution):Java 虚拟机(JVM)加载 .class 文件,解释或即时编译(JIT)字节码,并将其转换为当前操作系统的本地机器指令,从而运行程序
JRE 为运行 Java 程序提供了必要的运行环境,但不包含任何开发工具,主要面向仅需执行 Java 应用的终端用户。其核心组成和特点包括:
包含 JVM(Java 虚拟机)和标准类库(如 java.lang、java.util 等),这些是运行 Java 字节码所必需的
提供完整的运行时支持:包括内存管理、安全机制、I/O 操作等,确保 Java 应用程序能正常启动和运行
不支持编译或调试:JRE 中没有 javac 编译器、调试器(jdb)或其他开发工具,因此无法用于编写或构建 Java 程序
JRE 仅用于运行 Java 应用程序,不能用于开发:它不包含编译器、调试器等开发工具,因此开发者无法使用 JRE 编写或构建 Java 代码
JRE 是平台相关的:针对不同的操作系统(如 Windows、Linux、macOS),需要安装对应版本的 JRE,因为其内部的 JVM 和本地库必须与特定操作系统兼容
JVM(Java 虚拟机)在运行 Java 程序时,主要通过以下三个关键阶段完成任务:
类加载(Class Loading)
JVM 的类加载器(ClassLoader)负责将编译后的 .class 文件从磁盘加载到内存中,并为每个类创建对应的运行时表示。这一过程包括加载、链接(验证、准备、解析)和初始化
字节码验证(Bytecode Verification)
在执行前,JVM 会对字节码进行严格的安全性和结构验证,确保其符合 Java 语言规范,防止非法操作(如访问未授权的内存或破坏类型安全),从而保障运行环境的安全与稳定
执行(Execution)
验证通过后,JVM 通过解释器逐条执行字节码指令;对于频繁调用的热点代码,即时编译器(JIT, Just-In-Time Compiler)会将其编译为本地机器码,以提升性能。同时,JVM 负责管理内存、线程,并通过系统调用与底层操作系统交互
JVM(Java 虚拟机)是 Java 平台的核心执行引擎,负责将平台无关的 Java 字节码转换为特定操作系统的本地机器指令。其关键特性包括:
作为 JDK 和 JRE 的核心组件:无论是开发环境(JDK)还是运行环境(JRE),都内置了 JVM,以支持 Java 程序的执行
自动内存管理与垃圾回收:JVM 管理程序的内存分配,并通过垃圾回收机制(Garbage Collection)自动释放不再使用的对象,有效防止内存泄漏
跨平台可移植性:只要目标系统上安装了对应平台的 JVM,相同的字节码即可在 Windows、Linux、macOS 等不同操作系统上无缝运行,真正实现“一次编写,到处运行”
JVM 实现是平台相关的:不同操作系统(如 Windows、Linux、macOS)需要各自对应的 JVM 实现,因为 JVM 必须与底层硬件和操作系统交互,将字节码转换为本地机器指令
字节码是平台无关的:Java 编译器生成的
.class字节码不依赖于任何特定平台,只要目标系统上安装了兼容的 JVM,即可运行相同的字节码现代 JVM 高度依赖即时编译(JIT):为提升性能,现代 JVM 会动态识别热点代码(频繁执行的方法),并通过 JIT 编译器将其编译为高度优化的本地机器码,从而显著加快执行速度,接近甚至媲美原生编译语言的性能

JVM 在运行 Java 程序时,会按照以下四个阶段对类进行处理和执行:
加载(Loading)
类加载器(Class Loader)负责从文件系统、网络或其他来源读取 .class 字节码文件,并将其加载到内存中,生成对应的 Class 对象
链接(Linking)
链接阶段确保加载的类在 JVM 中是正确且可用的,包含三个子步骤:
验证(Verification):检查字节码是否符合 JVM 规范,防止非法或损坏的代码执行
准备(Preparation):为类的静态变量分配内存并设置默认初始值(如 0、null 等)
解析(Resolution):将符号引用(如类名、方法名)转换为直接引用(如内存地址)
初始化(Initialization)
执行类的静态初始化块(static {})和静态变量的显式赋值语句,完成类的最终准备工作。这是类真正“激活”的时刻
执行(Execution)
JVM 通过解释器逐条执行字节码;对于频繁调用的“热点代码”,即时编译器(JIT)会将其编译为优化后的本地机器码,以提升运行效率。同时,JVM 负责管理线程、内存和系统资源调用