【JavaSE】JVM、JRE与JDK到底是个啥

  Java基础,该走的路,一步都不能落下o。

本文目录

  • 1.先理清概念
    • JVM是什么
    • JRE是什么
    • JDK是什么
    • 三者的关系
  • 2.它们没那么简单
    • 为什么电脑在装完JDK后会有两个版本的JRE
    • JVM为我们做了什么
    • JDK为我们做了什么
  • 3.总结

1.先理清概念

  相信大家都知道JVM、JDK和JRE是什么。我被人问到的时候,还是只能说个大概,不能说出个所以然来,所有温故一下相关概念知识。

JVM是什么

  JVM (Java Virtual Machine ):Java虚拟机,简称JVM,是运行所有Java程序的假想计算机,是Java程序的运行环境,是Java 最具吸引力的特性之一。我们编写的Java代码,都运行在 JVM 之上。
  跨平台
  任何软件的运行,都必须要运行在操作系统之上,而我们用Java编写的软件可以运行在任何的操作系统上,这个特性称为Java语言的跨平台特性。该特性是由JVM实现的,我们编写的程序运行在JVM上,而JVM运行在操作系统上。来个图:
【JavaSE】JVM、JRE与JDK到底是个啥_第1张图片
  如图所示,Java的虚拟机本身不具备跨平台功能的,每个操作系统下都有不同版本的虚拟机。
  真正跨平台的是java程序本身,而每个操作系统下JVM就相当于一个本地的翻译(将其它系统的程序翻译成本系统可以运行的程序),可以直接执行从其它操作系统过来的java程序。

JRE是什么

  JRE (Java Runtime Environment) :是Java程序的运行时环境,包含 JVM 和java程序运行时所需要的核心类库 。我们想要运行一个已有的Java程序,那么只需安装 JRE 即可。

  所有的Java程序都需要在JRE下才能运行。只有JVM还不能进行class的执行,因为解释class的时候,JVM需要调用解释所需要的类库lib。在JDK的安装目录下有一个jre目录,里面有两个文件夹bin和lib,这里可以认为bin就是JVM,lib就是JVM所需要的类库,而JVM和lib合起来就称为JRE。

  JRE与JDK不同,它只是Java运行环境,并不是一个开发环境,所以它不包含任何开发工具----如编译器、调试器和其它工具。

JDK是什么

  JDK (Java Development Kit):是Java程序开发工具包(也就是Java 语言的软件开发工具包SDK),JDK是整个JAVA的核心,我们想要开发一个全新的Java程序,那么必须安装 JDK 。

  JDK包含Java的运行环境JRE、开发人员使用的工具(java编译器、java调试器、jdb等)和和Java基础的类库(即Java API包括rt.jar)

  Java API是Java的应用程序接口,里面有很多已经写好的Java Class,包括一些重要的语言结构以及基本图形,网络和文件I/O等等,我们可以直接调用使用。现在已经有很多版本的JDK。

三者的关系

  JDK、JRE、JVM之间是一种包含关系,范围是从大到小依次为 ;JDK>JRE>JVM,即JDK中包含JRE,JRE包含JVM。来个图更直观:
【JavaSE】JVM、JRE与JDK到底是个啥_第2张图片
  当然最底层还是OS操作系统

下面这个图更为详细,作为参考:
【JavaSE】JVM、JRE与JDK到底是个啥_第3张图片

2.它们没那么简单

  就自己平时对这三个家伙疑惑的点整理一下,好奇的小伙伴也可以了解一下。

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

  我们的 jdk 安装成功后,在 C:\Program Files\Java 目录会是这样的(这里,我是装的 jdk1.8 的版本)
【JavaSE】JVM、JRE与JDK到底是个啥_第4张图片
jdk 的子目录下也存在一个 jre
【JavaSE】JVM、JRE与JDK到底是个啥_第5张图片
两个JRE,都有什么作用?

  • 第一个JRE(C:\Program Files\Java\jdk1.8.0_102\jre)是JDK自带的为其开发工具提供运行环境的JRE,在JDK中有很多用Java编写的开发工具for example(javac.exe、jar.exe),这些工具的实现代码都放在路径:C:\Program Files\Java\jre1.8.0_102\lib 的tools.jar里面。
  • 第二个JRE(C:\Program Files\Java\jre1.8.0_102)用于为Java程序提供运行环境。

这两个JRE都可以作为开发Java程序的运行环境,但是JDK自带的开发工具只能使用第一个目录下的JDK,不能使用第二个目录下的JDK。

JVM为我们做了什么

  看一下JVM在哪里:在jre的bin目录里有个jvm.dll,既然JRE是运行时环境,那么运行在哪?肯定是JVM虚拟机上了。
【JavaSE】JVM、JRE与JDK到底是个啥_第6张图片
  JVM是Java实现跨平台最核心的部分,所有的Java源程序(.java)会首先被Java编译器编译成与平台无关的‘字节码文件’(.class类文件,也就是0,1二进制文件)。JVM的主要工作是解释自己的指令集(即字节码)并映射到本地的CPU的指令集或OS的系统调用。JVM对上层的Java源程序是不关心的,它关心的只是由源文件生成的类文件,也就是说在JVM上运行的是类文件
  JVM屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行,也就实现了Java跨平台的特性。
【JavaSE】JVM、JRE与JDK到底是个啥_第7张图片
  当然,前面也提到了,只有JVM还不能进行字节码文件的执行,因为在解释class的时候JVM需要调用解释所需要的类库lib,而JRE包含lib类库。
  JVM是一门很深的学问,这里只能简单的说一点点,感兴趣的伙伴可以深入研究,只有好处,没有坏处。

JDK为我们做了什么

JDK主要包含了三部分,为我们提供的帮助也正是这三部分:

  • 第一部分是Java运行时环境(JRE,核心是JVM)。
  • 第二部分是Java的基础类库,这个类库的数量还是非常可观的。
  • 第三部分就是Java的开发工具,辅助我们使用好java的神器。

第一部分:Java运行时环境
  这部分就是JRE,而它的核心其实就一个东西,JVM。内容参见上文。

第二部分:Java的基础类库
  这里面为我们开发Java程序提供了非常庞大的类这些基础类我们直接拿来就可以用,不用自己造轮子。为什么是说是庞大的,Java的基础类库从我们刚开始学Java就开始接触了,但是,直到结束整个Java生涯,都不一定能把所有的类都见一遍。我们只用知道会用一些常用、重要的类就好了。
  这里举一些常见的Java基础类库的包,相信或多或少肯定见过。

java.lang.annotation
java.lang.reflect
javax.annotation.*
java.lang.ref
java.math
java.rmi.*
javax.rmi.*
java.security.*
javax.security.*
java.sql
javax.sql.*
javax.transaction.*
java.text
javax.xml.*
org.w3c.dom.*
org.xml.sax.*
javax.crypto.*
javax.imageio.*
javax.jws.*
java.util.jar
java.util.logging
java.util.prefs
java.util.regex
java.util.zip

第三部分:Java的开发工具
  提供一些开发命令工具方便我们开发,javac应该是最常用的一个了,虽然你几乎不用手动执行它。还有一些比较实用的几个工具主要有jmap、jconsole、jstack、jvisualvm,想要了解的可以去谷歌或者官网上找,还是非常好找的。

javac.exe是一个包装器(Wrapper),存在的目的是为了让开发者免于输入过长的指命
运行cmd键入javac,系统就能自动召见java的编译器


  这里提一个面试的问题,有时候面试官问JDK和JRE是什么,它们有什么的区别。面试官的目的不会是想让我们解释什么名词的,而是想看看我们的基础和研究JAVA的深浅,还有就是看我们是不是经常喜欢问为什么。我自己当时回答了个大概,没理解面试官的目的,如果我们遇到这个问题了,简单说一下JDK和JRE是什么,区别的话JDK有javac(开发工具),JRE没有。相信面试官已经明白你是知道这个点的,如果继续追问的话,再细分回答。

3.总结

就到这里了,简单做下总结:
   JDK>JRE>JVM,即JDK中包含JRE,JRE包含JVM。

含义 作用
JVM Java虚拟机 有JVM就可以解释执行字节码文件(.class).
JRE Java运行时环境 JVM解释执行这些字节码文件的时候需要调用类库,如果没有这些类库JVM就不能正确的执行字节码文件,JVM+类库=JRE
JDK Java开发工具包 有了JRE就可以正确的运行java程序了,但是光有JRE不能开放Java程序,所以JRE+开发工具=JDK,有了JDK,就可同时开发和运行

  我们利用JDK(调用本地的API)开发属于自己的JAVA程序后,通过JDK中的编译程序(javac)将我们的文本java文件编译成Java字节码,在JRE上运行这些Java字节码,JVM解释这些字节码,映射到CPU指令集或OS的系统调用。

对你有所帮助的话,欢迎点赞评论,指出不足,笔者由衷感谢o!

你可能感兴趣的:(JavaSE基础)