JVM, JDK, JRE &OpenJDK吗?
我在用Java编程时遇到了这些短语,它们之间有什么区别?
JVM是Java虚拟机-它实际上运行Java字节码。
JRE是Java运行时环境——其中包含JVM,并且是运行Java程序所需要的。
JDK是Java开发工具包——它是JRE,但添加了javac(这是编译Java源代码所需的工具)和其他编程工具。
OpenJDK是一个特定的JDK实现。
JVM是执行Java代码的虚拟机
JRE是运行Java应用程序所需的环境(标准库和JVM)
JDK是带有开发人员工具和文档的JRE
OpenJDK是一个开源版本的JDK,不像Oracle拥有的普通JDK
Java虚拟机(JVM)是一个可以执行Java字节码的虚拟机。它是Java软件平台的代码执行组件。
Java开发工具包(JDK)是Oracle公司针对Java开发人员的产品。自Java引入以来,它一直是迄今为止使用最广泛的Java软件开发工具包(SDK)。
Java运行时环境,也被称为Java运行时,运行时环境
OpenJDK(开放Java开发工具包)是Java编程语言的免费开源实现。这是太阳微系统公司在2006年开始努力的结果。该实现是根据GNU通用公共许可证(GPL)许可的,有一个链接例外。
Java虚拟机 (JVM)是运行Java字节码的虚拟机。JVM不理解Java源代码;这就是为什么你需要编译你的*.java文件来获得包含JVM能理解的字节码的*.class文件。它也是允许Java成为一种“可移植语言”的实体。(写一次,到处运行)。实际上,对于不同的系统(Windows, Linux, macOS, 参见维基百科列表),有特定的JVM实现,目的是使用相同的字节码,它们都给出相同的结果。
*.java
*.class
要解释JDK和JRE之间的区别,最好是阅读甲骨文的文档并参考图:
Java运行环境(JRE) Java运行时环境(JRE)提供了库、Java虚拟机和其他组件来运行用Java编程语言编写的applet和应用程序。此外,JRE还包含两项关键的部署技术:Java Plug-in,它使applet能够在流行的浏览器中运行;以及通过网络部署独立应用程序的Java Web Start。它也是用于企业软件开发和部署的Java 2平台企业版(J2EE)技术的基础。JRE不包含用于开发applet和应用程序的编译器或调试器等工具和实用程序。 Java开发工具包(JDK) JDK是JRE的超集,包含JRE中的所有内容,以及开发小程序和应用程序所需的编译器和调试器等工具。
Java运行环境(JRE)
Java运行时环境(JRE)提供了库、Java虚拟机和其他组件来运行用Java编程语言编写的applet和应用程序。此外,JRE还包含两项关键的部署技术:Java Plug-in,它使applet能够在流行的浏览器中运行;以及通过网络部署独立应用程序的Java Web Start。它也是用于企业软件开发和部署的Java 2平台企业版(J2EE)技术的基础。JRE不包含用于开发applet和应用程序的编译器或调试器等工具和实用程序。
Java开发工具包(JDK)
JDK是JRE的超集,包含JRE中的所有内容,以及开发小程序和应用程序所需的编译器和调试器等工具。
注意,Oracle并不是唯一提供jdk的公司。
OpenJDK是JDK的开源实现,也是Oracle JDK的基础。Oracle JDK和OpenJDK之间几乎没有区别。
区别在博客中说明:
问:在OpenJDK存储库中找到的源代码和你用来构建Oracle JDK的代码有什么区别? 答:非常接近——我们的Oracle JDK版本的构建过程建立在OpenJDK 7上,只添加了几部分,比如部署代码,包括Oracle的Java Plugin和Java WebStart的实现,以及一些闭源第三方组件,比如图形光栅器,一些开源第三方组件,比如Rhino,还有一些零碎的东西,比如额外的文档或第三方字体。接下来,我们的目的是开源Oracle JDK的所有部分,除了那些我们认为是商业特性的部分,比如JRockit Mission Control(在Oracle JDK中还没有),并用开源替代方案取代负担的第三方组件,以在代码库之间实现更接近的对等。
问:在OpenJDK存储库中找到的源代码和你用来构建Oracle JDK的代码有什么区别?
答:非常接近——我们的Oracle JDK版本的构建过程建立在OpenJDK 7上,只添加了几部分,比如部署代码,包括Oracle的Java Plugin和Java WebStart的实现,以及一些闭源第三方组件,比如图形光栅器,一些开源第三方组件,比如Rhino,还有一些零碎的东西,比如额外的文档或第三方字体。接下来,我们的目的是开源Oracle JDK的所有部分,除了那些我们认为是商业特性的部分,比如JRockit Mission Control(在Oracle JDK中还没有),并用开源替代方案取代负担的第三方组件,以在代码库之间实现更接近的对等。
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已被Oracle在Java SE 9中弃用,并在Java SE 11中删除。
另一个值得一提的方面是:
JDK (java开发工具包)
正如名称所示,您将需要它用于开发目的。
例如:一家软件公司会在他们的计算机中安装JDK,因为他们需要开发新的软件,其中包括编译和运行他们的Java程序。
因此我们可以说JDK = JRE + JVM。
JRE (java运行时环境)
运行Java程序需要它。你不能用它来编译Java程序。
例如:一个普通的计算机用户想要运行一些在线游戏,那么他的系统中就需要JRE来运行Java程序。
java虚拟机
你可能知道它运行字节码。它使Java平台独立,因为它执行你编译Java程序后得到的.class文件,而不管你是在Windows、Mac还是Linux上编译它。
.class
开放的JDK
就像我上面说的。现在JDK是由不同的公司制作的,其中一个是开源的,免费供公众使用的是OpenJDK,而其他一些是Oracle公司的jrocit JDK或IBM JDK。
然而,对于普通用户来说,它们可能都是一样的。
结论
如果你是一个Java程序员,你的系统中需要JDK,这个包将包括JRE和JVM,但如果你是一个喜欢玩在线游戏的普通用户,那么你只需要JRE,这个包中没有JDK。
换句话说,JDK是祖父,JRE是父亲,JVM是他们的儿子。
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
JVM (Java虚拟机)
正如我们都知道的,当我们编译一个Java文件时,输出不是一个“exe”,而是一个“。class”文件。' .class '文件由JVM可以理解的Java字节代码组成。Java虚拟机根据底层操作系统和硬件组合将字节码解释为机器代码。它负责所有的事情,比如垃圾收集、数组边界检查等等……JVM依赖于平台。
JVM之所以被称为“虚拟的”,是因为它提供了一个不依赖于底层操作系统和机器硬件体系结构的机器接口。这种独立于硬件和操作系统的特性是Java程序“一次编写、随处运行”价值的基石。
有不同的JVM实现。它们可能在性能、可靠性、速度等方面有所不同。这些实现的不同之处在于Java规范没有提到如何实现这些功能,比如垃圾收集过程的工作方式是依赖于JVM的,Java规范没有定义任何具体的方法来做到这一点。
JDK (Java开发工具包):
JRE (Java运行时环境)
Java运行时环境包含JVM、类库和其他支持文件。
JVM 将字节码解释为机器代码取决于底层操作系统和硬件组合。它负责所有的事情,比如垃圾收集、数组边界检查等等……Java虚拟机提供了一种平台独立的代码执行方式。
JVM:这实际上意味着字节码解释器。它依赖于平台。例如:在Windows平台中,'java.exe'或'javaw.exe'进程是jvm进程。
JDK:是一个包含必要的库和工具来开发和执行java程序/应用程序的工具包
JRE:是java应用程序的执行环境。即,它只支持运行时依赖,包括JVM编译程序。如果我们想编译一个java程序,我们需要jdk。
Java是一种语言,它包含严格的强类型语法。
Java 2平台标准版,也称为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。
JVM Java虚拟机,实际执行Java字节码。 它是JAVA平台上的执行块。它将字节码转换为机器代码
JRE Java运行时环境,提供了执行Java应用程序的最低要求;它由Java虚拟机(JVM)、核心类和支持文件组成。
JDK Java开发工具包,它有所有的工具来开发你的应用软件。它是JRE+JVM
开放的JDK是Java平台的免费开源实现。
通俗地说:- JDK = JRE +开发/调试工具,其中JDK是我们与Java一起工作的完整包,从创建编译到运行它。另一方面,JRE只是代码(字节码)的运行。
注意:-无论我们是安装JDK还是JRE, JVM都会与这两个包捆绑在一起,JVM是JIT编译器将字节代码转换为机器特定代码的部分。
请阅读JDK,JRE,JVM和JIT上的文章
JVM
JRE
JRE是Java运行时环境的首字母缩写。它用于提供运行时环境。它是JVM的实现。它是物理存在的。它包含一组库+ JVM在运行时使用的其他文件。
JDK
JDK是Java Development Kit的首字母缩写。它是物理存在的。它包含JRE +开发工具。
链接:- http://www.javatpoint.com/difference-between-jdk-jre-and-jvm
JDK -将java编译为字节码。由调试器,编译器等组成。
javac file.java // Is executed using JDK
JVM -执行字节代码。JVM使java平台独立。但是JVM因平台而异。
JRE - JVM与java运行时库一起执行java程序。
JVM:描述运行java程序的方式/资源的规范。实际执行字节代码,使java平台独立。在这个过程中,不同的平台是不同的。windows的JVM不能像UNIX的JVM那样工作。
JRE: JVM实现。(JVM +运行时库)
JDK: JRE + java编译器和其他基本工具来从头构建java程序
JDK:你需要编写和运行java代码的完整包
OpenJDK:一个独立的JDK实现,使它更好
JVM:将Java代码转换为字节码,并提供说明如何编译、加载、验证、检查错误和执行Java代码的规范。
JRE: JVM的实现,一些Java库被用来运行程序
JVM: java的虚拟机。告诉机器用Java代码做什么。不能按原样下载JVM。它被打包在其他组件中。
JRE:上面提到的其他组件是JRE。 它是JVM+其他jar创建运行时环境
JDK:包含JRE(JRE又包含JVM)。获得JDK后,不需要分别安装JRE和JVM。它包含编译器,编译你的.java文件到.class文件
JRE执行应用程序,但JVM逐行读取指令,因此它是解释器。
JDK = JRE +开发工具
JRE = JVM +库类
OpenJDK OpenJDK是sun JDK的开源版本。Oracle JDK是Sun的官方JDK。
总而言之:
如果你想用java开发,你需要JDK,但如果你只想运行java,你需要JRE。
他们的关系如下:
JDK -像javac这样的工具用于编译 *.java文件到*.class字节码文件(主要用于开发Java程序)
javac
JRE - 运行 *.jar文件的工具(基本上运行Java程序)
JVM -工具编译 *.class文件可执行机器码(运行所有Java字节码)
OpenJDK只是Java JDK的一个发行版。
简单的图片来说明JDK、JRE、JDK。
JDK一般来说,这将只安装在开发设置,如在开发人员,实时的QA系统在公司。在服务器上运行的原始代码将没有JDK。
JRE是JDK的一部分,也可以独立安装在服务器上。在处理用户请求的实时服务器中,只安装JRE和开发人员开发的代码(*.class格式)
开发人员开发的代码>在开发机器中测试和执行。执行阶段需要Java的媒介。
.class文件不是本机代码 (cpu能理解的代码)。如果.java文件直接转换为本机代码,则无法实现WORA(一次编写,随处运行)的概念。
本机代码因操作系统而异。因此,Java创建了一个名为.class的中间文件和一个名为“JVM"的神奇程序。将.class转换为本机代码是JVM的职责。