- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Java虚拟机
Java 虚拟机(JVM)是可运行 Java 代码的假想计算机。只要根据 JVM 规格描述将解释器 移植到特定的计算机上,就能保证经过编译的任何 Java 代码能够在该系统上运行。
本文首先简要介绍从 Java 文件的编译到最终执行的过程,随后对 JVM 规格描述作一说明。
源文件的编译下载 一.Java 源文件的编译、下载、解释和执行 Java 应用程序的开发周期包括编译、下载、解释和执行几个部分。Java 编译程序将 Java 源程序翻译为 JVM 可执行代码字节码。这一编译过程同 C/C++的编译有些不同。当 C 编译器编译生成一个对象的代码时,该代码是为在某一特定硬件平台运行而产生的。因此,在编译过程中, 编译程序通过查表将所有对符号的引用转换为特定的内存偏移量,以保证程序运行。 Java 编译器却不将对变量和方法的引用编译为数值引用, 也不确定程序执行过程中的内存布局, 而是将这些符号引用信息保留在字节码中,由解释器在运行过程中创立内存布局,然后再通过查表来确定一个方法所在的地址。这样就有效的保证了 Java 的可移植性和安全性。
运行 JVM 字节码的工作是由解释器来完成的。 解释执行过程分三部进行: 代码的装入、 代码的校验和代码的执行。装入代码的工作由类装载器(class loader)完成。类装载器负责装入运行一个程序需要的所有代码,这也包括程序代码中的类所继承的类和被其调用的类。当类装载器装入一个类时,该类被放在自己的名字空间中。除了通过符号引用自己名字空间以外的类, 类之间没有其他办法可以影响其他类。 在本台计算机上的所有类都在同一地址空间内,而所有从外部引进的类,都有一个自己独立的名字空间。这使得本地类通过共享相同的名字空间获得较高的运行效率, 同时又保证它们与从外部引进的类不会相互影响。 当装入了运行程序需要的所有类后, 解释器便可确定整个可执行程序的内存布局。 解释器为符号引用同特定的地址空间建立对应关系及查询表。通过在这一阶段确定代码的内存布局, Java 很好地解决了由超类改变而使子类崩溃的问题,同时也防止了代码对地址的非法访问。 随后,被装入的代码由字节码校验器进行检查。校验器可发现操作数栈溢出,非法数据、类型转化等多种错误。通过校验后,代码便开始执行了。 Java 字节码的执行有两种方式: 1.即时编译方式:解释器先将字节码编译成机器码,然后再执行该机器码。 2.解释执行方式:解释器通过每次解释并执行一小段代码来完成 Java 字节码程 序的所 有操作。 通常采用的是第二种方法。由于 JVM 规格描述具有足够的灵活性,这使得将字节码翻 译为机器代码的工作 具有较高的效率。对于那些对运行速度要求较高的应用程序,解释器可将 Java 字节码 即时编译为机器码,从而很好地保证了 Java 代码的可移植性和高性能。
二.JVM 规格描述 JVM 的设计目标是提供一个基于抽象规格描述的计算机模型,为解释程序开发人员提很好的灵活性,同时也确保 Java 代码可在符合该规范的任何系统上运行。JVM 对其实现的某些方面给出了具体的定义,特别是对 Java 可执行代码,即字节码(Bytecode)的格式给出了明确的规格。这一规格包括操作码和操作数的语法和数值、标识符的数值表示方式、以及Java 类文件中的 Java 对象、常量缓冲池在 JVM 的存储映象。这些定义为 JVM 解释器开发人员提供了所需的信息和开发环境。Java 的设计者希望给开发人员以随心所欲使用 Java 的自由。
JVM 定义了控制 Java 代码解释执行和具体实现的五种规格,它们是: JVM 指令系统、JVM 寄存器、JVM 栈结构、JVM 碎片回收堆、JVM 存储区。
2.1JVM 指令系统 JVM 指令系统同其他计算机的指令系统极其相似。 Java 指令也是由操作码和操作数两部分组成。 操作码为 8 位二进制数, 操作数进紧随在操作码的后面, 其长度根据需要而不同。 操作码用于指定一条指令操作的性质(在这里我们采用汇编符号的形式进行说明) ,如 iload 表示从存储器中装入一个整数,anewarray 表示为一个新数组分配空间,iand 表示两个整数 的与,ret 用于流程控制,表示从对某一方法的调用中返回。当长度大于 8 位时,操作数被分为两个以上字节存放。 JVM 采用了big endian的编码方式来处理这种情况, 即高位 bits 存放在低字节中。这同 Motorola 及其他的 RISC CPU 采用的编码方式是一致的,而与 Intel 采用的little endian 的编码方式即低位 bits 存放在低位字节的方法不同。
Java 指令系统是以 Java 语言的实现为目的设计的,其中包含了用
文档评论(0)