2023-07-26 23:41:45
JDK、JRE、JVM 的区别在于功能定位不同,联系是层层嵌套的包含关系(JDK > JRE > JVM)。 以下从定义、组成、功能及跨平台原理展开说明:
一、核心定义与组成定义:Java虚拟机,负责识别.class字节码文件并调用操作系统API执行指令。
组成:仅包含字节码解释器、内存管理模块(如堆、栈、方法区)及与操作系统交互的接口。
特点:不同操作系统需对应不同JVM实现(如Windows版、Linux版),但同一字节码在不同JVM中解释结果一致。

JRE(Java Runtime Environment)
定义:Java运行时环境,提供程序运行所需的最小环境。
组成:包含JVM标准实现 + Java核心类库(如java.lang、java.util等基础包)。
特点:仅支持程序运行,无开发工具(如编译器、调试器)。
JDK(Java Development Kit)
定义:Java开发工具包,覆盖开发全流程。
组成:包含JRE + 开发工具(如javac.exe编译器、java.exe运行工具、jar.exe打包工具) + 调试分析工具(如jconsole、jvisualvm)。
特点:支持代码编写、编译、调试及运行,是Java开发的核心环境。
JDK vs JRE
功能对比:
JDK = JRE + 开发工具(如编译器、调试器)。
JRE = JVM + 核心类库(仅支持运行)。
使用场景:
开发Java程序需安装JDK(如编写Spring Boot应用)。
仅运行Java程序(如部署Web服务)只需安装JRE。
JDK安装后的双JRE现象
现象:安装JDK后,系统目录(如C:Program FilesJava)和JDK子目录(如jdk1.8jre)均存在JRE。
原因:
JDK自带JRE用于运行开发工具(如javac.exe本身是Java程序,需依赖JRE)。
外部独立安装的JRE与JDK自带JRE功能完全一致,通常无需重复安装。
建议:开发环境直接使用JDK自带JRE;仅运行环境无需安装JDK。

核心机制:JVM实现“一次编译,到处运行”。
字节码:Java源码经javac编译为统一格式的.class文件(字节码),与操作系统无关。
JVM适配:不同操作系统安装对应JVM实现(如Windows JVM、Linux JVM),将同一字节码解释为不同系统API调用。
示例:调用系统声音设备的代码在Java API层面统一,但编译后的字节码会被不同JVM映射到Windows的PlaySound或Linux的ALSA接口。
对比其他语言:
C/C++需针对不同系统重写代码(如Windows用WinAPI,Linux用POSIX)。
Java通过JVM屏蔽系统差异,开发者仅需关注业务逻辑。
开发选JDK(含JRE及工具)。
运行选JRE(最小依赖)。