Java虚拟机(JVM)
发布日期:2021-06-30 17:51:26 浏览次数:2 分类:技术文章

本文共 4706 字,大约阅读时间需要 15 分钟。

Java虚拟机(JVM)是能够让计算机运行Java程序的虚拟且可以计算运作的机器。JVM有三个概念:规范文档、实现和实例。规范文档是规范地说明Java虚拟机必须有哪些实现的文档。单一的规范文档保证了所有的实现是彼此协作、能够共同使用的。一个Java虚拟机是满足JVM规范文档所要求的计算机程序。一个Java虚拟机实例是被编译成Java字节码且是计算机程序中正在运行的进程一个实现。

Java运行时环境(JRE)是包含运行Java程序所必需的软件包。它包含Java虚拟机的实现以及Java类库。Java商标的拥有者Oracle公司(甲骨文),他们发布的Java运行时环境(一起的还有Java虚拟机)被称为Hotpot

Java开发工具包(JDK)是JREJava编程工具(比如Java编译器)的超集合。Java开发工具包是由Oracle公司管理,由Oracle公司直接提供或者OpenJDK开源项目提供的免费工具包。

Java规格说明文档:

Java虚拟机是由规范说明文档定义的抽象(虚拟)的计算机。这个规范说明省略了非本质的、不是特别重要的实现细节以确保相互协作性和共同操作性。举一个例子,运行时数据区域的内存布局、垃圾回收算法的使用以及任何内部最佳的Java虚拟机指令(机器码的转换方法)。这个省略的主要原因是没有必要约束Java虚拟机的实现者。任何Java应用可以运行在实现了Java规范文档的Java虚拟机上面。

JavaPlatformStandardEditionJ2SE5.0开始,在JavaCommunity Process的努力下,Java虚拟机规范文档已经发展成JSR924。截止2006Java规范文档被提议成为类文件规范(JSR202),最后成为JSR924的维护版本。这个Java虚拟机规范文档被出版成了蓝皮书。它的序言是这样子的:

我们试图让这个Java虚拟机规范说明文档成为高效的、尽可能兼容的和清晰明了的实现。甲骨文公司提供验证了Java虚拟机合适的实现操作的测试。

HotSpot是甲骨文公司的Java虚拟机之一,其他的,继承自BEASystems的是JRockit。清晰明了的实现包括KaffeIBMJ9.因为甲骨文拥有Java的商标,所以它或许允许Java的使用保证完全兼容甲骨文自己的规范说明。

类装载器(Classloader

类(class)是Java虚拟机字节码的组织单位之一。一个类装载器的实现必须能够识别和装载任何与Java类文件格式一致的文件。任何实现可以自由地识别其他二进制形式的文件,不仅仅是class文件,但是它必须能够识别class文件。

类装载器严格按照下面三个基本活动顺序执行。

1、装载:查找和导入相关类型的二进制数据。

2、链接:检验、准备和(可选)解析。

检验:确保导入的文件类型是正确的。

准备:在内存中创建类变量并且初始化默认值。

解析:把象征性(间接性)引用转变成直接引用。

3、初始化:调用Java代码给类的变量初始化它们适当的开始值。

一般情况下有两种类加载器:bootstrap类加载器和用户定义的类加载器。每一个Java虚拟机实现必须有一个bootstrap类加载器,用于加载可信任的类文件。但是Java虚拟机规范文档不明确指出类装载器如何定位类文件。

字节码指令

Java虚拟机有以下组指令:

Load andstore加载和存储,Arithmetic算法,Type conversion类型转换,Object creation and manipulation对象的创建和操作,Operand stack management (push / pop)操作数栈的管理(入栈/出栈),Controltransfer (branching) 转换控制(分支),Methodinvocation and return方法的调用和返回,Throwing exceptions异常的抛出,Monitor-based concurrency并发的基本管理。它的目的是二进制的兼容性。每一个特定的操作系统需要自己的Java虚拟机和运行时的实现。这些Java虚拟机以相同的方式解释二进制码,但是实际的实现可能是不同的。能够兼容性强和高效地实现Java的核心接口(这些接口必须映射成每一种操作系统)是一件比单单模仿字节码更加复杂的事情。

JVM语言

如果某种语言能够被Java虚拟机表达成某种有效的类文件,那么具有这种功能的语言便是JVM语言。一个类文件包含Java虚拟机指令和符号,以及其他附加信息。类文件的格式是依赖硬件和操作系统的二进制格式,用来表示已经编译过的类和接口。有几种JVM语言,既有旧语言移植成JVM,也有完全移植成新语言。JRubyJPython可能是现存语言中最著名的移植语言,比如分别为RubyPython。对于新语言已经从创造scratch(一种编程语言)到编译成Java字节码,ClojureGroovyScala或许会成为最欢迎的语言之一。JVM最主要的特点是它们相互兼容,这样,比如Scala的库文件可以用在Java程序上,反之亦然。

Java7虚拟机实现了JSR292:在Java平台上支持动态类型的语言,是Java的新特性。这个特性是在DaVinci Machine项目中发展出来的。它的任务是拓展JVM以便使它不仅仅支持Java,还能支持其他语言。

字节码的检验(Bytecodeverifier

Java的基本哲理是不会有用户程序可以使得主机崩溃或者存在主机中的其他操作的不正确接口,并且它有可能在保护运行在相同Java虚拟机中的不受信任的代码中的某个方法和数据结构,所以Java天生是安全的。除此之外还有,普通的编程错误常常使数据变坏或者不可预测的事情比如数组结尾处的访问中断或者不允许未初始化的指针的使用。Java的好几种特性组合一起提供了这个安全性,包括类型、垃圾回收堆和检验。

Java虚拟机会在执行之前检验所有的字节码。这包含三个主要类型的检查:

--引用总是指向有效的地址。

--数据总是被初始化,引用总是类型安全的。

--private或者packageprivate的数据和方法的访问受严格控制。

前两种检查主要发生在类加载和使类准备好的时候发生。第三种主要表现为动态的,当数据或者方法第一次被其他类访问的时候发生。

这样的检验保证了只有一些有效的字节码序列才能在相同的方法内指向一个指令。同时保证了给定的在固定的栈中的操作指令允许即时编译器把栈中的访问转换成固定的注册访问。因为这个,JVM是栈结构的,在使用即时编译器的时候没有应用基于注册结构的模仿的速度惩罚。实际上JVM的代码这个代码检验体系结构使得即时编译器没什么不一样。实际上,代码检验使得JVM不同于传统的栈结构,对于传统的栈结构,有即时编译器的高效模仿更加复杂并且解释速度更慢。

原始的字节码检验规范说明书在某些方面使用了不完整的或者不正确的自然语言。很多措施使得JVM成为正规的系统。这样,目前JVM实现的安全性能够更加彻底的被分析和防止潜在的安全漏洞。如果正在运行的应用能够被证明是安全的,它也将可能通过跳过没有必要的安全检查来优化JVM

远程代码的安全运行(Secureexecution of remote code

一个虚拟机体系结构允许非常细粒度的控制。这个设计让来自远程资源的不受信任的代码能够安全运行,这个模式被Javaapplets使用了。从远程HTTP服务器中下载并被包含在用户浏览器中的Applets运行在虚拟机中。这些远程代码运行在被限制的沙箱中,这样的设计是为了保护用户不被恶意程序代码的伤害。代码发布者可以购买带有数字签名的applets安全证书,让他们有权限要求用户打破沙箱并访问本地文件系统、剪切板、执行外部的软件片或者网络。

字节码的解释和即时编译器

每一个不同的硬件体系结构都需要相应的Java字节码解释器。当一个计算机有Java字节解释器,它就可以运行任何Java字节码程序,并且相同的程序只能运行在任何有这种解释器的计算机上面。Java字节码被解释器解释之后,它的执行速度总是慢于那些被编译成本地机器语言的相同程序。这个问题通过及时编译器执行Java字节码缓和了。在运行程序的时候,一个及时编译器可能把Java字节码转换成本地机器语言。这部分被转换的程序比被解释的情况下运行速度更快。这个技术应用在被频繁运行的代码上。这样子即时编译器可以从整体上明显提高程序的运行速度。JavaJava字节码之间没有必要的联系。一个用Java编写的程序会被直接编译成真实计算机的机器语言,用其他语言而不是Java编写的程序会被编译成Java字节码。Java字节码试图变得平台独立的和安全的。一些JVM实现不包含一个解释器而只包含一个及时编译器。

性能

JVM规范说给实现者很多自己实现细节的空间。从Java1.3起,来自甲骨文包含JVMJREJava运行时环境)叫做Hotpot。它已经被设计成一个高效的JVM

为了提高代码的运行速度,HotSpot依赖即时编译。为了加快对象分配和垃圾收集的速度,Hotpot使用了分代堆(generationalheap)。

分代堆(generationalheap

Java虚拟机的堆是JVM动态内存分配的的内存区域。HopSpot的堆是被分成代(generations)的:

--新生代用来存储很快就被垃圾回收器回收的短时间存在的对象。

--长时间存在的对象将会被移到年老代中(也叫终身代)。这个内存区会被分成两个Servivors空间,对象先存活下来,然后会被回收。

Java8之前,持久代(Permanentgeneration)被用来存放类的定义和相关的元数据。持久代不是堆的一部分。在Java8中持久代被移除了。

原本没有持久代,对象和类都一起保存在同一个区域。但是因为卸载类比回收对象更少发生,所以把类结构移到特定的区域能够显著提高垃圾回收的性能。

安全性(Security

甲骨文的JREJava运行时环境)被安装在大量的计算机上面。所以在用户浏览的任何网页时都有可能运行Javaapplets,这就使得Java提供了恶意网站攻击用户的简单方法。卡巴斯基实验室报告称,Java网站插件是计算机犯罪的一种选择方法。黑客会利用Java的这个特点通过部署许多带毒的网站来攻击用户。

以前,终端用户通常因为使用比较老版本的JRE从而很容易遭受攻击。这导致了人们广泛认为Java是天生不安全的。从Java1.7开始,安装在Windonw系统上的甲骨文公司的JRE包含了自动升级的功能。

工具栏争议(Toolbarcontroversy

2005年开始,Sun公司(现在的甲骨文公司)的JREJava运行时环境)会默认安装不相关的软件。开始是Google的工具栏,后来是MSN的工具栏、雅虎的工具拉,最后是Ask的工具栏。Ask的工具栏备受争议。当时已经有请愿书要求甲骨文公司移除它。请愿者称甲骨文公司违背了那些在自己计算机上运行Java的数百亿用户的信用,他们败坏了曾经引以为豪的平台的名誉。Zdnet称他们的行为是骗人的,因为增加工具栏使用户更加繁忙或者分心。

20156月,甲骨文公司宣布和Ask.com结束合作关系,取而代之的是雅虎。之后用户被默认要求修改他们主页和使用雅虎作为默认的搜索引擎。

转载地址:https://liangyihuai.blog.csdn.net/article/details/50670527 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Java基本类型和取值范围
下一篇:指令重排序

发表评论

最新留言

路过,博主的博客真漂亮。。
[***.116.15.85]2024年04月18日 19时08分29秒