Java一步到位!彻底了解JDK、JRE、JVM分别是什么及它们之间的联系

article/2025/10/1 15:38:29

大多数人刚接触Java的时候都会经常看到JDK、JRE、JVM,但可能一直迷迷糊糊,不知道它们之间真正的作用和含义,而了解JDK、JRE、JVM分别是什么及它们之间的关系有助于我们更加深刻的理解java语言的特性。

Java程序是运行在JVM(Java虚拟机)上的,在开发程序之前要配置Java开发环境,而配置环境要做的就是JDK的安装和配置。
首先上图
三者的大致结构是这样的,简单来说就是JDK包含JRE,JRE又包含JVM的关系。如下图所示:(禁止套娃!!!)
在这里插入图片描述

JDK

JDK:Java Development Kit 是Java的标准开发工具包(普通用户只需要安装 JRE来运行 Java 程序。而程序开发者必须安装JDK来编译、调试程序)。它提供了编译、运行Java程序所需的各种工具和资源,包括Java编译器、Java运行环境JRE,以及常用的Java基础类库等,是整个JAVA的核心。

JDK一般有三种版本:
SE(J2SE),standard edition,标准版,是我们通常用的一个版本 EE(J2EE),enterpsise edtion,企业版,使用这种JDK开发J2EE应用程序, ME(J2ME),micro edtion,主要用于移动设备、嵌入式设备上的java应用程序 (相对来说现在使用的很少了)

JDK安装目录下各个子文件目录和文档作用的详细介绍
下图是Java8中JDK的安装目录

在这里插入图片描述
bin文件里面存放了JDK的各种开发工具的可执行文件,主要的是编译器(javac.exe)
db文件是一个先进的全事务处理的基于Java技术的数据库(jdk自带数据库db的使用)
include文件里面是Java和jvm交互用的头文件
jre为java运行环境
lib文件存放的是JDK工具命令的实际执行程序

JRE

JRE:Java runtime environment 是运行基于Java语言编写的程序所不可缺少的运行环境,用于解释执行Java的字节码文件。
也是通过它,Java的开发者才得以将自己开发的程序发布到用户手中,让用户使用。JRE中包含了Java virtual machine(JVM),runtime class libraries和Java application launcher,这些是运行Java程序的必要组件。与大家熟知的JDK不同,JRE是Java运行环境,并不是一个开发环境,所以没有包含任何开发工具(如编译器和调试器),只是针对于使用Java程序的用户。

(图片来源百度,侵删)

下图是Java8中JRE的安装目录,里面有两个文件夹bin和lib。你可以认为bin里的就是JVM,lib中则是JVM工作所需要的类库,而JVM和 lib和起来就称为JRE
在这里插入图片描述

从JDK11开始,JDK和JRE都是在一起的,安装后默认是没有JRE的。如果需要JRE这个单独目录,可以在JDK目录下面去打开命令窗口,然后执行如下命令(win10执行这个生成JRE需要目录权限):
bin\jlink.exe --module-path jmods --add-modules java.desktop --output jre  
执行完之后就会生成JRE,但无论使用tomcat 还是eclipse,没有JRE文件夹实际上并不影响你的使用。

JVM

JVM:Java Virtual Machine 是Java的虚拟机,是JRE的一部分。它是整个java实现跨平台的最核心的部分,负责解释执行字节码文件,是可运行java字节码文件的虚拟计算机。
所有平台的上的JVM向编译器提供相同的接口,而编译器只需要面向虚拟机,生成虚拟机能识别的代码,然后由虚拟机来解释执行。

Java跨平台的原因

使用Java编译器编译Java程序时,生成的是与平台无关的字节码,这些字节码只面向JVM。不同平台的JVM都是不同的,但它们都提供了相同的接口。
JVM是Java程序跨平台的最核心的部分,只要为不同平台实现了相应的虚拟机,编译后的Java字节码就可以在该平台上运行。其屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。
正是因为有了JVM的存在,Java才实现了强大的跨平台特性。

JVM执行程序的过程

1、加载.class 文件
所有的java程序会首先被编译为.class的类文件,这种类文件可以在虚拟机上执行。也就是说class并不直接与机器的操作系统相对应,而是经过虚拟机间接与操作系统交互,由虚拟机将程序解释给本地系统执行。只有JVM还不能成功执行.class的类文件,因为在解释class的时候JVM需要调用解释所需要的类库lib,而jre包含lib类库。
运行class文件
可以在命令行中输入 java 字节码文件名 ,此时启动了一个jvm,加载字节码文件名.class字节码文件到内存,然后jvm运行内存中的字节码指令
在IDE上就类似于点击运行按钮。

2、管理并分配内存

3、执行垃圾收集
调用垃圾收集器进行垃圾回收
在这里插入图片描述
详细理解可参考这篇文章——类在JVM的执行流程

三者的区别与联系

1、JDK用于开发,是给开发人员用的,JRE 用于运行java程序,和JVM是给普通用户使用的。如果只是运行Java程序,可以只安装JRE,无需安装JDK。也就是说:使用JDK开发完成的java程序,交给JRE去运行。

2、JDK包含了JRE,JDK 和 JRE 中都包含 JVM。也可以说JDK是JRE+Java的开发工具,JRE包含了JVM+Java语言的核心类库。


http://chatgpt.dhexx.cn/article/5VGw62OK.shtml

相关文章

JDK 和 JRE 有什么区别?

面向人群不同: JDK是面向开发人员使用的SDK。 JRE是Java Runtime Enviroment是指Java的运行环境,是面向Java程序的使用者。 重要程度不同: JRE的地位就象一台PC机一样,编写的Java程序必须要JRE才能运行。只要你的电脑安装了JRE&am…

JDK和JRE有什么区别?

1. JDK 1). JDK是Java Development Kit的缩写,是Java的开发工具包,主要面向开发人员。 2). JDK包含了JRE,同时还包含了编译java源码的编译器javac,还包含了很多java程序调试和分析的工具:jconsole,jvisual…

进程虚拟地址

在前面的章节中,我们主要关注的是内核的虚拟地址空间的管理。从本节开始,我们重点关注管理用户空间的方法,其中由于种种原因,这个比内核地址空间管理更复杂。本节主要围绕以下内容: 用户进程的虚拟地址空间是Linux的一…

【此后无良辰】 实验3 进程的创建

实验目的 了解操作系统中内核程序和应用程序之间的关系;了解操作系统创建进程的过程;掌握在应用程序中创建进程的方法。 实验内容与记录 3.1 复制SDK文件夹的目的是什么?尝试在复制后把本地所生成的EOS内核项目文件夹删除,应用…

Linux进程管理(二)进程调度

Linux进程管理 Linux进程管理(一)进程数据结构 Linux进程管理(二)进程调度 Linux进程管理(三)进程调度之主动调度 Linux进程管理(四)进程调度之抢占式调度 Linux进程管理&#…

c语言静态结构体指针变量,C语言 结构体和指针详解及简单示例

指针也可以指向一个结构体,定义的形式一般为: struct 结构体名 *变量名; 下面是一个定义结构体指针的实例: struct stu{ char *name; //姓名 int num; //学号 int age; //年龄 char group; //所在小组 float score; //成绩 } stu1 { "T…

多进程图像

多进程图像 1 多进程设计2 一个大概的设计思路3 一个实际的进程切换案例3.1 进程的创建 - fork函数3.2 进程的切换 - schedule函数3.3 进程状态转换图3.4 如何执行我们自己的代码 参考资料 所谓多进程图像就是:多道程序,交替执行。本章主要介绍操作系统为…

操作系统之进程创建与进程状态

一、进程的创建 阻塞状态:正在运行的进程由于某些原因调用阻塞原语把自己阻塞(如果不把自己阻塞的话会一直占用处理机),等待相应的事件出现后才被唤醒,事件完成回到就绪状态。 通常这种处于阻塞状态的进程也排成一个队列。有的系统则根据阻塞…

linux进程管理原理

Linux 是一种动态系统,能够适应不断变化的计算需求。 linux 计算需求的表现是以进程的通用抽象为中心的。进程可以是短期的(从命令行执行的一个命令),也可以是长期的(一种网络服务)。因此,对进程…

进程系统调用——fork函数深入理解

转载 进程系统调用——fork函数深入理解 当我们在一个现代系统上运行一个程序的时候,我们会得到一个假象,就好像我们的程序是系统中当前运行的唯一程序。我们的程序好像是独占的使用处理器和存储器。处理器就是无间断的一条一条地执行我们程序中的指令。…

进程调度实验

一、实验目的 通过编写程序实现进程或作业先来先服务、高优先权、按时间片轮转调度算法,进一步掌握进程调度的概念和算法,加深对处理机分配的理解。了解进程(线程)的调度机制。学习使用进程(线程)调度算法…

基于C++实现的进程调度算法

资源下载地址:https://download.csdn.net/download/sheziqiong/85650672 一、问题描述与分析 1.1 设计构想 程序能够完成以下操作:选择调度算法;查看历史记录;创建进程;进程调度:进程创建完成后就选择进程调度算法,每次执行的结果都在屏幕上输出。 1…

短进程优先调度算法c语言spf,短进程优先的调度算法详解

短进程优先的调度算法详解 发布时间:2020-05-17 04:52:01 来源:51CTO 阅读:293 作者:张立达 一、SPF算法简介 SJF算法SJF(shortest job first)是以进程的运行时间长度作为优先级,进程运行时间越短,优先级越高。 SJF算法的缺点必须预知进程的运行时间。即使是程序员也很难…

进程调度算法(c语言)

对一个非抢占式多道批处理系统采用以下算法的任意两种,实现进程调度,并计算进程的开始执行时间,周转时间,带权周转时间,平均周转时间,平均带权周转时间 1.先来先服务算法 2.短进程优先算法 *3.高响应比优先算法 一、设计思想 每个进程有一个进程控制块(…

进程的创建——fork函数

1. 进程的信息 进程的结构 在Linux中,一切皆文件,进程也是保存在内存中的一个实例,下图描述了进程的结构: 堆栈:保存局部变量数据段:一般存放全局变量和静态变量代码段:存储进程的代码文件TSS状态段:进程做切换时,需要保存进程现场…

C语言结构体

本节主要讲解下结构体的一些易错点和重要内容 结构体变量定义 (使用typedef起别名) 一般的结构体定义:定义类型变量 struct student {long stuID;char stuName[10];char stuSex;char birthYear;int mathScore; }stu1;可以用typedef取别…

深入探索 Linux 进程信号的奥秘

Linux 进程信号 0 查看IPC(进程间通信)资源的指令1 学习进程信号的过程2 Linux 进程信号的基本概念2.1 对信号的基本认知 3 Linux 进程信号的产生方式4 Linux 进程信号的保存和处理5 Linux 进程信号递达6 volatile关键字 0 查看IPC(进程间通信)资源的指令 ipcs -m : 查看共享内…

Linux 进程信号深剖

目录 传统艺能😎概念🤔信号发送🤔信号记录🤔信号产生🤔常见信号处理方式🤔终端按键产生信号🤔核心转储😋如何调试🤔 系统函数发送信号🤔raise函数&#x1f91…

Linux进程信号

文章目录 一.信号入门二. 产生信号(1). 通过键盘按键产生信号(2). 硬件异常产生信号(3).通过系统函数发送信号(4). 由软件条件产生信号 三.阻塞信号(1). 阻塞/递达/未决概念 :(2). 信号在内核中的表示(3). sigset_t(4). 信号集操作函数(5). 处理信号 四. 可重入函数/不可重入函…

[培训-DSP快速入门-7]:C54x DSP开发环境与第一个汇编语言程序

作者主页(文火冰糖的硅基工坊):https://blog.csdn.net/HiWangWenBing 本文网址:https://blog.csdn.net/HiWangWenBing/article/details/119011489 目录 引言: 第1章 DSP汇编语言编程的流程概述 第2章 汇编语言程序建立过程 2.1 建立工程…