核心基础:何为JRE?Java运行时环境须知总览

摘要:简而言之,JRE创建JVM并确保Java程序可以使用依赖项。

0.导引

Java开发工具包(JDK)、Java虚拟机(JVM)和Java运行时环境(JRE)共同构成了用于开发和运行Java应用程序的Java平台组件的强大功能。我之前介绍过JDK和JVM。在本快速教程中,您将了解JRE,它是Java的运行时环境。

核心基础:何为JRE?Java运行时环境须知总览

Java程序、JVM、JRE和JDK关系图

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

类加载器负责正确加载类并将它们与核心Java类库连接。

JVM负责确保Java应用程序具有在您的设备或云环境中运行和运行所需的资源。

JRE主要是其他组件的容器,负责协调其活动。

我们将在后续章节中深入探讨这些组件如何协同工作。

关于安装JDK、JRE和JVM问题:从安装的角度来看,无论何时下载JDK,它都将包含与版本兼容的JRE,并且该JRE将包含默认的JVM。您也可以单独从JDK下载JRE,您可以从各种JVM中进行选择。默认值适用于大多数实现,尤其是当您开始使用Java时。换句话说,只要成功安装了JDK,相应的JRE和JVM都是伴随而在的——配套的。

1.运行时环境是什么?

软件程序需要执行,并且需要一个环境才能运行。运行时环境(runtime environment l)加载类文件并确保可以访问内存和其他系统资源,以便来运行它们。过去,大多数软件使用操作系统(OS)作为其运行时环境。该程序在其所在的任何计算机内部运行,但依赖于操作系统设置来进行资源访问。在这种情况下,资源将会是内存和程序文件以及依赖项对象。 Java运行时环境改变了这一切,至少对Java程序而言。

关于Java的WORA当它首次推出时,Java的"一次编写,随处运行"(即WORA-write once, run anywhere)原则被认为是革命性的,但今天它已被采纳为大多数软件系统的标准。

2.Java运行时环境

我们可以将软件视为一系列位于系统硬件之上的层。 每个层都提供将供其上方的层使用(和需要)的服务。 Java Runtime Environment是一个在计算机操作系统之上运行的软件层,提供特定于Java的附加服务。

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

简而言之,JRE是一种用于Java程序的元OS。它(JRE)是抽象原则的典型应用示例,将底层操作系统抽象为运行Java应用程序的一致性平台。

3.JRE如何使用JVM工作

Java虚拟机是一个运行的软件系统,负责执行实时Java程序。JRE是磁盘上的系统,它接收您的Java代码,将其与必要的库相结合,并启动JVM来执行它。

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

在我刚才描述的分层视图中,JVM是由JRE创建的。 从包的角度来看,JRE包含JVM,如图1所示。

核心基础:何为JRE?Java运行时环境须知总览

JRE与JVM关系图

4.安装并应用JRE

虽然JRE有一个概念性认知,但在实际操作中,它只是安装在计算机上的软件,其目的是运行Java程序。作为开发人员,您将主要使用JDK和JVM,因为这些是用于开发和运行Java程序的平台组件。作为Java应用程序用户,您将更多地涉及JRE,是它来允许您运行这些程序的。

在大多数情况下,您的计算机将安装Java,并且JRE将包含在其中。如果您确实需要手动安装或升级,可以从Oracle下载当前的JRE版本。

关于JRE版本:Java RuntimeEnvironment针对每个新版本的Java进行更新,其版本号与Java平台版本控制系统一致,例如JRE 1.8运行Java 8。虽然您有多种JDK包可供选择(例如Enterprise Edition)或标准版),那与JRE不同。大多数计算机都运行为Java SE开发的JRE(Java SE自带的JRE),它能够运行任何Java应用程序,无论它是如何开发的(主要指不高于当前JDK版本的)。大多数移动设备都附带了JRE for Java ME,它预装在移动设备上,无法下载。

安装JRE后,您可以通过输入java -version在命令行上与它进行交互,它将告诉您安装了哪个版本。在POSIX系统上,您始终可以用which java检查java的安装位置。

5.运维中(Devops)的JRE

JRE在开发阶段并不十分明显,它主要只是在您选择的操作系统或IDE中运行程序。 JRE在devops和系统管理中扮演着更为突出的角色,因为它用于监视和配置。

基本上,JRE提供了用于配置和控制Java应用程序特性的"旋钮"。 内存使用是一个主要的例子,这就是系统管理的面包和黄油。 虽然内存使用总是很重要,但它在云配置中至关重要,而devops是基于云的技术。如果您在devops环境中工作,或者有兴趣转到devops,那么了解Java内存如何工作以及如何在JRE中监控它是一个好主意。

关于运维或系统管理员:Devops是一个新术语,但它描述了几十年来一直存在的事情,即开发和运营之间的互操作性。从这个意义上讲,devops只是以前被称为操作或系统管理的新术语。与sysadmin一样,devops的一个重要方面是管理执行软件所必需的系统。管理JRE是管理运行Java应用程序的系统的一部分。

6.Java内存和JRE

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

● 元空间(Metaspace):是Java保存程序不变的信息(如类定义)的地方。

● 堆空间(Heapspace):是Java保存可变内容的地方。

● 栈空间(Stackspace):是Java存储函数执行和变量引用的位置。

7.Java 8中的内存管理

在Java 8之前,metaspace被称为permgen。 除了是一个更酷的名称,元空间是开发人员如何与Java的内存空间交互的一个重大变化。以前,您将使用命令java -XX:MaxPermSize来监视permgen空间的大小。从Java 8开始,Java会自动增加元空间的大小,以适应程序的元需求。 Java 8还引入了一个新标志MaxMetaspaceSize,可用于限制元空间大小。

其他内存选项(堆和栈)在Java8中保持不变。

8.配置堆空间

堆空间(Heapspace)是Java内存系统中最动态的部分。您可以使用-Xms和-Xmx标志来告诉Java启动堆有多大,以及允许它变大的程度。了解如何针对特定程序需求调整这些标志是Java中内存管理的一个重要方面。理想的做法是使堆足够大以获得最有效的垃圾收集。也就是说,您希望允许程序运行足够的内存,但您不希望它超出必要的大小。

所以要酌情配置堆大小。

9.配置栈空间

堆栈空间(Stackspace,简称栈空间)是函数调用和变量引用排队的地方。栈空间是Java编程中第二大臭名昭着的错误的来源:栈溢出(stack overflow)异常(第一个是空指针异常)。栈溢出异常表示您已经用尽了堆栈空间,因为已经保留了太多东西在空间。通常,当一个或多个方法以循环方式相互调用时,您将获得堆栈溢出,从而将越来越多的函数调用投入到堆栈中。

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

10.Java应用监控

虽然应用程序监视是JVM的一个功能,但JRE提供了配置选项,这是监视的必要基准。 有许多工具可用于监控Java应用程序,从经典(如Unix命令top)到复杂的远程监控解决方案(如Oracle的基础架构监控)。

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

总结

Java Runtime Environment是磁盘上的程序,用于加载JVM执行的Java应用程序。 下载Java DevelopmentKit时默认包含JRE,每个JRE包括核心Java类库、Java类加载器和Java虚拟机。理解JVM,JDK和JRE如何交互是有帮助的,特别是在云和devops环境中工作。在这些环境中,JRE在监视和配置方面比在传统Java应用程序开发中发挥更大的作用。

相关推荐