
1.5 JVM、JRE与JDK
Java开发人员经常会遇到JVM、JRE和JDK这三个概念,对于初学者来说常常分不清这些概念,本节将给大家介绍这三个概念。
首先我们看JVM,这个概念大家应该比较熟悉了,前面也说过它是Java虚拟机(Java Virtual Machine)的缩写。JVM是整个Java平台中最核心的部分,说它是虚拟机是因为它并不是真正存在的物理机,而是运行在物理机上的模拟计算机运行的一个进程。简单地说,JVM就是执行Java代码编译后的字节码指令的环境,它是Java的基础。
JVM结构如图1.5所示,主要包含了如下三部分。

图1.5 JVM结构
● 类加载器:用于将.class文件加载到内存并完成解析工作。
● 字节码校验器:它会对类加载器所加载的字节码进行一些校验,以判断是否存在违反规则的操作。
● 执行引擎:负责执行由Java代码经编译后的字节码指令。
当我们打开Java下载页面时就会发现不同的操作系统对应不同的版本,实际上就是JVM需要根据不同的操作系统开发不同的版本。Java语言的跨平台特性就是依靠这个来实现的,在不同的操作系统上抽象一个虚拟机层,从而屏蔽底层硬件的差异,最终达到跨平台的效果。如图 1.6所示,Windows操作系统对应Windows版本的JVM,Linux操作系统对应Linux版本的JVM,其他操作系统类似。这样,同一套.class文件(字节码指令)就能在不同操作系统上运行了。

图1.6 JVM与系统
JRE是Java运行时环境(Java Runtime Environment)的缩写。JRE包含JVM和一些JVM运行时所需的Java核心类库,此外还包含一些命令工具,如图1.7所示。JRE是Java代码可以运行的最低要求,带着你编写完的Java代码和对应系统的JRE就可以在其他机器上运行了。需要注意的是,自Java 11开始不再提供官方的JRE,取而代之的是由用户根据需求自定义JRE。

图1.7 JRE结构
JDK是Java开发工具集(Java Development Kit)的缩写。JDK包含JRE和开发过程中可能用到的一些命令工具,如图1.8所示。JDK是Java语言的最大的集合,我们常说的Java一般指的就是JDK,它包含一整套完整的开发工具集和运行环境。常见的命令工具包括java、javac、jdb、jar、javadoc、javah、jconsole、javap、jps、jstat、jinfo、jhat、jmap、jstack、jdeps、native2ascii等,涵盖了编译、调试、管理、反汇编、文档生成、诊断分析、监控、编码转换等方面的工具和命令。

图1.8 JDK结构
最后我们借图1.9展示JVM、JRE和JDK三者的关系,底层是提供Java运行环境的JVM。中间层的JRE还提供了Java核心类库,供JVM在执行字节码指令时调用所需的类库。JDK相当于一个完整的Java平台,包含Java编程开发调试工具和JRE。

图1.9 JVM、JRE和JDK的关系
考考你
● JVM、JRE和JDK分别是什么的缩写?
● JVM的作用是执行Java代码编译后的字节码指令吗?
● 我的工作电脑是Windows操作系统,所以应下载什么版本的JDK?
● 如果我想开发Java程序,只需要下载JRE就行了吗?
● JVM、JRE和JDK三者的关系是什么?