JVM、JRE、JDK之间的联系及区别说明

 更新时间:2026年01月30日 09:41:03   作者:Getgit  
JVM、JRE和JDK是Java开发中三个关键组件,JVM是Java虚拟机,负责解析和执行Java字节码,JRE是Java运行环境,包含JVM和Java核心类库,JDK是Java开发工具包,包含JRE和编译工具,它们之间的关系是:JDK包含了JRE,JRE包含了JVM

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的系统调用。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • SpringBoot快速搭建web项目详细步骤总结

    SpringBoot快速搭建web项目详细步骤总结

    这篇文章主要介绍了SpringBoot快速搭建web项目详细步骤总结 ,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-12-12
  • SpringSecurity实现动态权限校验的过程

    SpringSecurity实现动态权限校验的过程

    Spring Security过滤器链中,AuthorizationFilter的authorizationManager是我们要找的组件,该组件的check方法已被弃用,推荐使用authorize方法,最终通过接口路径和权限进行校验,本文给大家介绍SpringSecurity实现动态权限校验的相关知识,感兴趣的朋友一起看看吧
    2025-02-02
  • java包本质及命名规范详解

    java包本质及命名规范详解

    这篇文章主要介绍了java包本质及命名规范,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • Java中String能存储多少个字符

    Java中String能存储多少个字符

    本文主要介绍了Java中字符串长度的限制,Java中字符串长度的限制,
    2026-02-02
  • 新版IDEA使用Spring Initializr创建工程的两种方法

    新版IDEA使用Spring Initializr创建工程的两种方法

    这篇文章主要介绍了新版IDEA使用Spring Initializr创建工程(两种方法,官方工具和IDEA),文中通过代码示例和图文结合的方式给大家讲解的非常详细,具有一定的参考价值,需要的朋友可以参考下
    2024-10-10
  • 实例讲解Java的MyBatis框架对MySQL中数据的关联查询

    实例讲解Java的MyBatis框架对MySQL中数据的关联查询

    这里我们来以实例讲解Java的MyBatis框架对MySQL中数据的关联查询,包括一对多、多对一的关联查询以及自身关联映射的方法等,需要的朋友可以参考下
    2016-06-06
  • RocketMQ事务消息原理与使用详解

    RocketMQ事务消息原理与使用详解

    RocketMQ事务消息(Transactional Message)是指应用本地事务和发送消息操作可以被定义到全局事务中,要么同时成功,要么同时失败。RocketMQ的事务消息提供类似 X/Open XA 的分布式事务功能,通过事务消息能达到分布式事务的最终一致
    2023-02-02
  • java实现电话本系统

    java实现电话本系统

    这篇文章主要为大家详细介绍了java实现电话本系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • jdbc实现宠物商店管理系统

    jdbc实现宠物商店管理系统

    这篇文章主要为大家详细介绍了jdbc实现宠物商店管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-10-10
  • Springboot程序开启远程DEBUG方式

    Springboot程序开启远程DEBUG方式

    本文介绍了SpringBoot程序远程debug的原理和步骤,包括在启动时指定JVM参数、配置远程调试、注意事项等,同时提供了配置本地和远程调试的方法和示例,需要注意避免生产环境中开启远程debug,保护调试信息的安全性和一致性,限制调试范围,避免资源占用问题
    2026-05-05

最新评论