JDK、JRE、JVM,是什么关系?

作者:小傅哥
博客:https://bugstack.cn
Github:https://github.com/fuzhengwei/CodeGuide/wiki
沉淀、分享、成长,让自己和他人都能有所收获!
一、前言
截至到这已经写了22篇面经手册,你看了多少?
其实小傅哥就是借着面经的幌子在讲 Java 核心技术,探索这些核心知识点面试的背后到底在问什么。
想问一些面试官,是因为大家都在问所以你问,还是你想从这里问出什么? 其实可能很多面试官如果不了解这些技术,往往会被求职者的答案击碎内心,哈哈哈哈哈哈。比如:梅森旋转算法、开放寻址、斐波那契散列、启发式清理、Javassist代理方式、扰动函数、哈希一致等等。
记住,让懂了就是真的懂,比看水文、背答案要爽的多!嗯,就是有时候烧脑!
二、面试题
谢飞机,小记!,也不知道咋了,总感觉有些面试攻击性不大,但侮辱性极强!
面试官:谢飞机写过 Java 吗?
谢飞机:那当然写过,写了3年多了!
面试官:那,JDK、JRE、JVM 之间是什么关系?
谢飞机:嗯 J J J,JDK 里面有 JRE,JVM 好像在 JRE 里!?
面试官:那,Client模式、Server模式是啥?
谢飞机:嗯!?啥?
面试官:好吧,问个简单的。JVM 是如何工作的?背答案了吗?
谢飞机:再见,面试官!
三、JDK、JRE、JVM
1. Java 平台标准(JDK 8)
Oracle has two products that implement Java Platform Standard Edition (Java SE) 8: Java SE Development Kit (JDK) 8 and Java SE Runtime Environment (JRE) 8.
JDK 8 is a superset of JRE 8, and contains everything that is in JRE 8, plus tools such as the compilers and debuggers necessary for developing applets and applications. JRE 8 provides the libraries, the Java Virtual Machine (JVM), and other components to run applets and applications written in the Java programming language. Note that the JRE includes components not required by the Java SE specification, including both standard and non-standard Java components.
The following conceptual diagram illustrates the components of Oracle's Java SE products:
Description of Java Conceptual Diagram

关于 JDK、JRE、JVM 之间是什么关系,在 Java 平台标准中已经明确定义了。也就是上面的英文介绍部分。
- Oracle 有两个 Java 平台标准的产品,Java SE 开发工具包(JDK) 和 Java SE 运行时环境(JRE)。
- JDK(Java Development Kit Java开发工具包),JDK是提供给Java开发人员使用的,其中包含了java的开发工具,也包括了JRE。所以安装了JDK,就不用在单独安装JRE了。其中的开发工具包括编译工具(javac.exe) 打包工具(jar.exe)等。
- JRE(Java Runtime Environment Java运行环境) 是 JDK 的子集,也就是包括 JRE 所有内容,以及开发应用程序所需的编译器和调试器等工具。JRE 提供了库、Java 虚拟机(JVM)和其他组件,用于运行 Java 编程语言、小程序、应用程序。
- JVM(Java Virtual Machine Java虚拟机),JVM可以理解为是一个虚拟出来的计算机,具备着计算机的基本运算方式,它主要负责把 Java 程序生成的字节码文件,解释成具体系统平台上的机器指令,让其在各个平台运行。
综上,从这段官网的平台标准介绍和概念图可以看出,我们运行程序的 JVM 是已经安装到 JDK 中,只不过可能你开发了很久的代码,也没有注意过。没有注意过的最大原因是,没有开发过一些和 JVM 相关的组件代码
关于,各 JDK 版本的平台标准,可以自行比对学习,如下:
- Java SE 6 Documentation:https://docs.oracle.com/javase/6/docs/
- Java Platform Standard Edition 7 Documentation:https://docs.oracle.com/javase/7/docs/
- Java Platform Standard Edition 8 Documentation:https://docs.oracle.com/javase/8/docs/
2. JDK 目录结构和作用
我们默认安装完 JDK 会有 jdk1.8.0_45、jre1.8.0_45,两个文件夹。其实在 JDK 的文件中还会有 JRE 的文件夹,他们两个 JRE 文件夹的结构是一样的。

- bin:一堆 EXE 可执行文件,java.exe、javac.exe、javadoc.exe,已经密钥管理工具等。
- db:内置了 Derby 数据库,体积小,免安装。
- include:Java 和 JVM 交互的头文件,例如我们 JVMTI 写的 C++ 工程时,就需要把这个 include 包引入进去jvmti.h。例如:基于jvmti设计非入侵监控
- jre:Java 运行环境,包含了运行时需要的可执行文件,以及运行时需要依赖的 Java 类库和动态链接库.so.dll.dylib
- lib:Java 类库,例如 dt.jar、tools.jar
那么 jvm 在哪个文件夹呢?

可能你之前并没有注意过 jvm 原来在这里:C:\Program Files\Java\jdk1.8.0_45\jre\bin\server
- 这部分是整个 Java 实现跨平台的最核心内容,由 Java 程序编译成的 .class 文件会在虚拟机上执行。
- 另外在 JVM 解释 class 文件时需要调用类库 lib。在 JRE 目录下有两个文件夹 lib、bin,而 lib 就是 JVM 执行所需要的类库。
- jvm.dll 并不能独立工作,当 jvm.dll 启动后,会使用 explicit 方法来载入辅助动态链接库一起执行。
3. JDK 是什么?
综上通过 Java 平台标准和 JDK 的目录结构,JDK 是 JRE 的超集,JDK 包含了 JRE 所有的开发、调试以及监视应用程序的工具。以及如下重要的组件:
- java – 运行工具,运行 .class 的字节码
- javac– 编译器,将后缀名为.java的源代码编译成后缀名为.class的字节码
- javap – 反编译程序
- javadoc – 文档生成器,从源码注释中提取文档,注释需符合规范
- jar – 打包工具,将相关的类文件打包成一个文件
- jdb – debugger,调试工具
- jps – 显示当前java程序运行的进程状态
- appletviewer – 运行和调试applet程序的工具,不需要使用浏览器
- javah – 从Java类生成C头文件和C源文件。这些文件提供了连接胶合,使 Java 和 C 代码可进行交互。
- javaws – 运行 JNLP 程序
- extcheck – 一个检测jar包冲突的工具
- apt – 注释处理工具
- jhat – java堆分析工具
- jstack – 栈跟踪程序
- jstat – JVM检测统计工具
- jstatd – jstat守护进程
- jinfo – 获取正在运行或崩溃的java程序配置信息
- jmap – 获取java进程内存映射信息
- idlj – IDL-to-Java 编译器. 将IDL语言转化为java文件
- policytool – 一个GUI的策略文件创建和管理工具
- jrunscript – 命令行脚本运行
- appletviewer:小程序浏览器,一种执行HTML文件上的Java小程序的Java浏览器
4. JRE 是什么?
JRE 本身也是一个运行在 CPU 上的程序,用于解释执行 Java 代码。
一般像是实施的工作,会在客户现场安装 JRE,因为这是运行 Java 程序的最低要求。

- bin:有 java.exe 但没有 javac.exe。也就是无法编译 Java 程序,但可以运行 Java 程序,可以把这个bin目录理解成JVM。
- lib:Java 基础&核心类库,包含 JVM 运行时需要的类库和 rt.jar。也包含用于安全管理的文件,这些文件包括安全策略(security policy)和安全属性(security properties)等。
5. JVM 是什么?
其实简单说 JVM 就是运行 Java 字节码的虚拟机,JVM 是一种规范,各个供应商都可以实现自己 JVM虚拟机。就像小傅哥自己也按照虚拟机规范和手写JVM的相关书籍实现了,基于Java实现的JVM虚拟机。

源码地址:https://github.com/fuzhengwei/itstack-demo-jvm
内容简介:本代码主要介绍如何通过 java 代码来实现 JVM 的基础功能(搜索解析class文件、字节码命令、运行时数据区等),从而让java程序员通过最熟知的java程序,学习JVM是如何将java程序一步步跑起来的。
当然,我们下载 Oracle 公司的 JVM 与自己实现的相比,要高级的多。他们的设计有不断优化的内存模型、GC回收策略、自适应优化器等。
另外,JVM 之所以称为虚拟机,主要就是因为它为了实现 “write-once-run-anywhere”。提供了一个不依赖于底层操作系统和机器硬件结构的运行环境。
5.1 Client模式、Server模式
在 JVM 中有两种不同风格的启动模式, Client模式、Server模式。
- Client模式:加载速度较快。可以用于运行GUI交互程序。
- Server模式:加载速度较慢但运行起来较快。可以用于运行服务器后台程序。
修改配置模式文件:C:\Program Files\Java\jre1.8.0_45\lib\amd64\jvm.cfg
# List of JVMs that can be used as an option to java, javac, etc.
# Order is important -- first in this list is the default JVM.
# NOTE that this both this file and its format are UNSUPPORTED and
# WILL GO AWAY in a future release.
#
# You may also select a JVM in an arbitrary location with the
# "-XXaltjvm=<jvm_dir>" option, but that too is unsupported
# and may not be available in a future release.
#
-server KNOWN
-client IGNORE
- 如果需要调整,可以把 client 设置为 KNOWN,并调整到 server 前面。
- JVM 默认在 Server模式下,-Xms128M、-Xmx1024M
- JVM 默认在 Client 模式下,-Xms1M、-Xmx64M
5.2 JVM 结构和执行器
这部分属于 JVM 的核心知识,但不是本篇重点,会在后续的章节中陆续讲到。本章只做一些介绍。
- Class Loader:类装载器是用于加载类文件的一个子系统,其主要功能有三个:loading(加载),linking(链接),initialization(初始化)。
- JVM Memory Areas:方法区、堆区、栈区、程序计数器。
- Interpreter(解释器):通过查找预定义的 JVM 指令到机器指令映射,JVM 解释器可以将每个字节码指令转换为相应的本地指令。它直接执行字节码,不执行任何优化。
- JIT Compiler(即时编译器):为了提高效率,JIT Compiler 在运行时与 JVM 交互,并适当将字节码序列编译为本地机器代码。典型地,JIT Compiler执行一段代码,不是每次一条语句。优化这块代码,并将其翻译为优化的机器代码。JIT Compiler是默认开启
四、总结
- 这篇的知识并不复杂,涉及的面试内容也较少,更多的是对接下来要讲到 JVM 相关面试内容的一个开篇介绍,为后续的要讲的内容做一个铺垫。
- 如果你在此之前没有关注过JDK、JRE、JVM的结构和相应的组件配置以及执行模式,那么可以在此基础上继续学习加深印象。另外想深入学习JVM并不太容易,既要学习JVM规范也要上手应用实践,所以很建议先手写JVM,再实践验证JVM。
- 好了,本章节就扯到这了。这些知识点即使分享给大家,也是我自己学习、收录、整理、验证的过程。互相学习、互相成长,如果有错误之处,直接留言给我,我会不断的改正。大家一起进步!
五、系列推荐
- HashMap核心知识,扰动函数、负载因子、扩容链表拆分
- ArrayList也这么多知识?一个指定位置插入就把谢飞机面晕了!
- 除了JDK、CGLIB,还有3种类代理方式?面试又卡住!
- ReentrantLock之公平锁讲解和实现
- 线程池的介绍和使用,以及基于jvmti设计非入侵监控
JDK、JRE、JVM,是什么关系?的更多相关文章
- 浅谈 JVM 结构体系、类加载、JDK JRE JVM 三者的关系
		一.java类,创建.编译.到运行的工程: 1.随便建一个Java类,保存后就是一个.java文件, 2.然后我们使用 javac命令编译 .java文件,生产 .class文件. 3.再然后使用 j ... 
- jdk,jre.jvm三者的关系
		jdk>jre>jvm jdk=jre+java的开发工具(包括java.exe,javac.exe.javadoc.exe) jre=jvm+java核心类库 
- jdk jre jvm 三者之间关系
		JDK JDK是java开发工具包,是Sun公司针对Java开发员的产品. JDK 中包含JRE,在JDK安装的目录下有一个叫jre的目录,里面有两个文件夹,bin/和lib,其中bin就是j ... 
- JDK,JRE,JVM之间的关系
		JDK包括JRE包括JVM http://java-mzd.iteye.com/blog/838514 
- JDK JRE JVM
		使用java很久,但是一直不清楚JDK,JRE,JVM直接的关系,今天特地梳理一下. JDK:Java Development ToolKit(Java开发工具包),JDK是整个JAVA的核心,包括J ... 
- jdk jre jvm 关系
		很多朋友可能跟我一样,已经使用JAVA开发很久了,可是对JDK,JRE,JVM这三者的联系与区别,一直都是模模糊糊的. 今天特写此文,来整理下三者的关系. JDK : Java Development ... 
- dos命令,jdk&jre&jvm的关系,classpath和path区别
		Day01_SHJavaTraing_4-2-2017 一.学习方法 1.独立思考 2.独立整理.总结知识点 3.整理Exception报错文档 4.莫钻牛角尖 5.敲代码,敲,猛敲,死里敲 6.写代 ... 
- jre、jdk、jvm之间的关系
		很多Java的程序员在写了很多代码之后,你问他JRE和JDK是是什么关系,JVM又是什么东西,他是不知道的. JVM(Java Virtual Machine) Java 虚拟机.它只认识 xxx.c ... 
- JDK,JRE,JVM区别与联系(ZZ)
		http://www.cnblogs.com/hencehong/p/3252166.html 我们开发的实际情况是:我们利用JDK(调用JAVA API)开发了属于我们自己的JAVA程序后,通过JD ... 
- JDK,JRE,JVM区别与联系-理解与概括
		我们利用JDK(调用JAVA API)开发了属于我们自己的JAVA程序后,通过JDK中的编译程序(javac)将我们的文本java文件编译成JAVA字节码,在JRE上运行这些JAVA字节码,JVM解析 ... 
随机推荐
- [BUGCASE]Webpack打包报JavaScript堆内存泄漏的错误
			一.问题描述 执行npm run build之后报错: 报错信息: FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript he ... 
- Bootstrap Blazor 组件介绍 Table (一)自动生成列功能介绍
			Bootstrap Blazor 是一套企业级 UI 组件库,适配移动端支持各种主流浏览器,已经在多个交付项目中使用.通过本套组件可以大大缩短开发周期,节约开发成本.目前已经开发.封装了 70 多个组 ... 
- Java多线程中的虚假唤醒和如何避免
			先来看一个例子 一个卖面的面馆,有一个做面的厨师和一个吃面的食客,需要保证,厨师做一碗面,食客吃一碗面,不能一次性多做几碗面,更不能没有面的时候吃面:按照上述操作,进行十轮做面吃面的操作. 用代码说话 ... 
- 3、Spring Cloud Rest工程创建(通过IDEA创建)
			1.Rest微服务构建简介 (1).介绍 以Dept部门模块做一个微服务通用案例Consumer消费者(Client)通过REST调用Provider提供者(Server)提供的服务. (2).Myb ... 
- 第12.6节 Python标准库其他内置模块导览
			一. 文本处理服务 string模块 : 常见的字符串操作 difflib模块: 计算差异的辅助工具 textwrap模块: 文本自动换行与填充,能够格式化文本段落,以适应给定的屏幕宽度: unico ... 
- 第14.6节 使用Python urllib.request模拟浏览器访问网页的实现代码
			Python要访问一个网页并读取网页内容非常简单,在利用<第14.5节 利用浏览器获取的http信息构造Python网页访问的http请求头>的方法构建了请求http报文的请求头情况下,使 ... 
- PyQt(Python+Qt)学习随笔:PyQt帮助文档导入assistant后离线查阅
			在按照<第15.6节 PyQt5安装与配置>完成PyQt5及PyQt5-tools的安装后,发现Qt Designer中的帮助不能使用,报错: 按照<PyQt学习随笔:Qt Desi ... 
- PyQt(Python+Qt)学习随笔:使用QtWidgets.qApp实现在程序中随时访问应用的方法
			在PyQt应用中,任何一个应用在启动时必须创建一个基于QtWidgets.QApplication或其派生类对应的应用对象,该对象用于处理事件. 如果需要在应用代码中的任何位置都能访问该应用对象,可以 ... 
- Docker 简介-基本概念(一)
			1.前提知识 1.1 linux相关的基础知识 1.2 git相关的知识 2. Docker三要素 Docker主要包含3要素:镜像(image).容器(container).仓库(repositor ... 
- pytorch实战(一)hw1——李宏毅老师作业1
			任务描述:利用前9小时数据,预测第10小时的pm2.5的数值,回归任务 kaggle地址:https://www.kaggle.com/c/ml2020spring-hw1 训练集为: 12个月*20 ... 
