Java 开发工具包 (JDK)、Java 虚拟机 (JVM) 和 Java 运行时环境 (JRE) 共同构成了 Java 和 雅加达 EE 平台组件的强大三重奏,用于开发和运行 Java 应用程序.它们一起工作,让开发人员构建和运行 Java 程序。我已经之前介绍过 JDK 和 虚拟机。 在这个快速概述中,您将了解 JRE,它是 Java 的运行时环境。
实际上,运行环境 是一种旨在运行其他软件的软件。 JRE 作为Java 的运行环境,包含Java 类库、Java 类加载器和Java 虚拟机。在这个系统中:
在接下来的讨论中,我们将更深入地探讨这些组件如何协同工作。
一个软件程序需要执行,而要执行,就需要一个运行环境。过去,大多数软件都使用操作系统(OS)作为运行环境。该程序在其所在的任何计算机内运行,并直接依赖于操作系统设置来访问资源;内存、磁盘访问和网络访问等资源。 Java 运行时环境改变了这一切,至少对于 Java 程序而言。对于 Java 和其他基于 JVM 的语言,JRE 在操作系统和实际程序之间创建了一个中介。 JRE 加载类文件并启动虚拟机 (JVM),以确保可以跨多个操作系统以一致的形式访问内存和其他系统资源。
我们可以将软件视为位于系统硬件之上的一系列层。每一层都提供将由其上层使用(和需要)的服务。 Java 运行时环境产生了一个 JVM,它是一个运行在计算机操作系统之上的软件层,提供特定于 Java 的附加服务。图 1 说明了这种安排。
JRE 平滑了操作系统的多样性,确保 Java 程序可以在几乎任何操作系统上运行而无需修改。它还提供增值服务。自动内存管理是 JRE 最重要的服务之一,确保程序员不必手动控制内存的分配和重新分配。
简而言之,JRE 是 Java 的一种元操作系统,以及其他 JVM 语言,如 Scala 和 Groovy。这是 抽像 的经典示例,将底层操作系统抽象为一致的平台以运行 Java 应用程序。
Java 虚拟机是负责执行实时 Java 程序的运行软件系统。 JRE 是磁盘上的软件组件,它获取已编译的 Java 代码(代码是使用 JDK 编译的),将其与所需的库组合,并启动 JVM 来执行它。
JRE 包含您的 Java 程序需要运行的库和软件。例如,Java 类加载器是 JRE 的一部分。这个重要的软件将已编译的 Java 代码加载到内存中,并将代码连接到适当的 Java 类库(称为 链接 的过程)。
在我刚才描述的分层视图中,JVM 是由 JRE 创建的。从包的角度来看,JRE 包含 JVM,如图 2 所示。JVM 是 JRE 的一部分——它是 JRE 创建的用于托管程序的活动、运行部分。 JRE 获取静态资产并将它们转变为托管正在运行的程序的正在运行的 JVM。
虽然 JRE 有概念性的一面,但在现实世界中,它只是安装在计算机上的软件,其目的是运行您的 Java 程序。作为开发人员,您将主要使用 JDK 和 JVM,因为它们是您用来开发和运行 Java 程序的平台组件。作为 Java 应用程序用户,您会更多地参与 JRE,它允许您运行这些程序。
Java 9 重新构建了 Java 平台,因此 JRE 现在仅作为 JDK 的一部分提供。当您想要发布消费者应用程序时,您可以使用 捷联 发布与您的应用程序捆绑在一起的 JRE。这样的包包含运行程序所需的所有组件。出于我们的目的,我们将在 JDK 中使用 JRE。您可以为您的系统下载最新的 JDK 来自 Oracle 的 Java SE 页面。 Windows 和 macOS 有自动安装程序来管理细节(比如设置路径)。在 Linux 上,一个不错的选择是使用 SDK人。在任何情况下,您都希望从命令行获得 JRE,以便您可以使用 java
命令。
Java 运行时环境针对每个新版本的 Java 进行更新,其版本号与 Java 平台版本控制系统一致,因此例如 JRE 1.19 运行 Java 19。
许多计算机运行为 Java SE 开发的 JRE,它能够运行任何 Java 应用程序,无论它是如何开发的。大多数移动设备都带有用于 Java ME 的 JRE,它已预安装在移动设备上,无法下载。展望未来,应用程序通过 JLink 与自己的 JRE 捆绑在一起将成为常态。
下载 JDK 后,您可以通过键入 java -version
在命令行中与包含的 JRE 交互,这将告诉您安装的版本。 (在 POSIX 系统上,您始终可以使用命令 which java
检查安装位置。)
JRE 在开发阶段不是很引人注目,它主要只是在您选择的操作系统或 IDE 中运行您的程序。它在 devops 和系统管理中扮演的角色稍微突出一些,因为 JRE 用于监控和配置。
基本上,JRE 提供了您可以用来配置和控制 Java 应用程序特性的“旋钮”。内存使用是一个典型的例子,是系统管理的基础。虽然内存使用总是很重要,但它在云配置中至关重要,而 devops 是一种基于云的构建和运行软件的方法。如果您在 devops 环境中工作,或者有兴趣扩展到 devops,那么最好了解 Java 内存的工作原理以及它在 JRE 中的监控方式。
Java 内存由三个部分组成:堆、栈和元空间(以前称为 permgen)。
在 Java 8 之前,元空间被称为永恒物。元空间除了是一个更酷的名字外,还对开发人员与 Java 内存空间交互的方式进行了重大改变。以前,您会使用命令 java -XX:MaxPermSize
来监视 permgen 空间的大小。从 Java 8 开始,Java 会自动增加元空间的大小以满足程序的元需求。 Java 8 还引入了一个新标志 MaxMetaspaceSize
,您可以使用它来限制元空间大小。
堆空间 是 Java 内存系统中最动态的部分。您可以使用 -Xms
和 -Xmx
标志来告诉 Java 启动堆有多大,以及允许它变成多大.了解如何根据特定程序需要调整这些标志是 Java 内存管理的一个重要方面。理想的是使堆足够大以实现最有效的垃圾收集。也就是说,您希望有足够的内存让程序运行,但您不希望它比必要的更大。
堆垛空间 是函数调用和变量引用排队的地方。堆栈空间是第二臭名昭著的 Java 中的异常 编程的来源:堆栈溢出错(第一个是空间指针异常). 堆垛涌出异常 表示您已用完堆栈空间,因为已保留了太多堆栈空间。通常,当一个或多个方法以循环方式相互调用时,您会遇到堆栈溢出,从而将越来越多的函数调用投入到堆栈中。
您使用 -Xss
开关来配置堆栈起始大小。然后堆栈根据程序的需要动态增长。
尽管应用程序监控是 JVM 的一项功能,但 JRE 提供了配置选项,这是监控的必要基线。有多种工具可用于监视 Java 应用程序,从经典工具(如 Unix 命令 top
)到复杂的远程监视解决方案(如 Oracle 的基础设施监视)。
在这些选项之间是可视化分析器,例如 虚拟机,它允许检查正在运行的 JVM。这些工具可以跟踪热点和内存泄漏,以及观察系统中的整体内存消耗。
Java 运行时环境是磁盘上的程序,它加载 Java 应用程序供 JVM 执行。下载 JDK 时默认包含一个 JRE,每个 JRE 包含核心 Java 类库、Java 类加载器和 JVM。了解 JVM、JDK 和 JRE 如何交互很有帮助,特别是对于在云和 devops 环境中工作。在这些环境中,与在传统 Java 应用程序开发中相比,JRE 在监视和配置方面扮演着更重要的角色。
地址:https://www.cundage.com/article/3304858-what-is-the-jre-introduction-to-the-java-runtime-environment.html