赞
踩
本文翻译自javaworld,英文原文链接https://www.javaworld.com/article/3272244/what-is-the-jvm-introducing-the-java-virtual-machine.html
Java虚拟机有两个主要功能:允许Java程序在任何设备和操作系统上运行("Write once,run anywhere"--一次编写,到处运行。),并且可以管理和优化程序存储。当Java在1995年被发布时,所有的计算机程序都需要在指定的操作系统上编写,并且程序在内存中的存储是由程序员管理的。所以Java虚拟机是一个让人意想不到的启示。
知道JVM的技术定义是很有用的,当然程序员也可以用自己的方式去理解去解释JVM的定义。
每当开发者谈起Java虚拟机时,我们通常是指在机器上运行的过程,特别是服务器,它代表并控制Java应用的资源使用。这与Java虚拟机规范(JVM specification)相比,后者是在描述构建一个程序并执行这些任务的要求。
那么Java虚拟机是由谁开发和维护的呢? |
---|
Java虚拟机被广泛的部署,大量的使用,并且由一些聪明的开发者去维护,包括企业版开源版。OpenJDK是Sun公司决定开源Java之后的结果。尽管Oracle公司接过了管理Java的工作,也没有影响OpenJDK的继续,现在大量繁重的工作都由Oracle的工程师在完成。 |
与Java虚拟机最常见的互动(interaction with)就是检查堆和栈中的内存使用情况,最常见的调整就是调整JVM的内存设置(也就是常用的设置堆的最大空间,栈的最大空间,使用哪种垃圾回收算法等)。
垃圾回收
在Java之前,所有的程序存储都是由开发者去管理的。在Java中,程序存储由Java虚拟机管理。Java虚拟机通过垃圾回收机制来管理内存,它将持续识别并消除Java程序中的无用内存。垃圾回收发生在JVM运行期间。
在早期,Java由于没有像C++那样“Close to metal(CTM)”而受到了许多的批评,因为它没有那么快。Java垃圾回收过程受到了极大的争议。从那时起,各种算法和方法被提出并使用到垃圾回收过程中。经过持续的调整和优化,垃圾回收机制有了极大的提高。
“Close to the metal”是什么意思? |
---|
当程序员说一个编程语言或者一个平台“接近金属”时,意思就是开发者可以通过编程的方式(编写代码)去管理操作系统的内存。 理论上,程序员可以通过规定决定使用多少内存并决定何时去释放内存来获取更多的性能提升。在多数情况下,通过委托给一个像Java虚拟机这样实现了高度精炼的垃圾回收过程的第三方去管理内存你将获得更好的性能和更少的错误。 |
也可以说JVM有三个方面:规范,实现和实例。让我们分别看看每一个。
1.JVM规范
第一,JVM是一个软件规范。JVM强调它的实现细节没有在JVM规范中被定义,以便在它的实现中允许最大化的创造性。
"To implement the Java virtual machine correctly, you need only be able to read the class
file format and correctly perform the operations specified therein."
"要正确的实现Java虚拟机,你只需要可以读取class格式类文件并正确的执行其中的指定操作。"
巴赫曾经描述过创作音乐的简单程度。
"All you have to is touch the right key at right time".
"你要做的就是在正确的时间触摸正确的键".
所以JVM要做的就是去正确的运行Java程序。听起来简单,可能从外面开起来也很简单。但不得不说这是一项艰巨的任务,特别是考虑到Java语言的强大功能和灵活性而言。
JVM作为一个虚拟机 |
---|
JVM是一个以可移植的方式运行class文件的虚拟机,作为一个虚拟机意味着JVM是底层实际机器的抽象,就像运行程序的服务器一样。无论实际上是在什么操作系统或者硬件中,JVM都会为程序创造一个可预测环境在其中运行。与真正的虚拟机不同,JVM不能创建一个虚拟的操作系统。将JVM描述为一个托管运行时环境或者虚拟机进程会更加的准确。 |
2.JVM实现
实现JVM规范会产生一个实际的软件程序,也就是一个JVM实现。事实上,有许多的JVM实现,包括开源的和私有的。OpenJDK中的HotSpot JVM是参考实现,并且是世界上彻底实现尝试和测试的代码库之一。HotSpot也是最常用的JVM。
几乎所有的被许可的JVM都是作为OpenJDK和HotSpot的分支创建的,包括Oracle的 licensed JDK。从OpenJDK创建许可分支的开发人员通常希望添加针对特定操作系统的性能改进。通常,你会将JVM下载为JRE的捆绑部分。
3.JVM实例
在JVM规范被作为一个软件产品实现并发布后,你会将它作为一个程序下载并运行。这个你所下载的程序就是一个JVM实例(或者一个实例化版本)。
大多数时候,当开发者谈起JVM,我们指的是一个在软件开发或者生产环境中运行的JVM实例。你可能会说,”hey,小爱同学,JVM在服务器中使用了多少内存啊?",或者是,”我简直不能相信,我只是写了一个循环调用,一个栈溢出异常(StackOverflow)就导致了我的JVM崩溃,真是个新手"。
什么是软件规范 |
---|
软件规范是一个可读的设计文档,它描述了一个软件系统该怎样去操作。这个规范的目的是为程序员编码提供一个清晰的描述和要求。 |
我们已经讨论过JVM在运行java应用时所扮演的角色,但是它是怎么去执行它的方法的呢?为了运行Java应用,JVM需要Java类加载器和Java执行引擎。
JVM中的类加载器
在Java中一切都是类,所有的Java应用都是基于类创建的。一个Java应用可能包括一个或者成千个类。为了运行Java应用,JVM必须将.class文件加载到可以访问它们的上下文中(例如服务器)。JVM依靠它的类加载器去执行此功能。
类加载器是JVM的一部分,它将类信息加载到内存中,并将它们变得可以被执行。类加载器使用延时加载和缓存技术将类加载变得尽可能的高效。也就是说,类加载在便携内存管理这方面不是一个非常困难的脑筋急转弯,相反这项技术是相对简单的。
所有的JVM都包含类加载器。JVM规范是描述在运行期间如何查询和操纵类加载器的标准方法,而JVM实现则负责去实现这些功能。从开发者的角度来看,底层的类加载器机制通常是个黑盒。
JVM执行引擎
一旦类加载器开始类加载的工作,JVM就开始执行每一个类中的代码。执行引擎就是处理此功能的JVM组件。执行引擎对于运行JVM是至关重要的。事实上,为了所有实际目的,它就是一个JVM实例。
执行代码包括管理系统资源的访问。执行引擎位于运行的程序(包括对文件,网络和内存资源的需求)和提供这些资源的操作系统之间。
执行引擎如何管理系统资源?
系统资源可以被分为两大类:内存和其他所有资源。
回想之前所说的JVM负责处理未使用过的内存,而垃圾回收就是处理的机制。JVM还负责分配和维护开发人员认为理所当然的参考结构。例如,执行负责处理Java中向new这样的关键字,并将之转换成指定系统的需要的内存分配请求。
在内存之上,执行引擎还管理文件系统的访问和网络I/O资源。由于JVM可以跨操作系统进行相互操作,因此这绝对不是一件简单的事。除了每个应用的资源需求外,执行引擎还必须响应每个操作系统环境。这就是JVM可以处理大量请求的原因。
1995年,JVM提出了两个革命性的概念,这两个概念后面变成了现代软件开发的标准:“一次编写,到处运行”和自动化内存管理。软件互操作性在当时是一个大胆的概念,但是现在很少开发者会对它三思而后行。同样,我们的程序员前辈都是自己去管理程序存储,而我们这一代则成长于垃圾回收机制之上。
我们可以说是James Gosling和Brendan Eich发明了现代编程,但是是成百上千个其他的工程师在之后的时间里去改进并实现了他们的想法。Java虚拟机在最初的时候只能够服务于Java,在今天,它已经发展到可以支持许多的脚本语言和编程语言,包括Scala,Groovy,Kotlin。展望未来,我们很难去说JVM不是未来编程发展前景的重要组成部分。
这个世界上有三样东西是别人抢不走的,吃进肚子里的饭,读进脑子里的书,还有藏在心中的梦想。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。