Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说Java 领域概念:JDK、JRE、JVM,希望能够帮助你!!!。
JVM
JVM 全称 Java Virtual Mechinal,即 Java 虚拟机。JVM 是驻留于内存中的抽象计算机,可以理解为一个虚拟的计算机,它是通过在真实计算机上仿真模拟各种计算机功能来实现的,具有处理器、堆栈、寄存器等完善的硬件架构以及相应的指令系统,通过抽象 CPU 和操作系统结构,使代码的执行与主机硬件、主机操作系统无关。
JVM 关注的是 Java 字节码文件(类文件 .class),Java 字节码文件由 JVM 指令集、符号表以及一些补充信息组成。JVM 的主要工作是将 Java 字节码解释为本地机器码,实际就是将自己的指令集(Java 字节码)映射为本地 CPU 的指令集或操作系统的接口调用(本地机器码)。
Java 语言的跨平台性,其实就是靠不同平台版本的 JVM 来实现的。不同的操作系统,使用不同的 JVM 映射规则,使 Java 字节码的解释执行与操作系统无关,从而完成跨平台(一次编译,到处执行)。也就是说,能跨平台的是 Java 程序,而 JVM 是不能跨平台的,对于不同的操作系统平台有不同的 JVM 实现,Java 程序的跨平台性就是通过 JVM 的不跨平台实现的。
JVM 主要包含了以下组件:
JVM 除了跨平台意义上的不同实现之外,还有很多不同的发行版,每个发行版通常都会有不同平台的实现。这些不同的发行版往往会有不同的特性,或针对不同的领域。
上述 JVM 主要是在 JSE / JEE 领域的主流选择,而针对 JME 领域及 Android 或 Android 兼容系统也有诸如 CLDC-HI、JavaCard、Sun SPOT、OpenJ9(OpenJ9 是一个高度模块化的 JVM,在嵌入式、JME 领域都可以应对)等实现。此外还有一些研究性质的 JVM,如 Graal VM、Jikes RVM、Maxine VM 等。
JRE
JRE 全称 Java Runtime Environment,即 Java 运行时环境,由运行和管理 Java 应用程序的类库和工具组成。
JRE 中包含了 JVM,单纯的 JVM 不能运行 Java 程序,JVM 在解释 Java 字节码时需要用到一些核心类库,这些核心类库就被包含在 JRE 中,简单来说 JRE 就是 JVM + 核心类库。
除了 JVM 和 核心类库之外,通常的 JRE 发行版中还会包含一些其它的工具和命令,如 密钥库工具 keytool、安全策略管理工具 policytool、jar 文件解压缩工具 pack200/unpack200 等。
JDK
JDK 全称 Java Development Kit,即 Java 开发工具包,是面向 Java 开发人员使用的 SDK(Software Development Kit,软件开发工具包),提供了 Java 程序的开发环境和运行环境。
JDK 包含了 JRE、基础类库(Java API,如网络、IO、线程、图形等)、Java 源码编译器 javac、以及其它的一系列用于开发、诊断、分析、调试、管理的工具和命令,如 jar、javah、native2ascii、jdb、jconsole、jstat、jps、jmap、jhat 等。
从 Java 11 开始,安装 JDK 时不会直接安装 JRE,需要用户自行选择安装 JRE 模块,可以使用 jlink 程序生成,如:bin\jlink.exe --module-path jmods --add-modules java.desktop --output jre 。
JDK 有多个构建版本,而实际只有一组源代码,即 OpenJDK,使用分布式版本控制系统 Mercurial 托管在 OpenJDK。任何人都可以获取这些源码,并用其构建一个变种版本进行发布。当然需要一个独有的认证程序来确保构建的变种版本是有效的,这个认证程序是由 JCP(Java Community Process)组织审核的,该组织会提供一套技术兼容性工具包 TCK(Technology Conformance Kit)。如果你构建了一个 OpenJDK 的变种版本,并通过了 TCK 的兼容性测试,则可以将该变种版本称为“Java SE Compatible”(兼容 Java SE 的 JDK)。
下面是一些主流的 OpenJDK 构建版本——
除了上面所述之外,还有其它很多不同的构建版本,如阿里巴巴的 Dragonwell,AWS 的 Corretto 等,此外不同的 Linux 发行版也会使用不同的方式内置 OpenJDK,如 Ubuntu、Debian、Fedora、Arch 等,而如果要追求“标准”,最好的建议是使用 Oracle OpenJDK、AdoptOpenJDk 以及 Linux 发行版中内置的构建版本。
参考
今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。