JVM(Java虚拟机)、JDK(Java开发工具包)、JRE(Java运行环境)和OpenJDK之间有什么区别?

374
JVM、JDK、JRE和OpenJDK之间有什么区别?

可能是[Java SE 6 vs. JRE 1.6 vs. JDK 1.6 - What do these mean?](https://dev59.com/_XVC5IYBdhLWcg3wliCe)的重复问题。 - user207421
22个回答

403

JVM

Java虚拟机(JVM)是运行Java字节码的虚拟机。JVM不理解Java源代码;这就是你需要编译你的*.java文件以获得包含JVM可以理解的字节码的*.class文件的原因。它也是让Java成为“可移植语言”(一次编写,到处运行)的实体。确实,不同系统有特定的JVM实现(Windows,Linux,macOS,请参见维基百科列表),目的是使用相同的字节码它们都能给出相同的结果。

JDK和JRE

为了解释JDK和JRE之间的区别,最好阅读Oracle文档并查看图表:

Java运行环境(JRE)

Java运行环境(JRE)提供库、Java虚拟机和其他组件来运行用Java编程语言编写的小程序和应用。此外,两个重要的部署技术是JRE的一部分:Java插件,它使小程序可以在流行的浏览器中运行;和Java Web Start,它通过网络部署单独的应用程序。它也是Java 2平台企业版(J2EE)技术的基础,用于企业软件开发和部署。JRE不包含用于开发小程序和应用程序的编译器或调试器等工具和实用程序。

Java开发工具包(JDK)

JDK是JRE的超集,包含JRE中的所有内容,以及用于开发小程序和应用程序的编译器和调试器等工具。

请注意,Oracle并不是唯一提供JDK的公司。

OpenJDK

OpenJDK 是 JDK 的开源实现,也是 Oracle JDK 的基础。Oracle JDK 和 OpenJDK 之间几乎没有区别。

这篇博客详细说明了它们之间的区别:

问:OpenJDK 存储库中的源代码和您用于构建 Oracle JDK 的代码有什么区别?

答:非常接近——我们构建 Oracle JDK 发布版的构建过程基于 OpenJDK 7,只添加了一些组件,如部署代码,其中包括 Java 插件和 Java WebStart 的 Oracle 实现,以及一些闭源的第三方组件,例如一个图形光栅器,一些开源的第三方组件(例如 Rhino),还有一些其他小部件,例如额外的文档或第三方字体。未来,我们的意图是公开发布 Oracle JDK 的所有部分,除了我们认为是商业功能的部分,例如 JRockit Mission Control(尚未在 Oracle JDK 中提供),并且使用开源替代品来取代受限制的第三方组件,以实现更接近代码基础的平衡。

JDK 11 更新

Donald Smith 的一篇文章试图澄清 Oracle JDK 和 Oracle 的 OpenJDK 之间的区别:https://blogs.oracle.com/java-platform-group/oracle-jdk-releases-for-java-11-and-later

正如 @Alan Evangelista 在评论中提到的,Java Web Start 已在 Java SE 9 中被 Oracle 废弃,并在 Java SE 11 中被移除。


2
@alain.janinm,你会选择OracleJDK还是OpenJDK进行开发? - Pacerier
1
请告诉我以下内容是否正确:基本上没有真正的Java应用程序可以在没有JRE的情况下运行。因此,所有下载(也许除了一些针对开发人员的奇特东西)都包含JVM和JRE(如果不是超集JDK)? - Mads Skjern
8
是的,你需要一个JRE才能运行Java应用程序。但是当你下载一个Java应用程序时,它并没有附带JRE,而是期望你已经在计算机上安装了一个。 - alain.janinm
1
@alain.janim 尽管Oracle尚未更新https://www.oracle.com/technetwork/java/javase/tech/index-jsp-140763.html,但Java Web Start已从Java 11的Oracle JRE中删除。更新您的答案会很好。参考:https://en.wikipedia.org/wiki/Java_Web_Start - Alan Evangelista
谢谢@AlanEvangelista,我已经更新了这个答案。如有需要,请随意编辑! - alain.janinm
显示剩余2条评论

109

JVM是Java虚拟机,它实际上运行Java字节码。

JRE是Java运行环境,其中包含JVM等内容,是运行Java程序所需的基本组件之一。

JDK是Java开发工具包,它包含了JRE以及javac(编译Java源代码所需的工具)和其他编程工具。

OpenJDK是一个特定的JDK实现。


3
可能是因为你没有提到JVM中包含的“其他内容”。它们是什么?这篇文章是否完全回答了这个问题 - http://www.javabeat.net/what-is-the-difference-between-jrejvm-and-jdk/。 - Erran Morad
1
OpenJDK 包含了 JVM,这是 JVM 规范的实现之一。Oracle JDK 包含了另一种 JVM 规范的实现。 - Akh

52

JDK (Java Development Kit)

Java开发工具包包含用于开发Java程序所需的工具和运行程序所需的JRE。这些工具包括编译器(javac.exe)、Java应用启动器(java.exe)、Appletviewer等。

编译器将Java代码转换为字节码。Java应用启动器打开JRE,加载类,并调用其主方法。

如果你想自己编写程序并进行编译,则需要JDK。对于运行Java程序,只需要JRE即可。

JRE用于执行Java文件。

JRE = JVM + Java包类(如util、math、lang、awt、swing等)+运行时库。

JDK主要用于Java开发。也就是说,你可以创建一个Java文件(借助Java包),编译一个Java文件和运行一个Java文件。

JRE (Java Runtime Environment)

Java运行时环境包含JVM、类库和其他支持文件。它不包含任何开发工具,如编译器、调试器等。实际上,JVM运行程序,并使用JRE中提供的类库和其他支持文件。如果你想运行任何Java程序,需要在系统中安装JRE。

Java虚拟机提供了一种平台无关的执行代码的方式; 这意味着在任何机器上只需编译一次,即可在任何地方运行它(任何机器)。

JVM (Java Virtual Machine)

我们都知道当我们编译一个Java文件时,输出不是“exe”,而是“.class”文件。“.class”文件包含JVM可以理解的Java字节码。Java虚拟机根据底层操作系统和硬件组合将字节码解释成机器码。它负责所有事情,如垃圾收集、数组边界检查等... JVM是平台相关的。

JVM之所以被称为“虚拟”,是因为它提供了一种机器接口,不依赖于底层操作系统和机器硬件架构。这种与硬件和操作系统的独立是Java程序“编写一次,到处运行”的价值观的基石。

存在不同的JVM实现。它们可能在性能、可靠性、速度等方面有所不同。这些实现将在Java规范未指定如何实现功能的领域中有所区别,例如垃圾收集进程的工作方式取决于JVM,Java规范没有定义任何特定的方法来执行此操作。


25

Java虚拟机(JVM)是一种能够执行Java ByteCode的虚拟机,它是Java软件平台的代码执行组件。

Java开发工具包(JDK)是Oracle Corporation推出的面向Java开发者的产品。自Java问世以来,它一直是最广泛使用的Java软件开发工具包(SDK)。

Java运行环境,也称为Java Runtime或Runtime Environment。

OpenJDK(Open Java Development Kit)是Java编程语言的一个免费、开源实现。它是Sun Microsystems于2006年发起的一个努力的结果。该实现在GNU通用公共许可证(GPL)下获得许可,但有链接例外。


很好的回答,但需要澄清一下。除了Oracle之外,其他公司也会生产JDK - 例如IBM为AIX和z/OS,HP为HP-UX等。 - Trent Gray-Donald

20

JVM 是Java代码运行的虚拟机。

JRE 是运行Java应用程序所需的环境(标准库和JVM)。

JDK 是带有开发人员工具和文档的JRE。

OpenJDK 是JDK的开源版本,与Oracle拥有的常见JDK不同。


16

JDK(Java开发工具包):

  • 包含开发Java程序所需的工具。
  • 如果您想编写自己的程序并将其编译,您需要JDK。
  • JDK主要面向Java开发。

JRE(Java运行时环境)

Java运行时环境包含JVM、类库和其他支持文件。JRE旨在执行Java文件。

JVM(Java虚拟机)

JVM根据底层操作系统和硬件组合将字节码解释为机器码。它负责所有事情,如垃圾收集、数组边界检查等。Java虚拟机提供了一种平台无关的执行代码的方式。


6

JDK - 将Java编译成字节码。包含调试器、编译器等。

javac file.java // Is executed using JDK

JVM - 执行字节码。JVM是使Java平台独立的关键所在。但是不同的平台有不同的JVM。

JRE - JVM和Java运行时库一起执行Java程序。


5

Java是一种编程语言,具有严格和强类型的语法。

Java 2 Platform, Standard Edition,也称为J2SE,是一个平台,其中包括java.lang和java.io等包中的类。这是Java应用程序构建的基石。

Java虚拟机(JVM)是运行已编译Java代码的软件虚拟机。由于已编译的Java代码仅是字节码,因此JVM负责在运行之前将该字节码编译为机器码。(这通常称为即时编译器或JIT编译器。)JVM还负责内存管理,使应用程序代码不必担心。

Java开发工具包(JDK)是Java开发人员用于创建Java应用程序的软件。它包含Java语言编译器、文档生成器、用于处理本地代码的工具以及(通常)平台的Java源代码,以启用调试平台类。

Java运行时环境(JRE)是最终用户下载以运行已编译Java应用程序的软件。它包括JVM,但不包含JDK捆绑的任何开发工具。然而,JDK包含JRE。


5
  1. 开发人员使用JDK进行开发,首先编写.java源代码
  2. 开发人员调试代码并在JRE中将代码编译为.class字节码可执行文件
  3. 可执行文件由JVM执行,将字节码转换为本地机器代码,机器可以执行

enter image description here

这是它们的关系:

enter image description here

参考:
Java JDK,JRE和JVM


4

JVM : Java虚拟机的规范描述了运行Java程序的资源和方式。它实际上执行字节码并使Java平台独立。在执行此操作时,对于不同的平台,它是不同的。Windows的JVM无法像UNIX的JVM那样工作。

JRE : JVM的实现(JVM +运行时库)。

JDK : JRE + Java编译器和其他构建Java程序所需的基本工具。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接