很多Java的程序员在写了很多代码之后,你问他JRE和JDK是是什么关系,JVM又是什么东西,他是不知道的。

JVM(Java Virtual Machine)

Java 虚拟机。它只认识 xxx.class 这种类型的文件,它能够将 class 文件中的字节码指令进行识别并调用操作系统向上的 API 完成动作。所以说,JVM 是 Java 能够跨平台的核心。

JRE (Java Runtime Environment)

Java 运行时环境。它主要包含两个部分,JVM的标准实现和 Java 的一些基本类库。它相对于 JVM来说,多出来的是一部分的 Java 类库。

JDK (Java Development Kit)

Java 开发工具包。JDK 是整个 Java 开发的核心,它集成了 JRE 和一些好用的小工具,例如javac.exe、java.exe、jar.exe 等。

显然这三者的关系是一层层的嵌套关系,即JDK > JRE > JVM。

为什么我们的电脑在装完JDK后会有两个版本的JRE?

留心的同学可能会发现,我们的JDK在安装成功后,在C:\Program Files\Java目录会是这样的(这里,我是装的JDK1.8的版本):

在Java根目录下有个JRE,在JDK目录下也有个JRE,那么这两个JRE之间有关系嘛?答案是没有的。甚至准确的来说,它俩是一样的,无论是用哪一个都是可以的。只是很多人习惯将会单独安装另一个JRE,虽然单独安装的JRE也并没有被使用,原因可能就是刚开始大家都不清楚JDK和JRE之间的关系,所以就默认的都安装上了。

在JDK的bin目录下,基本上都是一些可执行文件,并且它们还不大。其实这些可执行文件只是外层的一层封装而已,这样的目的是避免输入的命令过长。例如javac.exe内部调用的其实是JDK中lib目录中的tools.jar中com.sun.tools.javac.Main类,也就是说这些工具只是入口而已。而实际上它们本身又都是由Java编写的,所以在JDK目录下的JRE既提供了这些工具的运行时环境,也提供了我们编写完成的Java程序的运行时环境。

所以,很明显,JDK是我们的开发工具包,它集成了JRE ,因此我们在安装JDK的时候可以选择不再安装JRE而直接使用JDK中的JRE运行我们的Java程序。(但是大部分人都默认将两个都装上了)。但是如果你的电脑不是用来开发Java程序的,而仅仅是用来部署和运行Java程序的,那么完全可以不用安装JDK,只需要安装JRE即可。

Java为什么能跨平台,实现一次编写,多处运行(Once write, run anywhere)?

Java能够跨平台运行的核心在于JVM。不是Java能够跨平台,而是它的JVM能够跨平台。我们知道,不同的操作系统上操作的API肯定是不同的,那么如果我们想要写一段代码调用系统的声音设备,就需要针对不同系统的API写出不同的代码来完成动作。而Java引入了字节码的概念,JVM也只能认识字节码,并将它们解释到系统的API调用。针对不同系统有不同的JVM实现,有Linux版本的JVM实现,也有Windows版本的JVM实现,但是同一段代码在编译后的字节码是完全一样的。引用前面的例子,在Java API层面,我们调用系统声音设备的代码是一样的,和系统无关,编译后生成的字节码也是唯一的。但是对于同一段字节码,在不同的JVM实现上会映射到不同系统的API调用,从而实现代码的不加修改即可跨平台运行。

"把你的精力用在能得到回报的地方。"

jre、jdk、jvm之间的关系的更多相关文章

  1. JDK、JRE、JVM之间的关系

       JDK.JRE.JVM之间的关系 1.JDK下载地址 http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads ...

  2. JDK、JRE与JVM之间的关系

    初学JAVA很容易被其中的很多概念弄的傻傻分不清楚,首先从概念上理解一下吧: JDK(Java Development Kit)简单理解就是Java开发工具包,JRE(Java Runtime Env ...

  3. java学习之Java中JDK,JRE和JVM之间的关系(转载)

    最近要重新抓一下java,大量扫技术文档,保存下来供自己查阅.以下转载自http://www.cnblogs.com/xiaofeixiang/p/4085159.html 初学JAVA很容易被其中的 ...

  4. Java中JDK,JRE和JVM之间的关系

    初学JAVA很容易被其中的很多概念弄的傻傻分不清楚,首先从概念上理解一下吧,JDK(Java Development Kit)简单理解就是Java开发工具包,JRE(Java Runtime Envi ...

  5. Java中JDK,JRE和JVM之间的关系-(转载)

    初学JAVA很容易被其中的很多概念弄的傻傻分不清楚,首先从概念上理解一下吧,JDK(Java Development Kit)简单理解就是Java开发工具包,JRE(Java Runtime Envi ...

  6. java JVM JRE JDK三者之间的关系

    JDK在包含JRE之外,提供了开发Java应用的各种工具,比如编译器和调试器. JRE包括JVM和JAVA核心类库和支持文件,是Java的运行平台. JVM是JRE的一部分,Java虚拟机的主要工作是 ...

  7. JDK、JRE、JVM之间的关系及JDK安装

    JRE (Java Runtime Environment) :是Java程序的运行时环境,包含 JVM 和运行时所需要的 核心类库 .JDK (Java Development Kit):是Java ...

  8. jvm内存模型-回收算法-和内存分配以及jdk、jre、jvm是什么关系(阿里,美团,京东面试题)

    1.什么是jvm?(1)jvm是一种用于计算设备的规范,它是一个虚构出来的机器,是通过在实际的计算机上仿真模拟各种功能实现的.(2)jvm包含一套字节码指令集,一组寄存器,一个栈,一个垃圾回收堆和一个 ...

  9. jvm内存模型-和内存分配以及jdk、jre、jvm是什么关系(阿里,美团,京东)

    参考:JVM的垃圾回收机制 总结(垃圾收集.回收算法.垃圾回收器) 1.什么是jvm?(1)jvm是一种用于计算设备的规范,它是一个虚构出来的机器,是通过在实际的计算机上仿真模拟各种功能实现的.(2) ...

随机推荐

  1. MySQL(9)---纪录一次实际开发过程中用到的复杂存储过程

    Mysql(9)---纪录一次实际开发过程中用到的复杂存储过程 为了尽可能的还原当时为什么需要用到存储过程,下面我写了个详细的文档,我们可以从需求文档出发来分析. 有关存储过程之前也写了两篇文章来做铺 ...

  2. fastjson对于yyyy-MM-dd HH:mm格式的反序列化问题

    原创GrayHJX 发布于2017-03-14 22:56:33 阅读数 6851  收藏 展开 问题:最近在工作中遇到这么一个问题:有个实体类,它有个date类型的属性,当在这个属性加上fastjs ...

  3. GO与PHP的AES交互,key长度问题

    今天在使用go与php的AES加解密交互中,一直有个问题那就是在go中加密后,在php端始终都是无法解密,经过排查最后发现是加密key长度引起的问题, 这里简单记录下. go的AES使用的是第三方的库 ...

  4. Java8 日期和时间API

    LocalDate.LocalTime.Instant.Duration.Period 1.1使用LocalDate和LocalTime 1.1.1LocalDate的创建方式和相关方法使用示例 @T ...

  5. pycharm2019.2一个奇怪的bugger,执行后输出内容被莫名处理

    2019-08-20 07:45:07 python爬虫是一直来大家都用的多的,我也是常常用到. requests做请求方便的很,但是今天却遇到requests的bug.text内容不可信. pych ...

  6. IOS疯狂基础之模态显示PresentModalViewController(转)

    转自:http://blog.csdn.net/wudizhukk/article/details/8553554 -(void)buttonDown:(id)sender{ ViewTwo *two ...

  7. [转]The Regular Expression Object Model

    本文转自:https://docs.microsoft.com/en-us/dotnet/standard/base-types/the-regular-expression-object-model ...

  8. UIImageView三种方式 和 位置分布

    typedef NS_ENUM(NSInteger, UIViewContentMode) { UIViewContentModeScaleToFill, //为将图片按照整个区域进行拉伸(会破坏图片 ...

  9. python生产者和消费者模式实现(一)普通方式

    import timeimport randomfrom multiprocessing import Queue # 生产者def producer(q, num): for i in range( ...

  10. 查看sybase IQ的执行计划

    在性能调优工作中,首要的事情是找出性能瓶颈.而针对数据库应用,由于商用数据库对上层应用来说是个黑盒,所以往往需要借助数据库的一些接口或工具来了解数据库的具体行为,并结合相关知识和业务进行调测.    ...