JVM、JRE、JDK之间的联系与区别

2023-05-16

JVM、JRE、JDK之间的联系与区别

JVM (Java Virtual Machine)

JVM(Java虚拟机)是一个可执行Java字节码的虚拟机进程,用于解析编译后的字节码文件。 JVM屏蔽了与操作系统平台相关的信息,可以把字节码解释成具体平台上的机器指令执行,这也是Java的能够 “一次编译,到处运行” 的原因。

既然JVM是“虚拟机”的意思,那么肯定要体现出来 : 可以把JVM类比为一台只针对Java程序的PC虚拟机,它通过实体计算机仿真各种计算功能来实现,JVM有自己完善的硬件架构,如处理器,堆栈,寄存器等,还有相应的指令集.

在Java的世界中,JVM的地位就像一台PC机器。JVM和PC物理机的宏观关系是这样的 :

JVM与物理PC的微观关系是这样的 :

Java世界中JVM与现实世界中的物理PC之间关系是这样的:

注意事项

JVM的核心任务是解释字节码文件,它不能运行字节码文件。因为JVM执行class还需要JRE下的lib类库的支持,尤其是rt.jar,这一点非常重要.

JRE (Java Runtime Environment)

光有JVM还不能完成class的执行,需要搭配JRE才能正常运行程序员打好的jar包。因为在解释class的时候JVM需要调用解释所需要的类库lib,JRE里有运行.classjava.exe.

JRE是Java程序的运行环境,它包含JVM的标准实现及Java核心类库。需要注意的是 : JRE是Java的运行环境不是开发环境。JRE不包含任何开发工具,如:编译器、调试器等,因为JRE是面向Java程序(jar包)的,程序只需要运行不需要编译、调试等功能。如果只需要运行一些Java程序,只需要一个JRE就足够了,不需要安装JDK.

在Java的世界中,JRE的地位相当于是一台PC机器中的Windows操作系统. Windows操作系统可以运行.exe格式化的应用程序对应的JRE操作系统用于运行.jar格式的应用程序.

综上所述,Java世界中的JRE与现实世界中的PC操作系统之间关系是这样的 :

JDK (Java Development Kit)

JDK是java开发工具包,它提供了编译、运行Java程序所需的各种工具和资源,包括Java编译器、Java运行时环境,以及常用的Java类库等。JDK是面向程序员的。

基本上每个学java的人都会先在机器 上装一个JDK,那它都包含哪几部分呢?

安装完jdk之后,切换至jdk的安装根目录,可以看到几个目录:bin、jre、src.zip、db、lib、include。

  • bin:开发工具。里面可以看到一些我们很熟悉的工具,jar、java、javac、javadoc、javap、jconsole、jhat、jmap、jstack、jstat。
  • jre:Java运行时环境。JRE包括Java虚拟机(JVM),类库和其他支持执行用Java编程语言编写的程序的文件(我们开发过程中经常使用到的核心类库就是在/jre/lib下)。
  • src.zip:Java类库源代码。构成Java核心API的所有类的Java编程语言源文件,(注意不是JVM源码)主要是想帮助开发人员学习和使用Java编程语言。
  • db:Oracle分发的Apache Derby关系数据库。
  • lib:其他库,开发工具所需的其他类库和支持文件,其中就有我们比较熟悉的 dt.jartools.jar
  • include:支持使用Java Native Interface和Java Virtual Machine(JVM)调试器接口进行本机代码编程的C语言头文件。

既然JDK安装目录中是包含JRE的,而JRE中是包含JVM的,所以电脑安装完JDK后就具备了开发Java源文件、编译class字节码文件、运行jar程序的功能。JDK直接打通了程序员与Java世界的壁垒,这就导致笔者到现在才搞清楚它们三者之间的关系,。

JVM、JRE、JDK三者之间的联系

综上所述,三者关系可以用下面一个场景来总结:

程序员借助JDK可以写好.Java源代码,然后使用JDK自带的javac命令将源代码编译为.class字节码文件,最后使用JDK的jar -cvf命令打包为jar包,到这一步JDK的使命就完成了。有了jar包之后,下一步就是让jar跑起来,这一步就该JVM、JRE出场了,使用java -jar运行程序。首先是在JRE上运行这些字节码,具体到字节码执行时就需要JVM解析字节码文件,并承担将字节码命令映射到CPU指令集或OS的系统调用。

)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JVM、JRE、JDK之间的联系与区别 的相关文章

随机推荐

  • Java程序员必读的入门&进阶书单

    外链图片转存失败 源站可能有防盗链机制 建议将图片保存下来直接上传 img lZRiIYGZ 1659350372441 http static chayuqing com edddeb70713efa2da69e953240a5b3ab
  • Java程序员怎样进阶

    对于很多学习Java的程序员来说 xff0c 回过头来看入门Java的过程并不难 xff0c 反而是学到后期感觉没有进步 xff0c 尤其是对于一个进军编程界的两三年的Java程序员来说 xff0c 工作如果还只是增删改查 xff0c 这可
  • java程序员该如何进阶?这份java中高级核心知识全面解析请收好

    Java中高级核心知识全面解析 是整理收录GitHub50K 43 Star以上的高质量学习文档 xff0c 前前后后花了近半个月的时间 xff0c 终于整理而成 包含了Java基础 网络 Linux 数据结构与算法 数据库 系统设计 工具
  • MySQL的 DDL和DML和DQL的基本语法

    前言 SQL语句 xff0c 即结构化查询语言 Structured Query Language xff0c 是一种特殊目的的编程语言 xff0c 是一种数据库查询和程序设计语言 xff0c 用于存取数据以及查询 更新和管理关系数据库系统
  • MySQL的10种常用数据类型

    MySQL的数据类型 常用的数据类型有 xff1a 整型 xff08 xxxint xff09 位类型 bit 浮点型 xff08 float和double real xff09 定点数 xff08 decimal numeric xff0
  • MySQL的DATE_FORMAT()函数将Date转为字符串

    一 前言 最近要做一些报表 xff0c 其中有一个创建报表的时间 xff0c 需要以固定的格式输出 xff1b 那么在SQL层面如何处理呢 xff1f 二 DATE FORMAT 函数 要将日期值格式化为特定格式 xff0c 可以使用DAT
  • MySQL的on duplicate key update 的使用

    mysql的存在就更新不存在就插入实现 先建数据库表 xff0c 重点要添加主键索引 xff08 id列 xff0c 没有测试 xff09 和唯一索引 xff08 branch no列 xff09 xff0c 随便找表测试 INSERT I
  • MySQL的Replace用法详解

    replace into平时在开发中很少用到 xff0c 这次是因为在做一个生成分布式ID的开源项目 xff0c 调研雅虎推出的一个基于数据库生成唯一id生成方案 xff1a flickr 碰到的一个知识盲点 xff0c 仅以此篇记录一下
  • springboot之jar包Linux后台启动部署及滚动日志查看且日志输出至文件保存(超级详细)

    作者 xff1a bug菌 博客 xff1a CSDN 掘金等 公众号 xff1a 猿圈奇妙屋 特别声明 xff1a 原创不易 xff0c 转载请附上原文出处链接和本文声明 xff0c 谢谢配合 版权声明 xff1a 文章里可能部分文字或者
  • SpringBoot之异步方法

    1 Future Future代表异步计算的结果 提供了检查计算是否完成 等待其完成以及检索计算结果的方法 只有在计算完成后 xff0c 才能使用方法get检索结果 xff0c 如有必要 xff0c 将其阻塞 xff0c 直到准备就绪 取消
  • 8大基本数据类型:

    整数 xff1a byte IO流 文件输入输出 文件上传下载 数据保存硬盘 short 基本没卵用 int 大部分的整数 年龄 工作年限 long 比int大 浮点型 xff08 小数 xff09 xff1a float 基本没卵用 do
  • SpringBoot之自动装配原理

    1 自动装配的使用 Spring Boot的核心理念是简化Spring应用的搭建和开发过程 xff0c 提出了约定大于配置和自动装配的思想 开发Spring项目通常要配置xml文件 xff0c 当项目变得复杂的时候 xff0c xml的配置
  • SpringBoot使用AOP记录接口操作日志

    前言 xff1a 我们项目中可能有这种需求 xff0c 每个人请求了哪些接口 xff1f 做了什么事情 xff1f 参数是什么 xff1f 重要的接口我们需要记录操作日志以便查找 操作日志和系统日志不一样 xff0c 操作日志必须要做到简单
  • 修改Tomcat默认访问根目录

    Tomcat安装后 xff0c Tomcat的主目录是webapps root目录 在conf文件夹下面找到server xml 配置文件打开 在 中间添加一行 docBase即为默认访问的文件夹名称 Tomcat默认访问目录就是webap
  • 吐血整理 20 道 Spring Boot 面试题,我经常拿来面试别人

    面试了一些人 xff0c 简历上都说自己熟悉 Spring Boot 或者说正在学习 Spring Boot xff0c 一问他们时 xff0c 都只停留在简单的使用阶段 xff0c 很多东西都不清楚 xff0c 也让我对面试者大失所望 下
  • 大数据技术之hadoop——(四)历史服务器+常用脚本

    文章目录 前言 一 配置历史服务器 二 日志聚集 三 集群的停止与启动 四 常用脚本 五 常用端口号 前言 上一篇我们已经将hadoop完全分布式集群搭建完毕 xff0c 这一篇则作为完全分布式集群的补全操作 一 配置历史服务器 为了查看程
  • 富士康Java开发面试题目

    int leapyear int y 计算润年 if y 40 amp amp y 100 61 0 y 61 100 amp amp y 4000 return 1 else return 0 int day calculate int
  • 手把手教程SpringCloud gateway 结合nacos实现路由转发

    1 使用IDEA创建spring项目 xff0c JDK1 8 xff0c 无需添加依赖 2 添加spring cloud gateway和nacos lt dependencyManagement gt lt dependencies g
  • Dubbo服务降级

    dubbo降级服务 使用dubbo在进行服务调用时 xff0c 可能由于各种原因 xff08 服务器宕机 网络超时 并发数太高等 xff09 xff0c 调用中就会出现RpcException xff0c 调用失败 服务降级就是指在由于非业
  • JVM、JRE、JDK之间的联系与区别

    JVM JRE JDK之间的联系与区别 JVM xff08 Java Virtual Machine xff09 JVM xff08 Java虚拟机 xff09 是一个可执行Java字节码的虚拟机进程 用于解析编译后的字节码文件 JVM屏蔽