Java基础,该走的路,一步都不能落下o。
相信大家都知道JVM、JDK和JRE是什么。我被人问到的时候,还是只能说个大概,不能说出个所以然来,所有温故一下相关概念知识。
JVM (Java Virtual Machine )
:Java虚拟机,简称JVM,是运行所有Java程序的假想计算机,是Java程序的运行环境,是Java 最具吸引力的特性之一。我们编写的Java代码,都运行在 JVM 之上。
跨平台
任何软件的运行,都必须要运行在操作系统之上,而我们用Java编写的软件可以运行在任何的操作系统上,这个特性称为Java语言的跨平台特性。该特性是由JVM实现的,我们编写的程序运行在JVM上,而JVM运行在操作系统上。来个图:
如图所示,Java的虚拟机本身不具备跨平台功能的,每个操作系统下都有不同版本的虚拟机。
真正跨平台的是java程序本身,而每个操作系统下JVM就相当于一个本地的翻译(将其它系统的程序翻译成本系统可以运行的程序),可以直接执行从其它操作系统过来的java程序。
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 (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。来个图更直观:
当然最底层还是OS操作系统。
下面这个图更为详细,作为参考:
就自己平时对这三个家伙疑惑的点整理一下,好奇的小伙伴也可以了解一下。
我们的 jdk 安装成功后,在 C:\Program Files\Java
目录会是这样的(这里,我是装的 jdk1.8 的版本)
而 jdk 的子目录下也存在一个 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里面。C:\Program Files\Java\jre1.8.0_102
)用于为Java程序提供运行环境。这两个JRE都可以作为开发Java程序的运行环境,但是JDK自带的开发工具只能使用第一个目录下的JDK,不能使用第二个目录下的JDK。
看一下JVM在哪里:在jre的bin目录里有个jvm.dll,既然JRE是运行时环境,那么运行在哪?肯定是JVM虚拟机上了。
JVM是Java实现跨平台最核心的部分,所有的Java源程序(.java)
会首先被Java编译器编译成与平台无关的‘字节码文件’(.class类文件,也就是0,1二进制文件)
。JVM的主要工作是解释自己的指令集(即字节码)并映射到本地的CPU的指令集或OS的系统调用。JVM对上层的Java源程序是不关心的,它关心的只是由源文件生成的类文件,也就是说在JVM上运行的是类文件。
JVM屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行,也就实现了Java跨平台的特性。
当然,前面也提到了,只有JVM还不能进行字节码文件的执行,因为在解释class的时候JVM需要调用解释所需要的类库lib,而JRE包含lib类库。
JVM是一门很深的学问,这里只能简单的说一点点,感兴趣的伙伴可以深入研究,只有好处,没有坏处。
JDK主要包含了三部分,为我们提供的帮助也正是这三部分:
第一部分: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没有。相信面试官已经明白你是知道这个点的,如果继续追问的话,再细分回答。
就到这里了,简单做下总结:
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!