什么是JVM?Java虚拟机简介
Java虚拟机是旨在执行其他程序的程序。这是一个简单的想法,也是我们对功夫进行编码的最大范例之一。JVM破坏了其现状,并在今天继续支持编程创新。
JVM的用途
JVM具有两个主要功能:允许Java程序在任何设备或操作系统上运行(称为“一次编写,随处运行”原则),以及管理和优化程序内存。1995年发布Java时,所有计算机程序均写入特定的操作系统,并且程序存储器由软件开发人员管理。因此,JVM是一个启示。
对JVM进行技术定义很有用,并且软件开发人员每天都会考虑它。让我们分解一下:
技术定义:JVM是执行代码并为该代码提供运行时环境的软件程序的规范。
日常定义:JVM是我们运行Java程序的方式。我们配置JVM的设置,然后在执行期间依靠它来管理程序资源。
当开发人员谈论JVM时,我们通常是指在机器上运行的进程,尤其是在服务器上运行的进程,它代表并控制Java应用程序的资源使用情况。将此与JVM规范进行对比,后者描述了构建执行这些任务的程序的要求。
JVM中的内存管理
与正在运行的JVM的最常见交互是检查堆和堆栈中的内存使用情况。最常见的调整是调整JVM的内存设置。
垃圾收集
在Java之前,所有程序存储器都由程序员管理。在Java中,程序内存由JVM管理。JVM通过称为垃圾收集的过程来管理内存,该过程不断识别并消除Java程序中未使用的内存。垃圾收集发生在正在运行的JVM中。
在早期,Java受到了很多批评,因为它不像C ++那样“贴近金属”,因此不如C ++快。垃圾收集过程特别有争议。从那时起,已经提出了各种算法和方法并将其用于垃圾收集。通过持续的开发和优化,垃圾回收有了很大的改善。
JVM分为三部分
可以说JVM有三个方面:规范,实现和实例。让我们考虑其中的每一个。
1. JVM规范
首先,JVM是一种软件规范。在一定程度上循环方式,JVM规范亮点,它的实施细节不规范中定义,以允许其实现最大的创意:
“要正确实现Java虚拟机,您只需读取
class
文件格式并正确执行其中指定的操作即可。”
巴赫(JS Bach)曾经描述过类似的音乐创作:
“您要做的就是在正确的时间触摸正确的键。”
因此,JVM所有要做的就是正确运行Java程序。听起来很简单,甚至从外面看起来也很简单,但这是一项艰巨的任务,特别是考虑到Java语言的强大功能和灵活性。
2. JVM实现
实现JVM规范会产生一个实际的软件程序,它是一个JVM实现。实际上,有许多JVM实现,包括开源的和专有的。OpenJDK的HotSpot JVM是参考实现,并且仍然是世界上经过最彻底测试和测试的代码库之一。HotSpot也是最常用的JVM。
几乎所有许可的JVM都是作为OpenJDK和HotSpot JVM的分支创建的,包括Oracle的许可的JDK。开发人员通常是出于对OpenJDK创建许可分支的渴望,他们希望添加特定于操作系统的性能改进。通常,您将Java 虚拟机作为Java Runtime Environment(JRE)的捆绑部分下载并安装。
3. JVM实例
在实现JVM规范并将其作为软件产品发布后,您可以将其下载并作为程序运行。该下载的程序是JVM的实例(或实例化版本)。
大多数时候,当开发人员谈论“ JVM”时,我们指的是在软件开发或生产环境中运行的JVM实例。您可能会说:“嗨,阿南德,该服务器上的JVM使用多少内存?” 或者,“我不敢相信我创建了一个循环调用,并且堆栈溢出错误使我的JVM崩溃了。这是一个新手错误!”
在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的执行引擎负责采用new
Java中的关键字之类的内容,并将其转换为特定于OS的内存分配请求。
除了内存之外,执行引擎还管理用于文件系统访问和网络I / O的资源。由于JVM可跨操作系统互操作,因此这绝非易事。除了每个应用程序的资源需求之外,执行引擎还必须响应每个OS环境。这就是JVM能够处理狂野需求的方式。
JVM的演变:过去,现在,未来
在1995年,JVM引入了两个革命性的概念,它们成为现代软件开发的标准功能:“一次编写,随处运行”和自动内存管理。当时,软件互操作性是一个大胆的概念,但是如今很少有开发人员会对此三思而后行。同样,虽然我们的工程先行者必须自己管理程序存储器,但我这一代人还是随垃圾收集一起成长的。
可以说James Gosling和Brendan Eich发明了现代编程,但是在接下来的几十年中,成千上万的人已经完善并建立了自己的思想。Java虚拟机最初仅用于Java,而如今已发展为支持许多脚本和编程语言,包括Scala,Groovy和Kotlin。展望未来,很难看到JVM不在开发领域中占主导地位的未来。
长按识别