leftso 61 0 2021-09-08
版权申明:本文为博主原创文章,未经博主允许不得转载。 https://www.leftso.com/blog/888.html
了解JDK、JRE 和 JVM 之间差异。JVM 在内部如何工作?什么是类加载器解释器JIT 编译器
 

1. Java 程序的执行

在深入了解 Java 内部之前,让我们先了解一下 Java 源文件是如何执行的。
  1. 我们Simple.Java使用编辑器或 IDE(集成开发环境)例如EclipseIntelliJ Idea在文件中编写 Java 源代码。
  2. 程序必须编译成字节码。Java 编译器 ( javac) 将源代码编译为Simple.class文件。
  3. 这个类文件可以通过JVM(Java虚拟机)在任何平台/操作系统中执行。
  4. JVM 将字节码转换为机器可以执行的本机机器代码。
Java 执行流程 Java 执行流程
 

2.什么是JVM?

Java 虚拟机(JVM) 是运行 Java 字节码的虚拟机。您可以通过将.java文件编译为文件来获得此字节码.class.class文件包含 JVM 理解的字节码。
在现实世界中,JVM 是一种规范,它提供了一个可以执行 Java 字节码的运行时环境。不同的供应商提供此规范的不同实现。例如,这个 wiki 页面列出了不同的 JVM 实现。
JVM 最流行的实现是由 Oracle Corporation 拥有和提供的Hotspot。(以前由 Sun Microsystems, Inc. 提供)。
JVM 使用许多高级技术为 Java 应用程序提供最佳性能,并结合了最先进的内存模型、垃圾收集器自适应优化器
JVM 有两种不同的风格——客户端服务器。尽管服务器和客户端 VM 相似,但服务器 VM 已经过专门调整以最大限度地提高峰值运行速度。它旨在执行长时间运行的服务器应用程序,这些应用程序需要尽可能快的运行速度,而不是快速启动时间或较小的运行时内存占用。开发人员可以通过指定-client或来选择他们想要的系统-server
JVM 之所以称为虚拟,是因为它提供了一个不依赖于底层操作系统和机器硬件架构的机器接口。这种与硬件和操作系统的独立性是 Java 程序“一次编写、随处运行”价值的基石。

2.1. JVM架构

JVM架构 JVM架构
2.1.1. 类加载器
类加载器是用于加载类文件的子系统。它执行三个主要功能,即类加载、链接和初始化。
  1. 加载中
    • 为了加载类,JVM 有 3 种类加载器。引导程序扩展程序应用程序类加载器。
    • 加载类文件时,JVM 发现某个任意类的依赖项 XYZ.class。
    • 首先引导类加载器尝试找到该类。它扫描rt.jarJRElib文件夹中的文件。
    • 如果未找到类,则扩展类加载器在jre\lib\ext文件夹中搜索类文件。
    • 同样,如果未找到类,则应用程序类加载器会搜索CLASSPATH系统环境变量中的所有 Jar 文件和类。
    • 如果任何加载器找到类,则类加载器加载类;否则ClassNotFoundException被抛出。
  2. 链接
    在类加载器加载类之后,执行链接。一个字节码验证器将验证生成的字节码是否正确与否。如果验证失败,我们将收到验证错误。它还为类中的静态变量和方法执行内存分配。
  3. 初始化
    这是类加载的最后阶段,这里所有的静态变量都将被赋值为原始值,静态块将被执行。
2.1.2. JVM 内存区域
JVM 内部的内存区域被分成多个部分来存储特定的应用程序数据。
  • 方法是存储类结构,如元数据、常量运行时池和方法代码。
  • 存储在应用程序执行期间创建的所有对象。
  • 堆栈存储局部变量和中间结果。所有这些变量都是创建它们的线程的本地变量。每个线程都有自己的 JVM 堆栈,在创建线程时同时创建。所以所有这样的局部变量都称为线程局部变量
  • PC 寄存器存储当前正在执行的语句的物理内存地址。在 Java 中,每个线程都有其独立的 PC 寄存器。
  • Java 也支持并使用本机代码。许多低级代码是用 C 和 C++ 等语言编写的。本机方法堆栈保存本机代码的指令。

2.2. JVM 执行引擎

分配给 JVM 的所有代码都由执行引擎执行。执行引擎读取字节码并一一执行。它使用两个内置的解释器JIT 编译器 将字节码转换为机器码并执行它
平台特定的解释器 平台特定的解释器
使用 JVM,解释器和编译器都生成本机代码。不同之处在于它们如何生成本机代码、优化程度以及优化的成本。

2.2.1. 口译员

JVM 解释器通过查找预定义的 JVM 指令到机器指令的映射,几乎将每个字节码指令转换为相应的本机指令。它直接执行字节码,不执行任何优化。

2.2.2. 即时编译器

为了提高性能,JIT 编译器在运行时与 JVM 交互,并将适当的字节码序列编译成本地机器代码。通常,JIT 编译器采用一个代码块(不是一次一个语句作为解释器),优化代码,然后将其转换为优化的机器代码。
JIT编译器默认情况下启用。您可以禁用 JIT 编译器,在这种情况下将解释整个 Java 程序。除了诊断或解决 JIT 编译问题外,不建议禁用 JIT 编译器。
 

3.什么是JRE?

Java运行时环境(JRE)是一个软件包,其中捆绑库(罐)和Java虚拟机,和其他组件用Java运行的应用程序。JVM 只是 JRE 发行版的一部分。
要执行任何 Java 应用程序,您需要在机器中安装 JRE。这是在任何计算机上运行 Java 应用程序的最低要求。
JRE 捆绑了以下组件 -
  1. Java HotSpot客户端虚拟机使用的DLL文件。
  2. Java HotSpot服务器虚拟机使用的 DLL 文件。
  3. Java 运行时环境使用的代码库属性设置资源文件。例如rt.jarcharsets.jar
  4. Java扩展文件,例如localedata.jar
  5. 包含用于安全管理的文件。其中包括安全策略(java.policy) 和安全属性(java.security) 文件。
  6. 包含小程序支持类的 Jar 文件。
  7. 包含供平台使用的TrueType 字体文件
JRE 可以作为 JDK 的一部分下载,也可以单独下载。JRE 依赖于平台。这意味着根据机器类型(操作系统和体系结构),您必须选择要导入和安装的 JRE 包。
例如,您不能64-bit32-bit机器上安装JRE 发行版。同样,Windows 的JRE 发行版在Linux 中也不起作用;反之亦然。
 

4.什么是JDK?

JDK 是 JRE 的超集。JDK 包含 JRE 的所有内容以及用于开发、调试和监视 Java 应用程序的开发工具。当您需要开发 Java 应用程序时,您需要 JDK 。
JDK 附带的几个重要组件如下:
  • appletviewer – 此工具可用于在没有 Web 浏览器的情况下运行和调试 Java 小程序
  • 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 – Java API for XML Binding (JAXB) API 的一部分。它接受一个 XML 模式并生成 Java 类
与 JRE 一样,JDK 也依赖于平台。所以当你为你的机器下载 JDK 包时要小心。
 

5. JDK、JRE 和 JVM 的区别

基于以上讨论,我们可以得出这三者之间的关系如下——
JRE = JVM + 运行 Java 应用程序的库。
JDK = JRE + 开发 Java 应用程序的工具。
JDK vs JRE vs JVM JDK vs JRE vs JVM
简而言之,如果您是编写代码的 Java 应用程序开发人员,则需要在您的机器上安装 JDK。但是,如果您只想运行用 Java 构建的应用程序,则只需在您的计算机中安装 JRE。
 

6、JDK、JRE、JVM相关面试题

如果你理解了我们在这篇文章中到目前为止所讨论的内容,那么面对任何面试问题都不会困难。不过,请准备好回答以下问题:
  1. 什么是JVM架构?

    已经详细说明了。
  2. Java 中有多少种类加载器?

    有 3 个类加载器。Bootstrap、扩展和应用程序类加载器。
  3. 类加载器如何在 Java 中工作?

    类加载器扫描它们的 jar 文件和类的预定义位置。他们扫描路径中的所有类文件并查找所需的类。如果找到,它们将加载、链接和初始化类文件。
  4. JRE 和 JVM 的区别?

    JVM 是执行 Java 应用程序的运行时环境的规范。Hotspot JVM 就是这种规范的一种实现。它加载类文件并使用解释器和 JIT 编译器将字节码转换为机器代码并执行它。
  5. 解释器和 JIT 编译器的区别?

    解释器逐行解释字节码并按顺序执行。这会导致性能不佳。JIT 编译器通过分析块中的代码来为这个过程添加优化,然后准备更优化的机器代码。
 

7. JDK 和 JRE 下载

您可以在 Oracle 的 Java 分发页面中找到特定于平台的 JDK 和 JRE 软件包。
例如,此页面列出了 Java 8 的所有可用 JDK 发行版。
JDK 8 发行版 JDK 8 发行版
同样,此页面中提供了 JRE 8 发行版。
JRE 8 发行版 JRE 8 发行版
提示:本文最后更新于【 2021-09-08 20:54:03 】,某些文章具有时效性,若有错误或已失效,请在下方留言

评论区域