java教程系列二:Java JDK,JRE和JVM分别是什么?
多情只有春庭月,犹为离人照落花。

概述
本章主要了解JDK,JRE和JVM之间的区别。JVM是如何工作的?什么是类加载器,解释器和JIT编译器。还有一些面试问题。
Java程序执行过程
在深入了解Java内存区域之前,我们先了解Java源文件是如何执行的。
- 我们使用编辑器在
Simple.Java文件中编写源代码。 - 程序必须编译成字节码。编译器(
javac)将源代码编译为Simple.class文件。 - 此后缀为
.class的类文件可以在任何平台/操作系统的的JVM(Java虚拟机)中执行。 JVM负责将字节码转换为机器可执行的本机机器代码。

什么是JVM?
Java虚拟机(JVM)是运行Java字节码的虚拟机。可以通过javax将.java文件编译成.class文件。.class文件包含JVM可解析的字节码。
事实上,JVM只是为Java字节码提供了运行时环境和规范。不同的厂商提供此规范的不同实现。例如,此Wiki页面列出了其它JVM实现。
最受欢迎的JVM虚拟机是Oracle公司提供的Hostspot虚拟机,(前身是Sun Microsystems,Inc.)。
JVM虚拟机使用许多先进技术,结合了最新的内存模型,垃圾收集器和自适应优化器,为Java应用程序提供了最佳性能。
JVM虚拟机有两种不同的模式,client模式和server模式。尽管server和client相似,但server进行了特殊调整,以最大程度地提高峰值运行速度。它用于长时间运行的服务器应用程序,它们需要尽可能快的运行速度,而不是快速启动或较小的运行时内存占用量。开发人员可以通过指定-client或-server来选择所需的模式。
JVM之所以称为虚拟机,是因为它提供的API不依赖于底层操作系统和机器硬件体系结构。这种与硬件和操作系统的独立性是Java程序一次写入,随处运行必要基础。
JVM架构

类加载器
类加载器是用于加载类文件到JVM中。主要分为以下三步 加载,链接和初始化。
- 加载
- 为了加载类,
JVM有3种类加载器。Bootstrap,extension和应用程序类加载器。 - 加载类文件时,
JVM会找到这个类的所有依赖项。 - 首先类加载会判断当前类加载器是否存在父类,如果存在则交给父加载器加载。
Bootstrap为根类加载器,Bootstrap加载器尝试查找该类。它扫描JRElib文件夹中的rt.jar。- 如果找不到类,那么
extension加载器将在jre \ lib \ ext包中搜索类文件。 - 如果还找不到类,则应用程序类加载器将在系统的
CLASSPATH环境变量中搜索所有Jar文件和类 - 任何类加载程序找到了类,则由该类加载器加载类;否则抛出
ClassNotFoundException。
- 链接 : 类加载器加载类后,将执行链接。字节码验证程序将验证生成的字节码是否正确,如果验证失败,我们将收到验证错误。它还会对类中的静态变量和方法执行内存分配。
- 初始化 : 这是类加载的最后阶段,此处将为所有静态变量分配原始值,并执行静态块。
JVM内存区域
JVM中的内存区域分为多个部分,以存储应用程序数据的特定部分。
- 方法区:存储类结构,例如类的基本信息,常量运行时池和方法代码。
- 堆:存储在应用程序执行期间创建的所有对象。
- 栈:存储局部变量和中间结果。所有这些变量对于创建它们的线程都是私有的。每个线程都有自己的
JVM栈,并在创建线程时同时创建。因此,所有此类局部变量都称为线程局部变量。 - PC寄存器:存储当前正在执行的语句的物理内存地址。在Java中,每个线程都有其单独的PC寄存器。
- 本地方法区:许多底层代码都是用C和C ++等语言编写的。本地方法栈保存本机代码的指令。
JVM执行引擎
分配给JVM的所有代码均由执行引擎执行。执行引擎读取字节码并一一执行。它使用两个内置的解释器和JIT编译器将字节码转换为机器码并执行。

使用JVM,解释器和编译器均会生成本机代码。不同之处在于它们如何生成本机代码,其优化程度以及优化成本。
解释器
JVM解释器通过查找预定义的JVM指令到机器指令的映射,几乎将每个字节码指令转换为相应的本机指令。它直接执行字节码,不执行任何优化。
JIT编译器
为了提高性能,JIT编译器在运行时与JVM交互,并将适当的字节码序列编译为本地机器代码。通常,JIT编译器采用一段代码(和解释器一次一条语句不一样),优化代码,然后将其转换为优化的机器代码。
默认情况下,JIT编译器处于启用状态。您可以禁用JIT编译器,在这种情况下,解释器将要解释整个Java程序。除了诊断或解决JIT编译问题外,不建议禁用JIT编译器。
什么是JRE
Java运行时环境(JRE)是一个软件包,它将库(jar)和Java虚拟机以及其他组件捆绑在一起,以运行用Java编写的应用程序。JRE只是JVM的一部分。
要执行Java应用程序,只需要在计算机中安装JRE。 这是在计算机上执行Java应用程序都是最低要求。
JRE包含了以下组件–
- Java HotSpot客户端虚拟机使用的DLL文件。
- Java HotSpot服务器虚拟机使用的DLL文件。
- Java运行时环境使用的代码库,属性设置和资源文件。例如rt.jar和charsets.jar。
- Java扩展文件,例如localedata.jar。
- 包含用于安全管理的文件。这些文件包括安全策略(java.policy)和安全属性(java.security)文件。
- 包含applet支持类的Jar文件。
- 包含供平台使用的TrueType字体文件。
JRE可以作为JDK的一部分下载,也可以单独下载。JRE与平台有关。您可以根据您的计算机的类型(操作系统和体系结构)选择要导入和安装的JRE软件包。
比如,你不能在32位计算机上安装64位JRE。同样,用于Windows的JRE发行版在Linux上将无法运行。反之亦然。
什么是JDK
JDK比JRE更加全面。JDK包含JRE拥有的所有部门以及用于开发,调试和监视Java应用程序的开发工具。当需要开发Java应用程序时,需要JDK。
JDK附带的几个重要组件如下:
- appletviewer –此工具可用于在没有Web浏览器的情况下运行和调试Java applet
- apt –注释处理工具
- extcheck –一种检测JAR文件冲突的实用程序
- javadoc –文档生成器,可从源代码注释自动生成文档
- jar –存档程序,它将相关的类库打包到一个JAR文件中。该工具还有助于管理JAR文件
- jarsigner – jar签名和验证工具javap –类文件反汇编程序
- javaws – JNLP应用程序的Java Web Start启动器
- JConsole – Java监视和管理控制台
- jhat – Java堆分析工具
- jrunscript – Java命令行脚本外壳
- jstack –打印Java线程的Java堆栈跟踪的实用程序
- keytool –用于操作密钥库的工具
- policytool –策略创建和管理工具
- xjc – XML绑定Java API(JAXB)API的一部分。它接受XML模式并生成Java类
与JRE一样,JDK也依赖于平台。因此,在为您的计算机下载JDK软件包时请多加注意。
JDK,JRE和JVM之间的区别
基于以上讨论,我们可以得出以下这三者之间的关系
JRE = JVM + libraries to run Java application.
JDK = JRE + tools to develop Java Application.

简而言之,如果你是编写代码的Java应用程序开发人员,则需要在计算机中安装JDK。但是,如果只想运行用Java内置的应用程序,则只需要在计算机上安装JRE。
JDK,JRE和JVM相关的面试问题
如果你理解我们在这篇文章中讨论的内容,那么面对任何面试问题都不难。不过,还是要准备好回答如下问题:
什么是JVM架构
上面已经详细解释过了。
Java有几种类型的类加载器
Bootstrap, extension、应用程序类加载器和自定义类加载器。
类加载器是如何在Java中工作的?
类加载器会在其预定义位置扫描jar文件和类。他们扫描路径中的所有那些类文件,并查找所需的类。如果找到它们,则加载,链接并初始化类文件。
jre和jvm的区别?
JVM是用于运行Java应用程序的运行时环境的规范。Hotspot JVM是规范的这样一种实现。它加载类文件,并使用解释器和JIT编译器将字节码转换为机器代码并执行。
解释器和jit编译器的区别?
解释器逐行解释字节码并顺序执行。这会导致性能下降。JIT编译器通过分析块中的代码来为该过程添加优化,然后准备更多优化的机器代码。
JDK 和 JRE下载
- JDK:https://www.oracle.com/technetwork/java/javase/downloads/index.html
- JRE https://www.oracle.com/technetwork/java/javase/downloads/server-jre8-downloads-2133154.html

java教程系列二:Java JDK,JRE和JVM分别是什么?的更多相关文章
- java‘小秘密’系列(二)---Integer
java'小秘密'系列(二)---Integer 前言:本系列的主题是平时容易疏忽的知识点,只有基础扎实,在编码的时候才能更注重规范和性能,在出现bug的时候,才能处理更加从容. 目录 java'小秘 ...
- WPF入门教程系列二十三——DataGrid示例(三)
DataGrid的选择模式 默认情况下,DataGrid 的选择模式为“全行选择”,并且可以同时选择多行(如下图所示),我们可以通过SelectionMode 和SelectionUnit 属性来修改 ...
- WPF入门教程系列(二) 深入剖析WPF Binding的使用方法
WPF入门教程系列(二) 深入剖析WPF Binding的使用方法 同一个对象(特指System.Windows.DependencyObject的子类)的同一种属性(特指DependencyProp ...
- Difference between JDK, JRE and JVM
With Java programming language, the three terms i.e. JDK, JRE and JVM will always be there to unders ...
- java学习之Java中JDK,JRE和JVM之间的关系(转载)
最近要重新抓一下java,大量扫技术文档,保存下来供自己查阅.以下转载自http://www.cnblogs.com/xiaofeixiang/p/4085159.html 初学JAVA很容易被其中的 ...
- java多线程系列(二)
对象变量的并发访问 前言:本系列将从零开始讲解java多线程相关的技术,内容参考于<java多线程核心技术>与<java并发编程实战>等相关资料,希望站在巨人的肩膀上,再通过我 ...
- java多线程系列(二)---对象变量并发访问
对象变量的并发访问 前言:本系列将从零开始讲解java多线程相关的技术,内容参考于<java多线程核心技术>与<java并发编程实战>等相关资料,希望站在巨人的肩膀上,再通过我 ...
- Java中JDK,JRE和JVM之间的关系
初学JAVA很容易被其中的很多概念弄的傻傻分不清楚,首先从概念上理解一下吧,JDK(Java Development Kit)简单理解就是Java开发工具包,JRE(Java Runtime Envi ...
- Java基础知识 ——JDK,JRE和JVM
1.开发简单的Java程序过程: 名词解释: JDK:JDK是 Java 语言的软件开发工具包,主要用于移动设备.嵌入式设备上的java应用程序.JDK是整个java开发的核心,它包含了JAVA的运行 ...
随机推荐
- net core Webapi基础工程搭建(三)——在线接口文档Swagger
目录 前言 Swagger NuGet引用第三方类库 别急,还有 没错,注释 小结 前言 前后分离的好处,就是后端埋头做业务逻辑功能,不需要过多考虑用户体验,只专注于数据.性能开发,对于前端需要的数据 ...
- 使用maven搭建ssm框架环境
1.前言 因为经常换环境,在搭ssm框架的时候老是出错,所以记录一下最近搭建的环境,以供参考. 本文讲解如何使用maven搭建ssm框架,并能用于简单的登录注册. IDE:IDEA,JDK版本:1.8 ...
- JVM(十三):后端编译优化
JVM(十三):后端编译优化 在 JVM(一):源文件的转变 中我们介绍了 Java 中的前端优化,即将 Java 源代码转换为字节码文件.在本文中,我们将介绍字节码文件如何转换为本地机器码,并如何对 ...
- Leetcode之二分法专题-275. H指数 II(H-Index II)
Leetcode之二分法专题-275. H指数 II(H-Index II) 给定一位研究者论文被引用次数的数组(被引用次数是非负整数),数组已经按照升序排列.编写一个方法,计算出研究者的 h 指数. ...
- SpringBoot_@valid_参数校验
SpringBoot @valid 参数校验 空检查 @Null 验证对象是否为null @NotNull 验证对象是否不为null, 无法查检长度为0的字符串 @NotBlank 检查约束字符串是不 ...
- Nginx总结(五)如何配置nginx和tomcat实现反向代理
前面讲了如何配置Nginx虚拟主机,大家可以去这里看看nginx系列文章:https://www.cnblogs.com/zhangweizhong/category/1529997.html 今天要 ...
- CodeForces 765 F Souvenirs 线段树
Souvenirs 题意:给你n个数, m次询问, 对于每次一次询问, 求出询问区间内绝对值差值的最小值. 题解:先按查询的右端点从小到大sort一下,然后对于塞入一个数的时候, 就处理出所有左端点到 ...
- Gym 100851 题解
A: Adjustment Office 题意:在一个n*n的矩阵,每个格子的的价值为 (x+y), 现在有操作取一行的值,或者一列的值之后输出这个和, 并且把这些格子上的值归0. 题解:模拟, 分成 ...
- UVA - 315 Network(tarjan求割点的个数)
题目链接:https://vjudge.net/contest/67418#problem/B 题意:给一个无向连通图,求出割点的数量.首先输入一个N(多实例,0结束),下面有不超过N行的数,每行的第 ...
- poj 3159 Candies(dijstra优化非vector写法)
题目链接:http://poj.org/problem?id=3159 题意:给n个人派糖果,给出m组数据,每组数据包含A,B,c 三个数,意思是A的糖果数比B少的个数不多于c,即B的糖果数 - A的 ...