`
gaoyuntao2005
  • 浏览: 302565 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

MiniJavaVM——一个Java虚拟机的设计和实现

阅读更多

摘要

本文叙述了Java虚拟机(JVM)的概念及如何设计和实现一个Java虚拟机——MiniJavaVM。着重介绍了虚拟机的体系结构及如何设计和实现这个体系结构。在探讨虚拟机的设计过程中详细介绍了MiniJavaVM虚拟机各部分的设计,包括类的装载和解析,内存管理,执行引擎,方法调用和异常处理部分。最后通过测试MiniJavaVM来验证设计和实现的正确性。

关键词

Java虚拟机(JVM)  字节码  类装载  执行引擎     本地方法


MiniJavaVM – a design and implementation of a Java Virtual Machine

Abstract

This paper describes the conception of Java Virtual Machine (JVM) and how to design and implement a Java Virtual Machine – MiniJavaVM. It emphasizes the architecture of JVM and how to design and implement the architecture. It describes the details about each part of JVM when discussing how to design the JVM, including class-loading and resolution, memory management, execution engine, method invoking and exception-handling. At last, the correctness of the design and implementation is validated by testing MiniJavaVM.

Keywords

Java Virtual Machine(JVM), byte code, Class-loading, execution engine, Native Method


 


  

第一章     绪论... 6

1.1    JavaJava虚拟机... 6

1.2    Java虚拟机的体系结构... 7

1.3    MiniJavaVM的功能... 10

1.4    MiniJavaVM的运行环境及开发工具... 12

第二章     系统设计... 13

2.1        唯一的虚拟机MiniJavaVM... 13

2.2    MiniJavaVM的构成要素... 13

2.2.1       虚拟机总体框架... 13

2.2.2       命令参数解析模块... 15

2.2.3       类的装载和解析模块... 15

2.2.4       内存管理模块... 16

2.2.5       执行引擎模块... 17

2.2.6       方法调用模块... 18

2.2.7       异常处理模块... 19

第三章     虚拟机框架的实现... 21

3.1    JVM工程... 22

3.2    JavaVM工程... 23

3.2.1       Java虚拟机的数据类型和字长考量... 23

3.2.2       JavaVM... 24

3.3    JavaNativeCall工程... 29

第四章     类的装载和解析... 30

4.1    Java Class文件... 30

4.2    Class文件在MiniJavaVM中的数据结构表示... 32

4.3        类的装载和解析... 36

第五章     内存管理... 41

5.1        对象、堆、方法区的管理... 41

5.2    MiniJavaVM的垃圾回收过程... 44

第六章     执行引擎——Java操作码实现... 47

6.1    Java虚拟机中的操作码功能分类... 47

6.2        操作码功能实现——JavaOperatorExecute... 49

第七章     方法调用的实现... 50

7.1    Java中的方法调用... 50

7.2        非本地方法的实现... 51

7.3        本地方法的实现... 52

7.3.1       Java中的本地方法... 52

7.3.2       NativeMethod_access... 54

7.3.3       如何处理本地方法可变参数问题... 54

第八章     异常的实现... 56

8.1    Java中的异常... 56

8.2        异常在MiniJavaVM中的实现... 56

第九章     验证MiniJavaVM的正确性... 58

9.1    MiniJavaVM的使用方法... 58

9.2        测试操作码实现的正确性... 61

9.2.1       方法调用的正确性... 61

9.2.2       数学运算的正确性... 64

9.2.3       控制流语句的正确性... 65

9.3        测试本地方法调用... 66

9.4        测试异常处理... 67

第十章     不足与后续工作... 69

10.1     本地方法... 69

10.2     I/O操作... 69

10.3     多线程... 69

10.4     效率... 69

致谢... 71

参考文献... 72


 


第一章         绪论

1.1           JavaJava虚拟机

说起Java,人们首先想到的是Java编程语言,然而事实上,Java是一种技术,它由四方面组成: Java编程语言、Java类文件格式、Java虚拟机和Java应用程序接口(Java API)。它们的关系如下图所示:[1]

       运行期环境代表着Java平台,开发人员编写Java代码(.java文件),然后将之编译成字节码(.class文件)。最后字节码被装入内存,一旦字节码进入虚拟机,它就会被解释器解释执行,或者是被即时代码发生器有选择的转换成机器码执行。从上图也可以看出Java平台由Java虚拟机和Java应用程序接口搭建,Java语言则是进入这个平台的通道,用Java语言编写并编译的程序可以运行在这个平台上。这个平台的结构如下图所示:[1]

 

Java平台的结构中, 可以看出,Java虚拟机(JVM) 处在核心的位置,是程序与底层操作系统和硬件无关的关键。它的下方是移植接口,移植接口由两部分组成:适配器和Java操作系统, 其中依赖于平台的部分称为适配器;JVM 通过移植接口在具体的平台和操作系统上实现;在JVM 的上方是Java的基本类库和扩展类库以及它们的API 利用Java API编写的应用程序(application) 和小程序(Java applet) 可以在任何Java平台上运行而无需考虑底层平台, 就是因为有Java虚拟机(JVM)实现了程序与操作系统的分离,从而实现了Java 的平台无关性。[1]

什么是Java虚拟机?Java虚拟机是运行所有Java程序的抽象计算机,它仅仅是由一个规范来定义的抽象的计算机。当提及“Java虚拟机”时,可能指的是如下三种不同的东西:

Ÿ    抽象规范

Ÿ    一个具体的实现

Ÿ    一个运行中的虚拟机实例[2]

Java虚拟机负责Java程序设计语言的内存安全、平台无关和安全特性。Java虚拟机屏蔽了与具体操作系统平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。Java虚拟机(JVM)在多个平台上实现统一语言。Java之所以得以大行其道,除了它是一门面向对象、构造精美的语言之外,更重要的原因在于:它摆脱了具体机器的束缚,使跨越不同平台编写程序成为可能。

1.2           Java虚拟机的体系结构

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栈是由许多栈帧(stack frame)组成的,一个栈帧包含一个Java方法调用的状态。当线程调用一个Java方法时,虚拟机压入一个新的栈帧到该线程的Java栈中;当该方法返回时,这个栈帧被从Java栈中弹出并抛弃。

Java虚拟机没有寄存器,其指令集使用Java栈来存储中间数据。这样设计的原因是为了保持Java虚拟机的指令集尽量紧凑,同时也便于Java虚拟机在那些只有很少通用寄存器的平台上实现。另外,Java虚拟机的这种基于栈的体系结构,也有助于运行时某些虚拟机实现的动态编译器和即时编译器的代码优化。

1.2.3描绘了Java虚拟机为每个线程创建的内存区,这些内存区是私有的,任何线程都不能访问另一个线程的PC寄存器或者Java栈。[3]

1.3          MiniJavaVM的功能

²        能够装载并解析java class文件

对于已经编译好的java class文件,能够读取该class文件的内容,装载该类,并保存在程序内部的数据结构中。当在程序运行的过程中需要解析该类时,进行解析,并替换符号引用为直接引用

²        在完成虚拟机的初始化后,能够找到main函数并执行程序[13]

对于指定的入口类,在虚拟机完成了初始化后,寻找该类的main()方法,如果找到,则执行该方法,否则抛出异常,虚拟机运行中止。

²        支持Java虚拟机规范中规定的200多个操作码的功能

实现了Java虚拟机的200多个操作码的功能,由此使MiniJavaVM这个虚拟机模拟Java虚拟机的功能成为可能,这200多个操作码包括:

Ø         栈和局部变量操作指令

ü         将常量池入指令

ü         从栈中的局部变量中装载值指令

ü         将栈中的值存入局部变量指令

ü         通用栈操作指令

Ø         类型转换指令

Ø         整数运算指令

Ø         逻辑运算指令

ü         移位操作指令

ü         按位布尔运算指令

Ø         浮点运算指令

Ø         对象和数组指令

ü         对象操作指令

ü         数组操作指令

Ø         控制流指令

ü         条件分支指令

ü         比较指令

ü         无条件转移指令

ü         表跳转指令

Ø         异常指令

Ø         finally子句指令

Ø         方法调用与返回指令

ü         方法调用指令

<span styl

分享到:
评论

相关推荐

    MiniJavaVM—个Java虚拟机的设计和实现

    MiniJavaVM—个Java虚拟机的设计和实现

    一个Java虚拟机的设计和实现

    本文叙述了Java虚拟机(JVM)的概念及如何设计和实现一个Java虚拟机——MiniJavaVM。着重介绍了虚拟机的体系结构及如何设计和实现这个体系结构。在探讨虚拟机的设计过程中详细介绍了MiniJavaVM虚拟机各部分的设计,...

    虚拟机的设计与实现——C_C++

    虚拟机的设计与实现——C_C++虚拟机的设计与实现——C_C++虚拟机的设计与实现——C_C++虚拟机的设计与实现——C_C++虚拟机的设计与实现——C_C++

    Java虚拟机的设计和实现

    Java虚拟机的设计和实现

    深入Java虚拟机——本地方法栈.pdf

    深入Java虚拟机——本地方法栈.pdf

    实战Java虚拟机——JVM故障诊断与性能优化 pdf

    《实战Java虚拟机——JVM故障诊断与性能优化》内容简介:随着越来越多的第三方语言(Groovy、Scala、JRuby等)在Java虚拟机上运行,Java也俨然成为一个充满活力的生态圈。本书将通过200余示例详细介绍Java虚拟机中的...

    自己动手写Java虚拟机 (Java核心技术系列)@

    本书摒弃了传统的以解读枯燥的Java虚拟机规范文档和分析繁琐的Java虚拟机源代码的方式来讲解Java虚拟机,取而代之的是,以实践的方式,引导读者如何从零开始构建和实现一个Java虚拟机,整个过程不仅能让读者做到对...

    java虚拟机规范高清中文版本(java SE 8版本)

    第1章 :简单地介绍了Java虚拟机的历史并吹捧了←_← 一下Java的平台无关性(一次编译,到处运行); 第2章:概览Java虚拟机整体架构; 第3章:介绍如何将Java语言编写的程序转换为虚拟机指令集; 第4章:定义...

    虚拟机的设计与实现——C/C++.pdf

    虚拟机的设计与实现——C/C++.pdf

    实战Java虚拟机——JVM故障诊断与性能优化

    随着越来越多的第三方语言(Groovy、Scala、JRuby等)在Java虚拟机上运行,Java也俨然成为了一个充满活力的生态圈。《实战Java虚拟机——JVM故障诊断与性能优化》将通过200余示例详细介绍Java虚拟机中的各种参数配置...

    java虚拟机规范(java se 7)

    《Java虚拟机规范 7》是一份完整的描述Java虚拟机是如何设计的规范文档。这份文档对于任何一个希望实现Java虚拟机的编译器作者,或者希望实现一个与规范相兼容的Java虚拟机的程序员来说都是必不可少的。

    深入浅出java虚拟机设计与实现

    深入浅出java虚拟机设计与实现

    自己动手写Java虚拟机 kindle 版本

    本书摒弃了传统的以解读枯燥的Java虚拟机规范文档和分析繁琐的Java虚拟机源代码的方式来讲解Java虚拟机,取而代之的是,以实践的方式,引导读者如何从零开始构建和实现一个Java虚拟机,整个过程不仅能让读者做到对...

    实战JAVA虚拟机

    随着越来越多的第三方语言(Groovy、Scala、JRuby等)在Java虚拟机上运行,Java也俨然成为了一个充满活力的生态圈。《实战Java虚拟机——JVM故障诊断与性能优化》将通过200余示例详细介绍Java虚拟机中的各种参数配置...

    实战java虚拟机

    随着越来越多的第三方语言(Groovy、Scala、JRuby等)在Java虚拟机上运行,Java也俨然成为了一个充满活力的生态圈。《实战Java虚拟机——JVM故障诊断与性能优化》将通过200余示例详细介绍Java虚拟机中的各种参数配置...

    java虚拟机规范(java SE7)

    java虚拟机规范,高清PDF版本,含有目录结构:第一章:引言; 第二章:java虚拟结构(运行时区域内存:寄存器,java虚拟机栈,java堆,方法去,运行时常量池,本地方法栈); 第三章:为java虚拟机编译; 第四章:...

Global site tag (gtag.js) - Google Analytics