什么是 JRE? Java运行时环境简介

Java 开发工具包 (JDK)、Java 虚拟机 (JVM) 和 Java 运行时环境 (JRE) 共同构成了强大的 Java 和 Jakarta EE 平台组件三重奏,用于开发和运行 Java 应用程序。 它们一起工作,让开发人员构建和运行 Java 程序。 我之前介绍过 JDK 和 JVM。 在此快速概述中,您将了解 JRE,它是 Java 的运行时环境。

实际上,运行时环境是一个旨在运行其他软件的软件。 JRE 作为Java 的运行环境,包含Java 类库、Java 类加载器和Java 虚拟机。 在这个系统中:

    类加载器负责正确加载类并将它们与核心 Java 类库连接起来。 JVM 负责确保 Java 应用程序拥有在您的设备或云环境中正常运行和执行所需的资源。 JRE 主要是那些其他组件的容器,并负责编排它们的活动。

在接下来的讨论中,我们将更深入地探讨这些组件如何协同工作。

安装 JDK、JRE 和 JVM

从安装的角度来看,无论何时您下载 JDK,它都将包含一个版本兼容的 JRE,而该 JRE 将包含一个默认的 JVM。 您还可以从 JDK 中单独下载 JRE,您可以从各种 JVM 中进行选择。 默认值适用于大多数实现,尤其是当您刚开始使用 Java 时。

什么是运行时环境?

一个软件程序需要执行,而要执行,就需要一个运行环境。过去,大多数软件都使用操作系统(OS)作为运行环境。 该程序在其所在的任何计算机内运行,并直接依赖于操作系统设置来访问资源; 内存、磁盘访问和网络访问等资源。 Java 运行时环境改变了这一切,至少对于 Java 程序而言。 对于 Java 和其他基于 JVM 的语言,JRE 在操作系统和实际程序之间创建了一个中介。 JRE 加载类文件并启动虚拟机 (JVM),以确保可以跨多个操作系统以一致的形式访问内存和其他系统资源。

用于 Java 的 WORA

首次推出时,Java 的“编写一次,随处运行”原则被认为是革命性的。 如今,它已成为许多软件系统的规范,包括 JavaScript 和 Python。

Java 运行时环境

我们可以将软件视为位于系统硬件之上的一系列层。 每一层都提供将由其上层使用(和需要)的服务。 Java 运行时环境产生了一个 JVM,它是一个运行在计算机操作系统之上的软件层,提供特定于 Java 的附加服务。 图 1 说明了这种安排。

国际数据集团

图 1. Java 运行时环境生成 JVM。

JRE 平滑了操作系统的多样性,确保 Java 程序可以在几乎任何操作系统上运行而无需修改。 它还提供增值服务。 自动内存管理是 JRE 最重要的服务之一,确保程序员不必手动控制内存的分配和重新分配。

简而言之,JRE 是一种适用于 Java 以及其他 JVM 语言(如 Scala 和 Groovy)的元操作系统。 这是一个典型的抽象示例,将底层操作系统抽象为一个一致的平台来运行 Java 应用程序。

JRE 如何与 JVM 一起工作

Java 虚拟机是负责执行实时 Java 程序的运行软件系统。 JRE 是磁盘上的软件组件,它获取已编译的 Java 代码(该代码是使用 JDK 编译的),将其与所需的库组合,并启动 JVM 来执行它。

JRE 包含您的 Java 程序需要运行的库和软件。 例如,Java 类加载器是 JRE 的一部分。 这个重要的软件将已编译的 Java 代码加载到内存中,并将代码连接到适当的 Java 类库(一个称为链接的过程)。

在我刚才描述的分层视图中,JVM 是由 JRE 创建的。 从包的角度来看,JRE 包含 JVM,如图 2 所示。JVM 是 JRE 的一部分——它是 JRE 创建的用于托管程序的活动、运行部分。 JRE 获取静态资产并将它们转变为托管正在运行的程序的正在运行的 JVM。

国际数据集团

图 2. 分层架构视图显示 JRE 包含 JVM、类加载器和 Java 类库。

安装和使用 JRE

虽然 JRE 有概念性的一面,但在现实世界中,它只是安装在计算机上的软件,其目的是运行您的 Java 程序。 作为开发人员,您将主要使用 JDK 和 JVM,因为它们是您用来开发和运行 Java 程序的平台组件。 作为 Java 应用程序用户,您会更多地参与 JRE,它允许您运行这些程序。

Java 9 重构了 Java 平台,因此 JRE 现在仅作为 JDK 的一部分提供。 当您想要使用 JLink 发布消费者应用程序时,您可以将捆绑的 JRE 与您的应用程序一起发布。 这样的包包含运行程序所需的所有组件。 出于我们的目的,我们将在 JDK 中使用 JRE。 您可以从 Oracle 的 Java SE 页面为您的系统下载最新的 JDK。 Windows 和 macOS 有自动安装程序来管理细节(比如设置路径)。 在 Linux 上,一个不错的选择是使用 SDKMan。 在任何情况下,您都希望从命令行获得 JRE,以便您可以使用 java 命令。

JRE 的版本

Java 运行时环境针对每个新版本的 Java 进行更新,其版本号与 Java 平台版本控制系统保持一致,例如 JRE 1.19 运行 Java 19。

许多计算机运行为 Java SE 开发的 JRE,它能够运行任何 Java 应用程序,无论它是如何开发的。 大多数移动设备都带有用于 Java ME 的 JRE,它已预安装在移动设备上,无法下载。 展望未来,应用程序通过 JLink 与自己的 JRE 捆绑在一起将成为常态。

下载 JDK 后,您可以在命令行上与包含的 JRE 进行交互,方法是键入 java -version,它会告诉您安装的是什么版本。 (在 POSIX 系统上,您始终可以使用以下命令检查安装位置, which java.)

devops 中的 JRE

JRE 在开发阶段不是很引人注目,它主要只是在您选择的操作系统或 IDE 中运行您的程序。 它在 devops 和系统管理中扮演的角色稍微突出一些,因为 JRE 用于监控和配置。

基本上,JRE 提供了您可以用来配置和控制 Java 应用程序特性的“旋钮”。 内存使用是一个典型的例子,是系统管理的基础。 虽然内存使用总是很重要,但它在云配置中至关重要,而 devops 是一种基于云的构建和运行软件的方法。 如果您在 devops 环境中工作,或者有兴趣扩展到 devops,那么最好了解 Java 内存的工作原理以及它在 JRE 中的监控方式。

DevOps 还是系统管理员?

DevOps 是一个相对较新的术语,它描述的是几十年来一直存在的东西,即开发和运营之间的互操作性。 从这个意义上说,devops 只是一种更新的方式来描述过去所谓的运营或系统管理。 与系统管理员一样,devops 的一个重要方面是管理执行软件所需的系统。 管理 JRE 是管理运行 Java 应用程序的系统的一部分。

Java 内存和 JRE

Java 内存由三个部分组成:堆、栈和元空间(以前称为 permgen)。

    元空间是 Java 保存程序不变信息(如类定义)的地方。 堆空间是 Java 保存变量内容的地方。 堆栈空间是 Java 存储函数执行和变量引用的地方。

自 Java 8 以来的 Java 内存管理

在 Java 8 之前,元空间被称为 permgen。 元空间除了是一个更酷的名字外,还对开发人员与 Java 内存空间交互的方式进行了重大改变。 以前,您会使用命令 java -XX:MaxPermSize 监控 permgen 空间的大小。 从 Java 8 开始,Java 会自动增加元空间的大小以满足程序的元需求。 Java 8 还引入了一个新标志, MaxMetaspaceSize,您可以使用它来限制元空间大小。

配置堆空间

堆空间是 Java 内存系统中最动态的部分。 您可以使用 -Xms-Xmx 标志告诉 Java 启动堆有多大,以及允许它变成多大。 了解如何根据特定程序需要调整这些标志是 Java 内存管理的一个重要方面。 理想的是使堆足够大以实现最有效的垃圾收集。 也就是说,您希望有足够的内存让程序运行,但您不希望它比必要的更大。

配置栈空间

堆栈空间是函数调用和变量引用排队的地方。 堆栈空间是 Java 编程中第二臭名昭著的异常的来源:StackOverflowError(第一个是 NullPointerException)。 堆栈溢出异常表明您已经用完了堆栈空间,因为保留了太多的堆栈空间。 通常,当一个或多个方法以循环方式相互调用时,您会遇到堆栈溢出,从而将越来越多的函数调用投入到堆栈中。

你使用 -Xss 开关配置堆栈起始大小。 然后堆栈根据程序的需要动态增长。

Java应用监控

尽管应用程序监控是 JVM 的一项功能,但 JRE 提供了配置选项,这是监控的必要基线。 有多种工具可用于监控 Java 应用程序,从经典的(如 Unix 命令 top) 到复杂的远程监控解决方案,如 Oracle 的基础设施监控。

在这些选项之间是可视化分析器,例如 VisualVM,它允许检查正在运行的 JVM。 这些工具可以跟踪热点和内存泄漏,以及观察系统中的整体内存消耗。

结论

Java 运行时环境是磁盘上的程序,它加载 Java 应用程序供 JVM 执行。 下载 JDK 时默认包含一个 JRE,每个 JRE 包含核心 Java 类库、Java 类加载器和 JVM。 了解 JVM、JDK 和 JRE 如何交互很有帮助,特别是对于在云和 devops 环境中工作。 在这些环境中,与在传统 Java 应用程序开发中相比,JRE 在监视和配置方面扮演着更重要的角色。

阅读更多

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注