Java虚拟机是一个程序,其目的是执行其他程序。 这是一个简要的观念,也是我们编码功夫***的示例之一。 JVM打破了当时的现状,并继续支持今天的编程创新。
1.JVM的用法和定义
JVM有两个主要功能:允许Java程序在任何设备或操作系统上运行(称为"一次写入,随处运行",即"Write once, run anywhere"原则),以及管理和优化程序内存。 当Java于1995年发布时,所有计算机程序都被写入特定的操作系统,程序n内存由软件开发人员管理。 所以说,JVM是一个新模式启示。
图-1:JVM高层视图
拥有JVM的技术定义是很有用的,那样,软件开发人员就可以通过常规的方式思考它。这可以分解表述如下:
- 技术定义:JVM是执行代码并为该代码提供运行时环境的软件程序的规范。
- 常规定义:JVM是我们运行Java程序的工作方式。 我们配置JVM的设置,然后依赖它来在执行期间管理程序资源。
当开发人员谈论JVM时,我们通常是指在一台机器上运行的进程,尤其是服务器,它代表并控制Java应用程序的资源使用情况。这些是参照JVM规范实现的的——所谓JVM规范,其描述了构建执行这些任务的程序的要求。
那么,谁开发和维护JVM?
——JVM由一些非常聪明的程序员、公司和开源组织来广泛部署、大量使用、升级开发和维护的。 OpenJDK项目是Sun Microsystems决定开源Java的后代。Sun被Oracle收购,OpenJDK继续通过Oracle来对Java管理,现在由Oracle工程师完成了大量繁重工作。
2.JVM中内存管理
与正在运行的JVM最常见的交互是检查堆(Heap)和堆栈(stack,简称为栈)中的内存使用情况。 最常见的调整是调优JVM的内存设置。
2.1.垃圾回收
在Java之前,所有程序内存都由程序员管理。 在Java中,程序内存由JVM管理。 JVM通过称为垃圾收集的进程来管理内存,该进程持续识别并消除Java程序中未使用的内存。 垃圾收集发生在正在运行的JVM中。
在早期,Java因为没有像C那样"接近源质(close the metal)"而受到很多批评,因此没有那么快。 垃圾收集过程尤其引起争议。 从那时起,已经提出了各种算法和方法,并用于垃圾收集。 随着兼容性开发和优化,垃圾收集得到了极大的改进。
注:接近源质是什么意思?
——当程序员说编程语言或平台"接近源质"时,我们的意思是开发人员能够以编程方式(通过编写代码)管理操作系统的内存。 从理论上讲,程序员可以通过规定使用多少以及何时丢弃它,以便从我们的程序中获得更多性能。 在大多数情况下,将内存管理委派给高度精炼的流程(如JVM)可以产生超过你自己管理的更好性能和更少错误。
3. JVM分为三部分
3.1.JVM规范
首先,JVM是一个软件规范。 以某种通告或宣告方式表达其要求,JVM规范强调其实现细节不在其规范中具体定义,以便在其实现中实现***的创造性(如下通告要求):
"要正确实现Java虚拟机,您只需要能够读取类文件格式并正确执行其中指定的操作。"
还有这样的例子,如J.S. 巴赫(Bach)曾经类似的描述过音乐创作:
"你所要做的就是在合适的时间触碰那正确的调调(就是音乐家或唱歌所说那个key,键)。"
因此,JVM所要做的就是正确运行Java程序。 听起来很简单,甚至可能从外面看起来也很简单,但这是一项艰巨的任务,特别是考虑到Java语言的强大功能和灵活性。
注意,JVM就是个虚拟的机器,可进一步描述如下:
JVM是一个以便携方式运行Java类(class)文件的虚拟机器机。 作为虚拟机,意味着JVM是底层实际机器的抽象——例如运行程序的服务器。 无论实际存在哪种操作系统或硬件,JVM都会为程序在其中运行创建可预测的环境。 但是,与真正的虚拟机不同,JVM不会创建虚拟操作系统。 将JVM描述为托管运行时环境或进程虚拟机会更准确。
3.2.JVM实现
实现JVM规范会产生一个实际的软件程序,这是一个JVM实现。 事实上,有许多JVM实现,包括开源和专有。 OpenJDK的HotSpot JVM是参考实现,并且仍然是世界上经过最彻底试验和测试(tried-and-tested)的代码库之一。 HotSpot也是最常用的JVM。
几乎所有许可的JVM都是作为OpenJDK和HotSpot JVM的分支而创建的,包括Oracle的许可JDK。 从OpenJDK创建许可分支的开发人员通常希望添加特定于操作系统的性能改进。 通常,您将JVM作为Java Runtime Environment(JRE)的捆绑部分下载和安装。
3.3.JVM实例
在JVM规范被实现并作为软件产品发布后,您可以下载并作为程序运行它。下载的程序是JVM的实例(或实例化版本)。
大多数时候,当开发人员谈论"JVM"时,我们指的是在软件开发或生产环境中运行的JVM实例。 您可能会说,"嘿,Solo,这个服务器上的JVM使用了多少内存?" 或者,"我无法相信我创建了一个循环调用,并且堆栈溢出错误导致我的JVM崩溃。这是一个新手错误啊!"
提示:软件规范是何物?
软件规范(或规范)是描述软件系统应如何操作的人类可读设计文档。规范的目的是为工程师编码创建一份清晰的描述和要求。
4.JVM加载和执行class文件
我们已经讨论了JVM在运行Java应用程序中的作用,但它如何执行其功能? 为了运行Java应用程序,JVM依赖于Java类加载器和Java执行引擎。
4.1.Java类加载器
Java中的所有东西都是类(或者每件东西都是一个类),所有Java应用程序都是从类构建的。 应用程序可以包含一个类或数千个。 为了运行Java应用程序,JVM必须将已编译的.class文件加载到可以访问它们的上下文(例如服务器)中。 JVM依赖于其类加载器来执行此功能。
Java类加载器是JVM的一部分,它将类加载到内存中并使它们可用于执行。 类加载器使用延迟加载和缓存等技术来使类加载尽可能高效。 也就是说,类加载不是(比如说)便携式运行时内存管理的史诗般的脑筋急转弯,也就是说这些技术相对简单。
每个Java虚拟机都包含一个类加载器。 JVM规范描述了在运行时查询和操作类加载器的标准方法,但JVM实现负责实现这些功能。 从开发人员的角度来看,底层的类加载器机制通常是一个黑盒子。注意,一般具体的JVM实现,也不止一个类加载器。
4.2.Java执行引擎
一旦类加载器完成了加载类的工作,JVM就开始在每个类中执行代码。 执行引擎是处理此功能的JVM组件。 执行引擎对于运行JVM至关重要。 实际上,出于所有实际目的,它就是JVM实例。
执行代码涉及管理对系统资源的访问。JVM执行引擎位于正在运行的程序(包括对文件、网络和内存资源的需求)和提供这些资源的操作系统之间。
4.3.执行引擎如何管理系统资源
系统资源可以分为两大类:内存和其他所有内容。
回想一下,JVM负责处理未使用的内存,垃圾收集是执行这种处理的机制。 JVM还负责分配和维护开发人员认为理所当然的参照性结构。 举个例子,JVM的执行引擎负责在Java中使用类似new关键字的东西,并将其转换为特定于操作系统的内存分配请求。
除了内存管理,执行引擎还管理文件系统访问和网络I/O的资源。 由于JVM可跨操作系统进行互操作,因此这绝非易事。 除了每个应用程序的资源需求外,执行引擎还必须响应每个OS环境。这就是JVM能够处理内部需求的方式。
5. JVM演变:过去,现在,未来
1995年,JVM引入了两个革命性的概念,这些概念从此成为现代软件开发的标准配置:"一次编写,随处运行"和自动内存管理。 软件互操作性在当时是一个大胆的概念,但今天很少有开发人员会三思而后行。 同样,虽然我们的工程先驱必须自己管理程序内存,但我这一代人是在垃圾收集器(garbage collection)中长大。
我们可以说James Gosling和Brendan Eich发明了现代编程,但在接下来的几十年里,成千上万的其他人已经完善并内置了他们的想法(编程方式的内部性的观念认知)。 虽然Java虚拟机最初只是用于Java,但现在它已经发展到支持许多脚本和编程语言,包括Scala,Groovy和Kotlin。 展望未来,很难看到未来JVM不是发展领域的重要组成部分(依然是突出的组成部分)。
6.结论
本文总览性对JVM进行了介绍,具体设计的内容还很多,这里就不一一展开了,可以看本号已发表的相关文章,以进一步了解。***,我以一张JVM组成图来总结本文,以更直观的方式认识和感知Java 虚拟机( Java virtual machine):
Java 虚拟机实现架构参考
本篇关于认知JVM精要组成的内容,就到这里了。具体的JVM不是小小的一篇网文就能全部搞定的。