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

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

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

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

主要负责将class文件也就是bytecode编码解释为机器能够识别的010101类似的编码,然后执行程序。因为JVM在主流平台都有对应实现,所以我们经常说JVM是跨平台的,只需要一次编写,便可以到处运行,其实这里面都是JVM屏蔽了底层操作系统的细节。

(二)JRE(Java Runtime Environment ):Java运行时环境

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

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

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

从上图能够看出:

jdk包含jre,而jre又包含jvm,如果只需要运行java程序,其实只安装一个jre即可,如果还要开发和调试那就必须安装JDK了。

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

看下面的一个图:

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

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

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

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

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

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

关于Java里面的类加载器的工作模式,我们可以看下面的一个图:

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

原文发布于微信公众号 - 我是攻城师(woshigcs)

原文发表时间:2018-01-17

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏微服务

C#并发编程实例讲解-概述(01)

在工作中经常遇到需要并发编程的实例,一直没有时间来整理,现在空了下来,个人整理对并发一下理解。 关于并发编程的几个误解 误解一:并发编程就是多线程 实际上多线...

298100
来自专栏FreeBuf

构造优质上传漏洞Fuzz字典

上传漏洞的利用姿势很多,同时也会因为语言,中间件,操作系统的不同,利用也不同。比如有:大小写混合,.htaccess,解析漏洞,00截断,.绕过,空格绕过,::...

30130
来自专栏Java进阶架构师

手把手带你实现JDK动态代理

业务接口Interface、业务实现类target、业务处理类Handler、JVM在内存中生成的动态代理类$Proxy0

8420
来自专栏微信公众号:Java团长

深入理解Java虚拟机到底是什么

作为一个Java程序员,我们每天都在写Java代码,我们写的代码都是在一个叫做Java虚拟机的东西上执行的。但是如果要问什么是虚拟机,恐怕很多人就会模棱两可了。...

18130
来自专栏JetpropelledSnake

Python入门之PyCharm中目录directory与包package的区别

对于Python而言,有一点是要认识明确的,python作为一个相对而言轻量级的,易用的脚本语言(当然其功能并不仅限于此,在此只是讨论该特点),随着程序的增长,...

718120
来自专栏ytkah

dedecms自增标签[field:global.autoindex/]的运用

  用bootstrap建站时用到幻灯片切换模块,里面有个active(下面代码中的data-slide-to="0"),其余的按顺序递增(1,2),如果用de...

36840
来自专栏cloudskyme

jbpm5.1介绍(2)

快速开始  首先下载jBPM,http://sourceforge.net/projects/jbpm/files/ 可以有选择性的下载: bin:jBPM的二...

41160
来自专栏CRPER折腾记

Vue折腾记 - (2)写一个不大靠谱的面包屑组件

我把页面标题和面包屑封装到一起..就不用涉及到组件的通讯了, 不然又要去监听路由或者依赖状态去获取

17420
来自专栏开发与安全

套接字socket 的地址族和类型、工作原理、创建过程

注:本分类下文章大多整理自《深入分析linux内核源代码》一书,另有参考其他一些资料如《linux内核完全剖析》、《linux c 编程一站式学习》等,只是为...

294110
来自专栏工科狗和生物喵

【计算机本科补全计划】Java学习笔记(一) 安装配置 (Mac Sublime3) 红黄蓝

正文之前 标题后面为啥要加三个字呢。蹭热度不至于,就想着,让更多人知道么。毕竟我以后也会有当爸的一天~ 要是那些人渣站在悬崖上,旁边没啥人看着,我上去踢一脚是做...

40470

扫码关注云+社区

领取腾讯云代金券