什么是JVM?Java虚拟机简介

JVM管理内存,并为基于Java的应用程序提供可移植的执行环境。

在这里插入图片描述
Java虚拟机是一个旨在执行其他程序的程序。这是一个简单的想法,也是我们最伟大的编码功夫的例子之一。JVM颠覆了当时的现状,并在今天继续支持编程创新。

JVM的使用和定义

JVM有两个主要功能:允许Java程序在任何设备或操作系统上运行(称为“一次写入,随处运行”原则),以及管理和优化程序内存。当Java在1995年发布时,所有的计算机程序都被写入一个特定的操作系统,程序内存由软件开发人员管理。所以JVM是令人耳目一新的。
Figure 1: High-level view of the JVM
Figure 1: High-level view of the JVM

对JVM有一个专业定义是很有用的,而且软件开发人员每天都会考虑这个定义。让我们把这些分解一下:

  • 技术定义:JVM是执行代码并为代码提供运行时环境的软件程序的规范。
  • 日常定义:JVM是我们运行Java程序的方式。我们配置JVM的设置,然后依赖它在执行期间管理程序资源。

当开发人员谈到JVM时,我们通常指的是在机器上运行的进程,特别是服务器,它表示并控制Java应用程序的资源使用。与JVM规范相比,JVM规范描述了构建执行这些任务的程序的需求。

谁开发和维护JVM?
JVM被广泛部署、大量使用,并由一些非常聪明的程序员维护,包括公司程序员和开源程序员。OpenJDK项目是Sun微系统决定使用开源Java的产物。OpenJDK一直延续着Oracle对Java的管理,如今大部分繁重的工作都是由Oracle工程师完成的。

JVM中的内存管理

与正在运行的JVM最常见的交互是检查堆和堆栈中的内存使用情况。最常见的调整是调整JVM的内存设置。

垃圾收集

在Java之前,所有的程序内存都是由程序员管理的。在Java中,程序内存由JVM管理。JVM通过一个称为垃圾收集的进程来管理内存,垃圾收集连续地标识和消除Java程序中未使用的内存。垃圾收集发生在运行的JVM中。

在早期,Java受到了很多批评,因为它不像C++那样“close to the metal”,因此没有那么快。垃圾收集过程特别有争议。从那时起,各种各样的算法和方法被提出并用于垃圾收集。通过不断的开发和优化,垃圾收集得到了极大的改进。

’close to the metal’ 是什么意思?
当程序员说编程语言或平台“close to the metal’”时,我们的意思是开发人员能够以编程方式(通过编写代码)管理操作系统的内存。从理论上讲,程序员可以通过规定使用多少以及何时放弃,从我们的程序中榨取更多的性能。在大多数情况下,将内存管理委托给像JVM这样高度优化的进程会比自己做得到更好的性能和更少的错误。

JVM分为三部分

可以说JVM有三个方面:规范、实现和实例。让我们分别阐述。

1. JVM规范

首先,JVM是一个软件规范。在某种循环的方式中,JVM规范强调了它的实现细节不是在规范内定义的,以便在其实现中获得最大的创造性:

要正确实现Java虚拟机,您只需要能够读取类文件格式并正确执行其中指定的操作

J.S. Bach曾经描述过创造音乐的相似之处:

“你所要做的就是在正确的时间按正确的键。”

因此,JVM所要做的就是正确运行Java程序。听起来很简单,从外部看起来也很简单,但这是一项艰巨的任务,特别是考虑到Java语言的灵活性和灵活性。

作为虚拟机的JVM
JVM是以可移植的方式运行Java类文件的虚拟机。作为一个虚拟机意味着JVM是一个底层的、实际的机器的抽象——比如程序运行的服务器。不管实际存在什么操作系统或硬件,JVM都会为程序创建一个可预测的运行环境。然而,与真正的虚拟机不同,JVM并不创建虚拟操作系统。将JVM描述为托管运行时环境或进程虚拟机会更准确。

2. JVM实现

实现JVM规范会产生一个实际的软件程序,这就是JVM实现。事实上,有很多JVM实现,包括开源和私有的。OpenJDK的HotSpot JVM是参考实现,它仍然是世界上经过最彻底测试的代码库之一。HotSpot 也是最常用的JVM。

几乎所有的授权JVM都是作为OpenJDK和HotSpot JVM的分叉创建的,包括Oracle的授权JDK。开发人员在OpenJDK上创建许可fork通常是出于添加特定于OS的性能改进的愿望。通常,您将下载并安装JVM作为Java运行时环境(JRE)的捆绑部分。

3. 一个JVM实例

在JVM规范作为软件产品实现并发布之后,您可以下载并作为程序运行它。下载的程序是JVM的一个实例(或实例化版本)。

大多数时候,当开发人员谈论“JVM”时,我们指的是在软件开发或生产环境中运行的JVM实例。您可能会说,“嘿,Anand,服务器上的JVM使用了多少内存?”或者,“我不敢相信我创建了一个循环调用,堆栈溢出错误导致JVM崩溃。真是个新手犯的错误!”

什么是软件规范?
软件规范(spec)是一种人类可读的设计文档,描述了软件系统应该如何运行。规范的目的是为工程师创建一个清晰的描述和要求。

在JVM中加载和执行类文件

我们已经讨论过JVM在运行Java应用程序中的作用,但是它是如何执行其功能的呢?为了运行Java应用程序,JVM依赖于Java类加载器和Java执行引擎。

JVM中的Java类加载器

Java中的一切都是一个类,所有Java应用程序都是从类构建的。一个应用程序可以由一个类或数千个类组成。为了运行Java应用程序,JVM必须将编译后的.class文件加载到一个上下文中,例如服务器中,以便访问它们。JVM依赖其类加载器来执行此函数。

Java类加载器是JVM的一部分,它将类加载到内存中并使它们可供执行。类加载器使用诸如延迟加载和缓存之类的技术使类加载尽可能高效。也就是说,类加载并不像(比如)可移植运行时内存管理那样是一个史诗般的脑筋急转弯,所以技术相对简单。

每个Java虚拟机都包含一个类加载器。JVM规范描述了在运行时查询和操作类加载器的标准方法,但是JVM实现负责实现这些功能。从开发人员的角度来看,底层的类装入器机制通常是一个黑盒。

JVM中的执行引擎

类装入器完成装入类的工作后,JVM开始在每个类中执行代码。执行引擎是处理此函数的JVM组件。执行引擎对于正在运行的JVM至关重要。实际上,出于所有实际目的,它都是JVM实例。

执行代码涉及管理对系统资源的访问。JVM执行引擎位于正在运行的程序(包含对文件、网络和内存资源的需求)和提供这些资源的操作系统之间。

执行引擎如何管理系统资源

系统资源可以分为两大类:内存和其他所有资源。

回想一下,JVM负责处理未使用的内存,而垃圾收集是处理未使用内存的机制。JVM还负责分配和维护开发人员认为理所当然的引用结构。例如,JVM的执行引擎负责获取Java中的new关键字,并将其转换为特定于OS的内存分配请求。

除了内存,执行引擎还管理用于文件系统访问和网络I/O的资源。由于JVM可以跨操作系统进行互操作,这并不是一项简单的任务。除了每个应用程序的资源需求之外,执行引擎还必须响应每个操作系统环境。这就是JVM在各种需求下的处理方式。

JVM演进:过去、现在、未来

1995年,JVM引入了两个革命性的概念,这两个概念后来成为现代软件开发的标准模式:“一次编写,随处运行”和自动内存管理。软件互操作性在当时是一个大胆的概念,但今天很少有开发人员会对此三思而后行。同样,尽管我们的工程前辈必须自己管理程序内存,但我们这一代人是在垃圾收集中长大的。

我们可以说詹姆斯戈斯林和布伦丹艾奇发明了现代编程,但在接下来的几十年里,成千上万的其他人已经改进并建立了他们的思想。尽管Java虚拟机最初只是针对Java的,但今天它已经发展到支持许多脚本和编程语言,包括Scala、Groovy和Kotlin。展望未来,很难看到JVM不是开发环境的重要组成部分的未来。

原文:What is the JVM? Introducing the Java Virtual Machine

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值