现在的位置: 首页 > 综合 > 正文

JDK,JRE,JVM的区别与联系

2018年06月05日 ⁄ 综合 ⁄ 共 2204字 ⁄ 字号 评论关闭

很多朋友跟我一样,已经使用Java开发很久了,可是对JDK,JRE,JVM这三者的区别与联系一直都是模模糊糊的,下面我们来总结一下。

JDK

Java Development ToolKit(Java开发工具包)。JDK是整个Java的核心,包括了Java运行环境(Java Runtime Environment),一堆Java工具(javac/java/jdb)和Java基础类库(即Java API包括rt.jar)。最流行的JDK是sun公司发布的JDK,除了sun之外,还有好多公司和组织都开发了属于自己的JDK,例如国外的IBM和国内的淘宝都已经开发了属于自己的JDK,他们这样做主要是为了适应自己的需求,比如IBM的JDK据说运行效率就比sun的JDK要高得多,但不管怎么说,我们还是需要先把基础的sun
JDK掌握好。

JDK一共有三个版本:

J2SE,standard edition,标准版,是我们通常用的一个版本。

J2EE,enterprise edition,企业版,使用这种JDK开发J2EE应用程序。

J2ME,micro edition,微型版,主要用于移动设备、嵌入式设备上的Java应用程序。

我们来看一下JDK的安装目录,在目录下面有六个文件夹、一个是src类库源码压缩包、和其他几个声明文件。其中,真正在运行Java时起作用的是以下四个文件夹:bin,include,lib,jre。现在我们可以看出这样一个关系,JDK包含JRE,其实还有另外一个关系就是JRE包含JVM。下面是JDK的目录结构:

bin:最主要的是编译器(javac.exe)

include:java和jvm交互用的头文件

lib:类库

jre:java运行环境

注:这里的bin,lib文件夹和jre里面的bin,lib是不同的。总的来说JDK是用于Java程序开发的,而JRE则是只能运行class而没有编译的功能。另外想Eclipse、idea等IDE都有自己的编译器而不是JDK bin目录中自带的,在安装时,只选中JRE的路径就可以了。

我们通常用JDK来指代Java API,Java API是Java的应用程序接口,其实就是前辈们写好的一些Java class,包括一些重要的语言结构以及基本的图形,网络和文件IO等等,我们在自己的程序中调用前辈们写好的这些class,来作为我们自己开发的一个基础。当然,现在已经有越来越多的性能更好的或者功能更加强大的第三方类库来供我们使用。

JRE

Java Runtime Environment(Java 运行时环境)。也就是我们所说的Java平台,所有的程序都要在JRE下才能运行。包括JVM和Java核心类库和支持文件。与JDK相比,它不包含开发工具----编译器、调试器和其他工具。JRE是Java运行环境,光有JVM还不能完成class的执行,因为在解释class的时候JVM需要调用解释所需要的类库lib。在JDK安装目录里你可以找到JRE目录,里面有两个文件夹bin和lib,在这里可以简单的认为bin就是JVM,lib则是JVM工作时所需要的类库,而JVM和lib合起来就称为JRE。JRE是运行Java程序必不可少的,JRE的地位就像一台PC机一样,我们写好的win32应用程序需要操作系统帮我们运行,同样的,我们编写的Java程序也必须要有JRE才能运行。JRE里面有一个JVM,JRE与具体的CPU结构和操作系统有关,我们从sun下载JRE的时候就看到了不同的版本,同JVM一起组成JRE的还有一些API(如awt,swing等)。

JVM

Java virtual Machine(Java虚拟机)。JVM是JRE的一部分,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算功能来实现的。JVM有自己完善的硬件架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。JVM的主要工作是解释自己的指令集(即字节码)并映射到本地的CPU的指令集或OS的系统调用。JAVA语言是跨平台运行的,其实就是不同的操作系统,使用不同的JVM映射规则,让其与操作系统无关,完成了跨平台性,JVM对上层的Java源文件是不关心的,它关注的是由源文件生成的类文件(class
file),类文件的组成包括JVM指令集,符号表以及一些辅助信息。

下图很好的表明了JDK,JRE,JVM三者之间的关系:

Java的口号是"write once,Run anywhere"正是建立在JRE的基础上的,在Java应用程序和操作系统之间增加了虚拟层——JRE。程序源代码不是直接编译——>链接成机器代码【传统的编译方法,生成的机器代码不可避免的根据特定的操作系统和特定的机器结构相关】,而是先转换为字节码这种特殊的中间形式,字节码再转换成机器码或系统调用【Java 程序的字节码可以放到任意装有JRE的计算机运行,再由不同的JRE将他们转换成相应的机器代码,这就实现了Java程序的可移植性】

我们开发的实际情况是:我们利用JDK(调用Java API)开发了属于我们自己的Java程序后,通过JDK中的编译程序(javac)将我们的Java文件编译成Java字节码,在JRE上运行这些Java字节码,映射到CPU指令集或OS的系统调用。

原文来自:http://java-mzd.iteye.com/blog/838514

抱歉!评论已关闭.