编者按:这个问题是在2009年提出的,当时的世界不同。2022年,标准的开源OpenJDK仅限JDK。
JDK和JRE有什么区别?
他们的角色是什么,我应该什么时候使用一个或另一个?
JRE就是Java运行环境。它包含了运行已编译Java程序所需的一切,包括Java虚拟机(JVM)、Java类库、java命令和其他基础设施。但是,它不能用于创建新程序。
java
JDK是Java开发套件,用于Java的全功能SDK。它包含JRE所拥有的一切,但也包含编译器(javac)和工具(如javadoc和jdb)。它能够创建和编译程序。
javac
javadoc
jdb
通常,如果你只关心在计算机上运行Java程序,你只会安装JRE。这就是你所需要的。另一方面,如果你打算做一些Java编程,你需要安装JDK。
有时,即使您不打算在计算机上进行任何Java开发,您仍然需要安装JDK。例如,如果您使用JSP部署Web应用程序,从技术上讲,您只是在应用服务器内运行Java程序。那么为什么需要JDK呢?因为应用服务器将JSP转换为Javaservlet,需要使用JDK来编译servlet。我相信还有更多示例。
上面的答案(巴勃罗)是非常正确的。这只是额外的信息。
顾名思义,JRE是环境。它基本上是一堆包含Java相关文件的目录,即:
bin/
javaw
keytool
policytool
conf/
lib/
.jar
modules
.class
.dll
.dylib
.so
JDK也是一组目录。它是JRE的超集,有一些补充:
jar
jshell
jmods/
jlink
从官方java网站…
JRE(Java运行时环境):
JDK(Java开发套件)
从调试的角度来看有一个区别:
要调试到Java系统类,例如String和ArrayList,您需要一个特殊版本的JRE,它使用“调试信息”进行编译。JDK中包含的JRE提供了此信息,但常规JRE没有。常规JRE不包含此信息以确保更好的性能。
什么是调试信息?以下是来自这篇博客文章的快速解释:
现代编译器可以很好地转换高级代码,它有很好的缩进和嵌套的控制结构,可以将任意类型的变量转换成一大堆称为机器代码(Java情况下是字节码)的位,唯一的目的是在目标CPU(JVM的虚拟CPU)上尽可能快地运行。Java代码被转换成多个机器代码指令。变量被推到各个地方——进入堆栈,寄存器,或者完全优化掉。生成的代码中甚至不存在结构和对象,它们只是一个抽象将其转换为硬编码偏移到内存缓冲区中。 那么,当您要求调试器在某个函数的入口中断时,调试器如何知道在哪里停止?当您要求它提供变量的值时,它如何找到要向您显示的内容?答案是-调试信息。 调试信息由编译器和机器代码一起生成。它是可执行程序和原始源代码之间关系的表示。这些信息被编码成预定义的格式,并与机器代码一起存储。多年来,针对不同的平台和可执行文件发明了许多这样的格式。
现代编译器可以很好地转换高级代码,它有很好的缩进和嵌套的控制结构,可以将任意类型的变量转换成一大堆称为机器代码(Java情况下是字节码)的位,唯一的目的是在目标CPU(JVM的虚拟CPU)上尽可能快地运行。Java代码被转换成多个机器代码指令。变量被推到各个地方——进入堆栈,寄存器,或者完全优化掉。生成的代码中甚至不存在结构和对象,它们只是一个抽象将其转换为硬编码偏移到内存缓冲区中。
那么,当您要求调试器在某个函数的入口中断时,调试器如何知道在哪里停止?当您要求它提供变量的值时,它如何找到要向您显示的内容?答案是-调试信息。
调试信息由编译器和机器代码一起生成。它是可执行程序和原始源代码之间关系的表示。这些信息被编码成预定义的格式,并与机器代码一起存储。多年来,针对不同的平台和可执行文件发明了许多这样的格式。
JDK是JRE的超集,包含JRE中的所有内容,以及开发小程序和应用程序所需的编译器和调试器等工具。JRE提供了库、Java虚拟机(JVM)和其他组件来运行用Java编程语言编写的小程序和应用程序。
JRE
JRE是Java运行时环境的首字母缩写。它用于提供运行时环境。它是JVM的实现。它实际存在。它包含一组库+JVM在运行时使用的其他文件。
JDK
JDK是Java开发工具包的缩写。它实际存在。它包含JRE+开发工具。
链接:-http://www.javatpoint.com/difference-between-jdk-jre-and-jvm
通常,当您只关心在浏览器或计算机上运行Java程序时,您将只安装JRE。这就是您所需要的全部。另一方面,如果您计划进行一些Java编程,您还需要JDK。
这是一个直接来自Oracle的简单响应http://docs.oracle.com/javase/7/docs/technotes/guides/
JavaSE运行时环境(JRE)
JRE提供了运行用Java编程语言编写的小程序和应用程序所需的库、Java虚拟机和其他组件。这个运行时环境可以与应用程序一起重新分发,使它们成为独立的。
JavaSE开发套件(JDK)
JDK包括JRE以及命令行开发工具,例如编译器和调试器,这些工具对于开发小程序和应用程序是必要或有用的。
JVM(Java虚拟机)是一种抽象机器,它是提供Java字节码运行环境的规范。
JRE是Java运行时环境的首字母缩写。它用于提供运行时环境。它是JVM的实现。它实际存在。它包含一组库+JVM在运行时使用的其他文件
JDK是Java开发工具包的首字母缩写。它物理上存在。它包含JRE+开发工具
如果要运行Java程序,但不开发它们,请下载Java运行时环境或JRE。如果要开发它们,请下载Java开发工具包或JDK
让我们称之为JDK是一个工具包,其中包括开发和运行Java应用程序所需的东西。
JDK作为构建应用程序、组件和小程序的开发环境。
它包含以编译形式运行Java应用程序所需的一切。您不需要任何库和其他东西。您需要的所有东西都已编译。
JRE不能用于开发,只能用于运行应用程序。
通俗地说:JDK是祖父JRE是父亲,JVM是他们的儿子。[即JDK>JRE>JVM]
JDK=JRE+开发/调试工具JRE=JVM+Java软件包类(如util,数学,lang,awt等)+运行时库。JVM=类加载器系统+运行时数据区域+执行引擎。
JDK=JRE+开发/调试工具
JRE=JVM+Java软件包类(如util,数学,lang,awt等)+运行时库。
JVM=类加载器系统+运行时数据区域+执行引擎。
换句话说,如果你是一个Java的程序员,你的系统中需要JDK,这个软件包也将包括JRE和JVM,但如果你是一个喜欢玩在线游戏的普通用户,那么你只需要JRE,这个软件包中不会有JDK。
JVM:
Java虚拟机(JVM)是运行Java字节码的虚拟机。JVM不理解Java源代码,这就是为什么编译*. java文件以获取包含JVM可以理解的字节码的*. class文件。它也是允许Java成为“可移植语言”(编写一次,在任何地方运行)的实体。事实上,JVM有针对不同系统的特定实现(Windows、Linux、MacOS,参见维基百科列表…),目的是使用相同的字节码它们都给出相同的结果。
JDK和JRE
要解释JDK和JRE之间的区别,最好是阅读Oracle留档并查阅图表:
Java运行时环境(JRE)
0#提供了库、Java虚拟机和其他组件来运行以Java编程语言编写的小程序和应用程序。此外,JRE还包括两项关键部署技术:Java插件,它使小程序能够在流行的浏览器中运行;JavaWeb Start,它通过网络部署独立的应用程序。它也是用于企业软件开发和部署的Java2平台企业版(J2EE)中技术的基础。JRE不包含用于开发小程序和应用程序的工具和实用程序,如编译器或调试器。
Java开发套件(JDK)
JDK是JRE的超集,包含JRE中的所有内容,以及开发小程序和应用程序所需的编译器和调试器等工具。
请注意,Oracle并不是唯一提供JDK的公司。
JIT编译过程(礼貌:Oracle留档)
jdk是编译为代码并将java代码转换为字节码所必需的,而jre是执行字节码所必需的。
JDK和JRE的区别在于JDK是Java的第三方开发工具,而JRE是运行程序的地方。
假设,如果您是开发人员,那么您的角色是开发程序和执行程序。因此,您必须拥有由JDK提供的开发和执行环境。
假设,如果你是一名客户端,那么你不必担心开发。你只需要一个JRE提供的仅运行程序并获取结果的环境。
JRE执行应用程序,但JVM逐行读取指令,因此它是解释器。
JDK=JRE+开发工具
JRE=JVM+库类
清楚地了解这些术语(JVM、JDK、JRE)对于掌握它们的用法和差异至关重要。
JVMJava虚拟机(JVM)是一个执行Java字节码的运行时系统。JVM就像一台虚拟计算机,可以执行一组编译的指令并操作内存位置。当Java编译器编译源代码时,它会在. class文件中生成一组高度优化的指令集,称为字节码。JVM解释这些字节码指令并将它们转换为机器特定的代码来执行。
JDKJava开发工具包(JDK)是一种软件开发环境,您可以使用它来开发和执行Java应用程序。它包括JRE和一组编程工具,例如Java编译器、解释器、应用程序查看器和文档查看器。JDK通过JavaSE、JavaEE或JavaME平台实现。
JREJava运行时环境(JRE)是JDK的一部分,包括JVM、核心类和几个支持应用程序开发的库。虽然JRE是JDK的一部分,但您也可以单独下载和使用它。
对于完整的理解,你可以看到我的博客:Jdk Jre Jvm和差异
如果您是Java程序员,您将需要系统中的JDK,并且此软件包还将包括JRE和JVM,但如果您是普通用户喜欢玩在线游戏,那么您只需要JRE,并且此软件包中没有JDK。
JVM JVM(Java虚拟机)是一个抽象的机器提供运行时环境的规范,其中java字节码可以执行。 JVM可用于许多硬件和软件平台。JVM、JRE和JDK依赖于平台,因为每个操作系统的配置不同的。但是,Java是平台独立的。 JRE 它包含了运行编译Java应用程序所需的一切形式。你不需要任何图书馆和其他东西。所有你需要的东西需要编译。 JRE不能用于开发,只能用于运行应用程序。 JavaSE开发套件(JDK) JDK包括JRE以及命令行开发工具,例如开发所必需或有用的编译器和调试器小程序和应用程序。
JVM
JVM(Java虚拟机)是一个抽象的机器提供运行时环境的规范,其中java字节码可以执行。
JVM可用于许多硬件和软件平台。JVM、JRE和JDK依赖于平台,因为每个操作系统的配置不同的。但是,Java是平台独立的。
它包含了运行编译Java应用程序所需的一切形式。你不需要任何图书馆和其他东西。所有你需要的东西需要编译。
JDK包括JRE以及命令行开发工具,例如开发所必需或有用的编译器和调试器小程序和应用程序。
(来源:GeeksForGeeks Q&A,Java平台概览)
JVM、JRE、JDK——这些都是Java语言的骨干。每个组件单独工作。JDK和JRE物理上存在,但JVM是一台抽象机器,这意味着它不存在。
JVM是JDK和JRE的子系统,用于检查被称为“字节码”的中间代码。它首先通过JVM子系统类加载器加载由Java编译器(javac)生成的“类文件”(扩展名为. c)并根据它们的使用分类内存位置(类区域、堆栈、堆和pc寄存器)。然后检查所有字节码以确保它是在Java返回以及网络对所有内存的可访问性。解释器的工作之后开始,它逐行检查整个程序。结果最终通过运行时设施的JRE(Java运行时环境)显示在控制台/浏览器/应用程序中。
JRE也是JDK的一个子系统,它提供JVM、类、. jar文件等可执行文件等运行时设施。
JDK代表Java开发工具包。它包含Java编程中使用的所有必要组件,例如类、方法、摇摆、AWT、软件包、Java(解释器)、javac(编译器)、Applet查看器(小程序应用程序查看器)等。总而言之,它包含开发应用程序所需的每个文件,无论是独立的还是基于Web的。
JDK包括JRE plus命令行开发工具,例如编译器和调试器,这些工具对于开发小程序和应用程序是必要或有用的。
JRE基本上是运行Java程序的Java虚拟机。它还包括用于Applet执行的浏览器插件。
JDK是一个抽象机器。它是提供可以执行java字节码的运行时环境的规范。
所以,基本上JVM
简单地说:
JVM是虚拟机Java代码执行
JRE是运行Java应用程序所需的环境(标准库和JVM)
JDK是带有开发工具和留档的JRE
JVM、JRE和JDK依赖于平台,因为每个操作系统的配置不同。但是,Java是独立于平台的。
Java虚拟机(JVM)是执行Java字节码的运行时系统。
JRE是运行Java应用程序所需的环境(标准库和JVM)。
JRE是Java运行时环境的首字母缩写。它用于提供运行时环境。它是JVM的实现。它物理存在。它包含一组库+JVM在运行时使用的其他文件。
除了Sun Micro Systems之外,其他公司也在积极发布JVM的实现。