您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 其它行业文档 > Java虚拟机的设计和实现
MiniJavaVM——一个Java虚拟机的设计和实现摘要本文叙述了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目录第一章绪论61.1Java及Java虚拟机61.2Java虚拟机的体系结构71.3MiniJavaVM的功能101.4MiniJavaVM的运行环境及开发工具12第二章系统设计142.1唯一的虚拟机MiniJavaVM142.2MiniJavaVM的构成要素142.2.1虚拟机总体框架142.2.2命令参数解析模块162.2.3类的装载和解析模块162.2.4内存管理模块172.2.5执行引擎模块182.2.6方法调用模块182.2.7异常处理模块19第三章虚拟机框架的实现213.1JVM工程223.2JavaVM工程233.2.1Java虚拟机的数据类型和字长考量233.2.2JavaVM类253.3JavaNativeCall工程29第四章类的装载和解析314.1JavaClass文件314.2Class文件在MiniJavaVM中的数据结构表示334.3类的装载和解析37第五章内存管理435.1对象、堆、方法区的管理435.2MiniJavaVM的垃圾回收过程46第六章执行引擎——Java操作码实现496.1Java虚拟机中的操作码功能分类496.2操作码功能实现——JavaOperatorExecute类52第七章方法调用的实现537.1Java中的方法调用537.2非本地方法的实现547.3本地方法的实现557.3.1Java中的本地方法557.3.2NativeMethod_access类577.3.3如何处理本地方法可变参数问题57第八章异常的实现608.1Java中的异常608.2异常在MiniJavaVM中的实现60第九章验证MiniJavaVM的正确性629.1MiniJavaVM的使用方法629.2测试操作码实现的正确性659.2.1方法调用的正确性659.2.2数学运算的正确性689.2.3控制流语句的正确性699.3测试本地方法调用719.4测试异常处理72第十章不足与后续工作7410.1本地方法7410.2I/O操作7410.3多线程7410.4效率74致谢76参考文献77第一章绪论1.1Java及Java虚拟机说起Java,人们首先想到的是Java编程语言,然而事实上,Java是一种技术,它由四方面组成:Java编程语言、Java类文件格式、Java虚拟机和Java应用程序接口(JavaAPI)。它们的关系如下图所示:[1]运行期环境代表着Java平台,开发人员编写Java代码(.java文件),然后将之编译成字节码(.class文件)。最后字节码被装入内存,一旦字节码进入虚拟机,它就会被解释器解释执行,或者是被即时代码发生器有选择的转换成机器码执行。从上图也可以看出Java平台由Java虚拟机和Java应用程序接口搭建,Java语言则是进入这个平台的通道,用Java语言编写并编译的程序可以运行在这个平台上。这个平台的结构如下图所示:[1]在Java平台的结构中,可以看出,Java虚拟机(JVM)处在核心的位置,是程序与底层操作系统和硬件无关的关键。它的下方是移植接口,移植接口由两部分组成:适配器和Java操作系统,其中依赖于平台的部分称为适配器;JVM通过移植接口在具体的平台和操作系统上实现;在JVM的上方是Java的基本类库和扩展类库以及它们的API,利用JavaAPI编写的应用程序(application)和小程序(Javaapplet)可以在任何Java平台上运行而无需考虑底层平台,就是因为有Java虚拟机(JVM)实现了程序与操作系统的分离,从而实现了Java的平台无关性。[1]什么是Java虚拟机?Java虚拟机是运行所有Java程序的抽象计算机,它仅仅是由一个规范来定义的抽象的计算机。当提及“Java虚拟机”时,可能指的是如下三种不同的东西:抽象规范一个具体的实现一个运行中的虚拟机实例[2]Java虚拟机负责Java程序设计语言的内存安全、平台无关和安全特性。Java虚拟机屏蔽了与具体操作系统平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。Java虚拟机(JVM)在多个平台上实现统一语言。Java之所以得以大行其道,除了它是一门面向对象、构造精美的语言之外,更重要的原因在于:它摆脱了具体机器的束缚,使跨越不同平台编写程序成为可能。1.2Java虚拟机的体系结构在Java虚拟机规范中,一个虚拟机实例的行为是分别按照子系统、内存区、数据类型以及指令这几个术语来描述的。这些组成部分一起展示了抽象的虚拟机的内部抽象体系结构。但是规范中对它们的定义并非是要强制规定Java虚拟机实现内部的体系结构,更多的是为了严格地定义这些实现的内部特征。规范本身通过定义这些抽象的组成部分以及它们之间的交互,来定义任何Java虚拟机实现都必须遵守的行为。每个JVM都有两种机制,一个是装载具有合适名称的类(类或是接口),叫做类装载子系统;另外的一个负责执行包含在已装载的类或接口中的指令,叫做运行引擎。每个JVM又包括方法区、堆、Java栈、程序计数器和本地方法栈这五个部分,这几个部分和类装载机制与运行引擎机制一起组成了Java虚拟机的体系结构。图1.2.1描述了Java虚拟机的结构框图,包括在规范中描述的主要子系统和内存区。每个Java虚拟机都有一个类装载器子系统,它根据给定的全限定名来装入类型(类或接口)。同样,每个Java虚拟机都有一个执行引擎,它负责执行那些包含在被装载类的方法中的指令。Java虚拟机的运行时数据区存储了许多运行时数据,例如,字节码,从已装载的class文件中得到的其他信息,程序创建的对象,传递给方法的参数,返回值,局部变量,以及运算的中间结果等。Java虚拟机把这些东西都组织到几个“运行时数据区”中,以便于管理。某些运行时数据区是由程序中所有线程共享的,还有一些则只能由一个线程拥有。每个Java虚拟机实例都有一个方法区及一个堆,它们是由该虚拟机实例中所有线程共享的。当虚拟机装载一个class文件时,它会从这个class文件包含的二进制数据中解析类型信息。然后把这些类型信息放到方法区中。当程序运行时,虚拟机会把所有该程序在运行时创建的对象都放到堆中。图1.2.2描述了这些内存区域。当每一个线程被创建时,它都将得到它自己的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.3MiniJavaVM的功能能够装载并解析javaclass文件对于已经编译好的javaclass文件,能够读取该class文件的内容,装载该类,并保存在程序内部的数据结构中。当在程序运行的过程中需要解析该类时,进行解析,并替换符号引用为直接引用在完成虚拟机的初始化后,能够找到main函数并执行程序[13]对于指定的入口类,在虚拟机完成了初始化后,寻找该类的main()方法,如果找到,则执行该方法,否则抛出异常,虚拟机运行中止。支持Java虚拟机规范中规定的200多个操作码的功能实现了Java虚拟机的200多个操作码的功能,由此使MiniJavaVM这个虚拟机模拟Java虚拟机的功能成为可能,这200多个操作码包括:栈和局部变量操作指令将常量池入指令从栈中的局部变量中装载值指令将栈中的值存入局部变量指令通用栈操作指令类型转换指令整数运算指令逻辑运算指令移位操作指令按位布尔运算指令浮点运算指令对象和数组指令对象操作指令数组操作指令控制流指令条件分支指令比较指令无条件转移指令表跳转指令异常指令finally子句指令方法调用与返回指令方法调用指令方法返回指令线程同步指令具有内存管理和垃圾收集机制Java虚拟机对内存的管理使得java程序具有很高的安全性,程序员不用担心内存访问越界问题,也不用为在合适的时候释放分配的空间而费心。垃圾收集机制的存在解决何时回收不用的内存和如何回收内存的问题。支持非本地方法调用按照Java虚拟机规范中的要求来设置非本地方法的调用情况,包括参数压栈,分配局部变量空间,压入方法调用的栈桢等。支持本地方法调用Java虚拟机中所有与本地方法相关的部分都重新写过,以动态链接库的形式为MiniJavaVM工程提供支持。MiniJavaVM的本地方法只实现最基本的功能,不再负责虚拟机的安全机制。支持异常处理有了异常处理,就能够在程序运行时平稳处理意外情况。根据Javaclass文件中的异常表,MiniJavaVM程序支持所有的异常处理,并在不能解决异常时输出异常信息,虚拟机停止运行。能够运行与I/O无关的完整Java程序,并提供参数供查看运行效果提供了-version,-showversion,–help,-?,–verbose命令。-version命令显示MiniJavaVM的版本信息,然后退出-showversion命令显示MiniJavaVM的版本信息,
本文标题:Java虚拟机的设计和实现
链接地址:https://www.777doc.com/doc-5055728 .html