资源预览内容
第1页 / 共47页
第2页 / 共47页
第3页 / 共47页
第4页 / 共47页
第5页 / 共47页
第6页 / 共47页
第7页 / 共47页
第8页 / 共47页
第9页 / 共47页
第10页 / 共47页
亲,该文档总共47页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
Java虚拟机的设计和实现第一章绪论11一111111Java及Java虚拟机6.Java虚拟机的体系结构7.MiniJavaVM的功能10MiniJavaVM的运行环境及开发工具12系统设计132.1 唯一的虚拟机MiniJavaVM13MiniJavaVM的构成要素13虚拟机总体框架13命令参数解析模块15类的装载和解析模块15内存管理模块16执行引擎模块17方法调用模块18异常处理模块19第三章虚拟机框架的实现213.1 JVM工程223.2.1 JavaVM工程23Java虚拟机的数据类型和字长考量23JavaVM类24JavaNativeCall工程29第四章类的装载和解析304.1 JavaClass文件304.2 Class文件在MiniJavaVM中的数据结构表示32类的装载和解析36第五章内存管理415.1 对象、堆、方法区的管理41MiniJavaVM的垃圾回收过程44第六章执行引擎一一Java操作码实现476.1 Java虚拟机中的操作码功能分类47操作码功能实现JavaOperatorExecute类49第七章方法调用的实现507.1 Java中的方法调用507.2 非本地方法的实现517J本地方法的实现52Java中的本地方法52NativeMethod_access类54如何处理本地方法可变参数问题54第八章异常的实现568.1 Java中的异常56异常在MiniJavaVM中的实现56第九章验证MiniJavaVM的正确性589.1 MiniJavaVM的使用方法5.89.2.1 测试操作码实现的正确性61方法调用的正确性61数学运算的正确性64控制流语句的正确性659.2 测试本地方法调用66测试异常处理67第十章不足与后续工作6910.1 本地方法6910.2 I/O操作6910.3 多线程69效率69致谢71参考文献72摘要本文叙述了Java虚拟机(JVM)的概念及如何设计和实现一个Java虚拟机MiniJavaVM。着重介绍了虚拟机的体系结构及如何设计和实现这个体系结构。在探讨虚拟机的设计过程中详细介绍了MiniJavaVM虚拟机各部分的设计,包括类的装载和解析,内存管理,执行引擎,方法调用和异常处理部分。最后通过测试MiniJavaVM来验证设计和实现的正确性。关键词Java虚拟机(JVM)字节码类装载执行引擎本地方法MiniJavaVM-adesignandimplementationofaJavaVirtualMachineAbstractThispaperdescribestheconceptionofJavaVirtualMachine(JVM)andhowtodesignandimplementaJavaVirtualMachine-MiniJavaVM.ItemphasizesthearchitectureofJVMandhowtodesignandimplementthearchitecture.ItdescribesthedetailsabouteachpartofJVMwhendiscussinghowtodesigntheJVM,includingclass-loadingandresolution,memorymanagement,executionengine,methodinvokingandexception-handling.Atlast,thecorrectnessofthedesignandimplementationisvalidatedbytestingMiniJavaVM.KeywordsJavaVirtualMachine(JVM),bytecode,Class-loading,executionengine,NativeMethod.第一章绪论Java及Java虚拟机说起Java,人们首先想到的是Java编程语言,然而事实上,Java是一种技术,它由四方面组成:Java编程语言、Java类文件格式、Java虚拟机和Java应用程序接口(JavaAPI)。它们的关系如下图所示:1hva平台运行期环境Jiva源代码(砂i文件)rJava编译器1FJava宇节码da曲文件)类装载器Java宇节码的验证类库*7VJava解释即时编器薛器工工运行期系统操作系统Java虚拟机谨件图1.1.1Java四个方面的关系运行期环境代表着Java平台,开发人员编写Java代码(.java文件),然后将之编译成字节码(.class文件)。最后字节码被装入内存,一旦字节码进入虚拟机,它就会被解释器Java解释执行,或者是被即时代码发生器有选择的转换成机器码执行。从上图也可以看出平台由Java虚拟机和Java应用程序接口搭建,Java语言则是进入这个平台的通道,用Java1语言编写并编译的程序可以运行在这个平台上。这个平台的结构如下图所示:应用程序和小应用程序Jmua基本APIJmum标陸扩展API基类Java标准扩展类Java虛拟机移植接口适配橋适配器适配器Java按作系貌浏览器硬件硬件浏览器上的旧阳崑面操作系抚上的Java小型操作系统上的JavaJava操作系细的Java图1.1.2Java平台结构在Java平台的结构中,可以看出,Java虚拟机(JVM)处在核心的位置,是程序与底层操作系统和硬件无关的关键。它的下方是移植接口,移植接口由两部分组成:适配器和Java操作系统,其中依赖于平台的部分称为适配器;JVM通过移植接口在具体的平台和操作系统上实现;在JVM的上方是Java的基本类库和扩展类库以及它们的API,利用JavaAPI编写的应用程序(application)和小程序(Javaapplet)可以在任何Java平台上运行而无需考虑底层平台,就是因为有Java虚拟机(JVM)实现了程序与操作系统的分离,从而实现了Java的平台无关性。1什么是Java虚拟机?Java虚拟机是运行所有Java程序的抽象计算机,它仅仅是由一个规范来定义的抽象的计算机。当提及“Java虚拟机”时,可能指的是如下三种不同的东西:抽象规范一个具体的实现一个运行中的虚拟机实例2Java虚拟机负责Java程序设计语言的内存安全、平台无关和安全特性。Java虚拟机屏蔽了与具体操作系统平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。Java虚拟机(JVM)在多个平台上实现统一语言。Java之所以得以大行其道,除了它是一门面向对象、构造精美的语言之外,更重要的原因在于:它摆脱了具体机器的束缚,使跨越不同平台编写程序成为可能。1.1 Java虚拟机的体系结构在Java虚拟机规范中,一个虚拟机实例的行为是分别按照子系统、内存区、数据类型以及指令这几个术语来描述的。这些组成部分一起展示了抽象的虚拟机的内部抽象体系结构。但是规范中对它们的定义并非是要强制规定Java虚拟机实现内部的体系结构,更多的是为了严格地定义这些实现的内部特征。规范本身通过定义这些抽象的组成部分以及它们之间的交互,来定义任何Java虚拟机实现都必须遵守的行为。每个JVM都有两种机制,一个是装载具有合适名称的类(类或是接口),叫做类装载子系统;另外的一个负责执行包含在已装载的类或接口中的指令,叫做运行引擎。每个JVM又包括方法区、堆、Java栈、程序计数器和本地方法栈这五个部分,这几个部分和类装载机制与运行引擎机制一起组成了Java虚拟机的体系结构。图1.2.1描述了Java虚拟机的结构框图,包括在规范中描述的主要子系统和内存区。Class文件类装载器子系统Z方法区PC寄存器本地方法栈执行引擎本地方法接口本地方法库图1.2.1Java虚拟机的内部体系结构每个Java虚拟机都有一个类装载器子系统,它根据给定的全限定名来装入类型(类或接口)。同样,每个Java虚拟机都有一个执行引擎,它负责执行那些包含在被装载类的方法中的指令。Java虚拟机的运行时数据区存储了许多运行时数据,例如,字节码,从已装载的class文件中得到的其他信息,程序创建的对象,传递给方法的参数,返回值,局部变量,以及运算的中间结果等。Java虚拟机把这些东西都组织到几个“运行时数据区”中,以便于管理。某些运行时数据区是由程序中所有线程共享的,还有一些则只能由一个线程拥有。每个Java虚拟机实例都有一个方法区及一个堆,它们是由该虚拟机实例中所有线程共享的。当虚拟机装载一个class文件时,它会从这个class文件包含的二进制数据中解析类型信息。然后把这些类型信息放到方法区中。当程序运行时,虚拟机会把所有该程序在运行时创建的对象都放到堆中。图1.2.2描述了这些内存区域。对象对象对象对象对象对象对象对象图122由所有线程共享的运行时数据区当每一个线程被创建时,它都将得到它自己的PC寄存器以及一个Java栈。如果线程正在执行的是一个Java方法(非本地方法),那么PC寄存器的值将总是指示下一条将被执行的指令,而它的Java栈则总是存储该线程中Java方法调用的状态一一包括它的局部变量,被调用时传进来的参数,它的返回值,以及运算的中间结果等。而本地方法调用的状态,则是以某种依赖于具体实现的方式存储在本地方法栈中,也可能是在寄存器或其他某些与特定实现相关的内存区中。Java栈是由许多栈帧(stackframe)组成的,一个栈帧包含一个Java方法调用的状态。当线程调用一个Java方法时,虚拟机压入一个新的栈帧到该线程的Java栈中;当该方法返回时,这个栈帧被从Java栈中弹出并抛弃。Java虚拟机没有寄存器,其指令集使用Java栈来存储中间数据。这样设计的原因是为了保持Java虚拟机的指令集尽量紧凑,同时也便于Java虚拟机在那些只有很少通用寄存器的平台上实现。另外,Java虚拟机的这种基于栈的体系结构,也有助于运行时某些虚拟机实现的动态编译器和即时编译器的代码优化。图1.2.3描绘了Java虚拟机为每个线程创建的内存区,这些内存区是私有的,任何线程都不能访问另一个线程的PC寄存器或者Java栈。3线程1线程3PC寄存器线程1线程2线程3|栈帧|栈帧|栈帧栈帧栈帧栈帧Java栈图1.2.3线程专有的运行时数据区线程3本地方法栈1.2 MiniJavaVM的功能能够装载并解析javaclass文件对于已经编译好的javaclass文件,能够读取该class文件的内容,装载该类,并保存在程序内部的数据结构中。当在程序运行的过程中需要解析该类时,进行解析,并替换符号引用为直接引用在完成虚拟机的初始化后,能够找到main函数并执行程序错误!未定义书签。对于指定的入口类,在虚拟机完成了初始化后,寻找该类的main()方法,如果找到,则执行该方法,否则抛出异常,虚拟机运行中止。支持Java虚拟机规范中规定的200多个操作码的功能实现了Java虚拟机的200多个操作码的功能,由此使MiniJavaVM这个虚拟机模拟Java虚拟机的功能成为可能,这200多个操作码包括:?栈和局部变量操作指令?将常量池入指令?从栈中的局部变量中装载值指令?将栈中的值存入局部变量指令?通用栈操
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号