经过深入分析,这是我对JDK,JRE和JVM的理解。 如果我错了,请纠正我......
答案 0 :(得分:5)
你几乎就在那里。我只是建议如下:
JVM是JRE的子集,JRE是JDK的子集。
这很公平。 JVM(Java Virtual Machinve)包含在JRE(Java运行时环境)中以运行字节码(.class文件)。如果您下载整个JDK(Java开发工具包),其中还包括编译器等开发工具,则包含JRE。
JVM用于通过使用JRE将字节代码(* .class)转换为目标代码(机器代码)。
基本上,是的。 JVM执行字节码,此过程的一部分涉及将其转换为机器代码。您需要一个JDK来将.java文件(源代码)编译成.class文件(字节码),以便它可以在JVM上执行。
JRE有操作系统(OS)指定DLL,JVM使用它来进行对象代码转换。
JVM在执行字节代码时,有一个JIT(即时)编译器,可将与平台无关的字节代码转换为特定于平台的机器代码。在Windows中,这将包含在DLL中,是的。 JRE中还包括本机方法的特定于操作系统的实现,例如java.lang.Object
中声明的那些。
如果明天假设任何新操作系统将启动,则当前可用的JRE可能不支持JVM以获取字节代码以进行机器代码转换。因此,JRE可能需要加强对即将推出的新操作系统的支持。
是的,如果它是一个全新的操作系统,则需要JVM的本机实现。但是,您可以在这个新操作系统上编译OpenJDK。
所以从上面我的分析我得出的结论就像JVM对于所有操作系统都是通用的,但是JRE有特定于操作系统的DLL,在字节代码到目标代码转换期间,JVM将使用它。
我不会说JVM对所有操作系统都是通用的,而不是每个主流操作系统都有JRE(因此也就是JVM)实现。这些操作系统原生的JVM将在执行与操作系统无关的Java字节代码时使用特定于操作系统的库。
答案 1 :(得分:4)
JVM是虚拟的,您可以将其视为机器代码为Java字节码的虚拟计算机。它不是真正的计算机,而是可以执行Java字节码指令的虚拟计算机。
JRE是JVM实现。该实现是特定于操作系统的(当然),但它提供独立于操作系统的外部接口(意味着您可以在Windows JRE和Linux JRE上运行相同的Java代码)。从90年代后期开始,这就是“一次编写一次运行”的事情。
JDK是编写Java代码所需的编译器,JRE,其他工具和所有Java API。
我不想将Android及其Dalvik VM添加到图片中(虽然我可以画出一些有趣的相似之处),因为我会更加困惑你。
答案 2 :(得分:2)
让我们描述一下:
JVM :Java虚拟机。这基本上是一个应用程序,一个特定于操作系统的二进制文件。这个二进制文件读取.class文件并解释字节码或将其编译为机器代码并执行它。
Java API :这是程序员可以使用的很多代码。基本功能,如HashSets,List等。这些代码中的一些可能是特定于操作系统的,例如java.lang.Math中。其中大多数是独立的并保存为字节码
JRE :Java Runtime Environment是JVM,Java API和一些实用程序的捆绑包。完整的捆绑包是特定于操作系统的。它面向想要运行Java应用程序的人
JDK :Java Development Kit是一个JRE加上编译器(源代码到字节码)和开发Java应用程序所需的工具
如果您正在谈论JRE / JDK,则不应将其与JVM放在同一级别。
答案 3 :(得分:1)
http://docs.oracle.com/javase/7/docs/technotes/guides/index.html#jre-jdk
JRE和JDK Oracle提供了两个主要的软件产品 Java™平台,标准版(Java™SE)系列:
Java SE运行时环境(JRE)
JRE 提供库,Java虚拟机等 运行applet和应用程序所需的组件 在Java编程语言中。这个运行时环境可以 通过申请重新分配,使他们独立。
Java SE开发工具包(JDK)
JDK 包括 JRE加上命令行开发工具,如 编译器和调试器,对于开发是必要或有用的 小应用程序和应用程序。
Java虚拟机
Java虚拟机是一个抽象计算机器,具有 指令集并在运行时操作内存。 Java虚拟 机器被移植到不同的平台以提供硬件和 操作系统独立性。
通常,JVM和JVM的实现可以互换使用。当所有各方都理解这一事实时,这是可以接受的。
答案 4 :(得分:0)
JVM 是由 bin 下的 java.exe 或 javaw.exe 启动的进程 JRE 的文件夹。 JRE 是启动java进程所需的二进制包。 JRE 不仅是特定于操作系统的,还是特定于体系结构的。