理解Java里面的jvm,jre,jdk的区别和联系

有时候越是基础的问题,越是容易被咱们忽视,好比标题上的问题,感受挺简单,但真正让解释一下,未必可以说的很清楚,其实这个问题在Oracle官网的Java的文档里面解释的很是清晰,看官网下面的一张图:php

image

先解释下几个名词的意思:html

(一)JVM(Java Virtual Machine ):Java虚拟机java

主要负责将class文件也就是bytecode编码解释为机器可以识别的010101相似的编码,而后执行程序。由于JVM在主流平台都有对应实现,因此咱们常常说JVM是跨平台的,只须要一次编写,即可以处处运行,其实这里面都是JVM屏蔽了底层操做系统的细节。网络

(二)JRE(Java Runtime Environment ):Java运行时环境数据结构

jre包含了jvm,此外还有一些java内置的Libraries,如集合类,并发类,数学函数等并发

(三)JDK(Java Development Kit ):Java开发工具包oracle

jdk包含了jre,额外还提供了java源码编译和调试的功能等等,所以JDK是咱们每一个Java开发者必安装的一个组件。less

从上图可以看出:jvm

jdk包含jre,而jre又包含jvm,若是只须要运行java程序,其实只安装一个jre便可,若是还要开发和调试那就必须安装JDK了。函数

接下来思考一个问题咱们写的java源码文件是如何被执行的?

看下面的一个图:

image

主要经历了下面的四个流程:

(1)先由开发人员编写出程序也就是咱们的源码文件

(2)由JDK将其编译为class文件,注意这个文件是字节码,人眼不可读的

(3)由JRE里面的类加载器(Class Loader)负责把字节码文件加载,而后校验,准备,解析。注意加载这块是能够从网络上读取class文件,也能够从本地磁盘里读取。

(4)最后由JVM负责把字节码解释成机器识别的01010码,而后初始化程序并负责执行

在整个过程当中Java里面出现了编译和解释的操做,因此能够理解Java是一门编译和解释性语言。在上面的整个流程中,有一个步骤,比较关键,就是类加载器这步。

关于Java里面的类加载器的工做模式,咱们能够看下面的一个图:

image

Java里面的类加载器采用了双亲委派的模式,从上图能够看出,当加载一个class的文件名时,首先会从第一级的引导加载器开始寻找,若是没有就返回到第二级的扩展类加载器里面寻找这个class文件,若是再没有,就从咱们应用加载器也就是系统依赖的包里面寻找,若是找到就行后面的步骤,若是仍然没有找到,就会抛出ClassNotFoundException异常,平常开发中常见的另一个种异常是ClassNotDefFoundException,这种异常是加载a.class时,引用了b.class这时候若是b.class找不到就会这个异常,了解这些细节,对咱们开发和调试就会有比较大的帮助。

总结:

本篇主要介绍了Java里面几个比较重要的概念,分别是JVM,JRE,JDK以及他们的工做流程,此外还着重了提了下类加载器的工做原理,理解他们的工做模式,有助于咱们更好的使用Java语言,固然关于JVM的具体运行时的内存数据结构和垃圾回收机制本篇并无细说,这个后面有空能够在总结下。

参考连接:

https://docs.oracle.com/javase/8/docs/index.html

http://www.careerbless.com/java/basics/JavaArchitecture.php

相关文章
相关标签/搜索