JDK、JRE和JVM的理解

3
经过深入分析,这是我对JDK、JRE和JVM的理解。 如果我有错误,请纠正...
1. JVM是JRE的子集,JRE是JDK的子集。 2. JVM用于通过使用JRE将字节码(*.class)转换为目标代码(机器代码)。 3. JRE具有操作系统(OS)指定的DLL,JVM用于将字节码转换为目标代码。 4. 如果明天有任何新的操作系统推出,那么当前可用的JRE可能不支持JVM进行字节码到机器码的转换。因此,JRE可能需要增强以支持新的即将推出的操作系统。 5. 因此,根据我的分析,我得出结论,JVM适用于所有操作系统,但JRE具有特定于操作系统的DLL,JVM在字节码到目标代码转换期间使用该DLL。

你能否将这个格式调整一下,让它更易于阅读? - jgitter
3
这里是文档,无需分析,只需阅读 http://docs.oracle.com/javase/7/docs/ - Vitaly
你似乎对“字节码转对象码”着迷。但是JVM执行字节码程序并不需要这样做,因为这是它们唯一的任务。 - Ingo
jgitter:好的,从下一篇帖子开始我会这样做的,感谢您的评论。 - Pandian
Vitaly:是的,在我的分析过程中,我已经阅读了那些文档,为了得到确认并从像您这样的专家那里获取更多信息,我已经发布了帖子。谢谢。 - Pandian
5个回答

5
您已经很接近答案了。我建议您做以下修改:

JVM是JRE的子集,而JRE是JDK的子集。

这是合理的。JVM(Java虚拟机)包含在JRE(Java运行时环境)中,用于运行字节码(.class文件)。如果您下载整个JDK(Java开发工具包),则会包含JRE,其中还包括编译器等开发工具。

JVM使用JRE将字节码(*.class)转换为对象代码(机器代码)。

基本上是这样的。JVM执行字节码并将其转换为机器代码的一部分。您需要一个JDK将.java文件(源代码)编译为.class文件(字节码),以便可以在JVM上执行。

JRE具有操作系统(OS)指定的DLL,JVM使用该DLL将字节码转换为对象代码。

当JVM执行字节码时,它具有即时编译器(JIT),将平台无关的字节码转换为特定于平台的机器代码。在Windows中,这将包含在DLL中。 JRE中还包括特定于操作系统的本地方法的实现,例如在java.lang.Object中声明的方法。

如果明天推出任何新的操作系统,则当前可用的JRE可能不支持JVM将字节码转换为机器代码。因此,可能需要增强JRE以支持新的即将推出的操作系统。

是的,如果是全新的操作系统,则需要JVM的本地实现。您可以在这个新的操作系统上编译OpenJDK。

因此,从上面的分析中我得出结论,JVM适用于所有操作系统,但JRE具有操作系统特定的DLL,JVM在字节码转换为对象代码期间将使用该DLL。

我不会说JVM适用于所有操作系统,而是对于每个主流操作系统都有一个JRE(因此也有JVM)实现。这些操作系统本地的JVM将在执行操作系统无关的Java字节码时使用特定于操作系统的库。


4
JVM是虚拟的,可以把它看作是一个虚拟计算机,其机器代码是Java字节码。它不是真正的计算机,而是一台虚拟机,可以执行Java字节码指令。
JRE是JVM的实现。实现是特定于操作系统的(当然),但提供了独立于操作系统的外部接口(例如,您可以在Windows JRE和Linux JRE上运行相同的Java代码)。这是20世纪90年代的“编写一次,随处运行”的事情。
JDK是编译器、JRE、其他工具和编写Java代码所需的所有Java API。
我不想将Android及其Dalvik VM加入到图像中(尽管我可以绘制一些有趣的类比),因为我认为会让你更加混乱。

JVM不是抽象机器,而是虚拟机器。因此是一种虚拟机。抽象机器可以在学术界找到。 - Rafael Winterhalter
是的,好的;那基本上就是我的意思。 - peter.petrov
官方定义是JRE还包括Java SE API,不仅仅是JVM。 - Radiodef
2
@Radiodef 好的。当你想要教授某人一些东西时,最好最初省略一些细节以避免分心/混淆。我的目的不是复制官方定义。这没有意义,因为它们在Oracle Java网站上已经非常详细了。 - peter.petrov
好的!我只是觉得有必要指出来。 - Radiodef
@Radiodef 当然,没问题,谢谢。你指出来很好。因为其他人(在不同的层面上)可能更喜欢你的笔记(因为它更精确,更贴近实际)。 - peter.petrov

2

让我们来描述一下:

JVM:Java虚拟机。这基本上是一个应用程序,是一个特定于操作系统的二进制文件。该二进制文件读取“.class”文件并解释字节码或将其编译为机器码并执行。

Java API:这是提供给程序员使用的大量代码。基本功能如HashSets、List等。其中一些代码可能是特定于操作系统的,例如java.lang.Math。大部分代码都是独立的,并保存为字节码。

JRE:Java运行时环境是JVM、Java API和一些实用程序的捆绑包。完整的捆绑包是特定于操作系统的。它针对想要运行Java应用程序的人。

JDK:Java开发工具包是一个JRE加上一个编译器(源代码到字节码)和开发Java应用程序所需的工具。

  1. 是的
  2. 不是,这首先是由JVM完成的
  3. 不是,JVM和JRE包含特定于操作系统的部分
  4. 是的
  5. 不是

如果您谈论JRE/JDK,您不应将其与JVM放在同一级别。


荒谬的想法:您是指JVM是JRE的一部分,它是特定于操作系统的二进制文件?您是指有特定于操作系统的JRE(JVM + API +实用程序)捆绑包吗? - Pandian
是的,由于JVM是二进制的,因此它是特定于操作系统/架构的,JRE也是如此,因为它包含JVM、二进制实用程序和Java API的部分,这些部分是本地化的。 - Absurd-Mind

1

http://docs.oracle.com/javase/7/docs/technotes/guides/index.html#jre-jdk

JRE和JDK:Oracle在Java™ Platform,Standard Edition(Java™ SE)系列中提供了两个主要的软件产品:

Java SE Runtime Environment(JRE)

JRE提供了库、Java虚拟机和其他组件,使您能够运行用Java编程语言编写的小程序和应用程序。这个运行时环境可以与应用程序一起重新分发,使它们成为独立的。

Java SE Development Kit(JDK)

JDK包括JRE和命令行开发工具,例如编译器和调试器,这些工具对于开发小程序和应用程序是必要或有用的。

Java虚拟机

Java虚拟机是一个抽象的计算机,在运行时具有指令集并操作内存。Java虚拟机被移植到不同的平台上,以提供硬件和操作系统的独立性。

通常情况下,JVM和JVM的实现是可以互换使用的。只要所有人都明白这一点,这是可以接受的。


Vitaly:从你的帖子中我不清楚JVM,请提供更多细节。 - Pandian
它明确表示JVM是一个抽象的东西,它是一个模型。JRE提供了JVM的实现。在这个层面上不需要更多的细节。如果你想了解更多关于JVM的内容,这里是它的规范链接:http://docs.oracle.com/javase/specs/jvms/se7/html/ - Vitaly

0

JVM 是由 java.exejavaw.exe 启动的进程,它存在于 JREbin 文件夹下。 JRE 是启动 Java 进程所需的必要二进制文件的捆绑包。 JRE 不仅是特定于操作系统的,还特定于架构。


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