文档章节

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

apsaras
 apsaras
发布于 2016/06/20 09:42
字数 3100
阅读 39
收藏 0

摘要

本文叙述了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

分享到:
参考知识库
C语言知识库 65  关注 | 941  收录
React知识库 175  关注 | 155  收录
操作系统知识库 605  关注 | 1706  收录
Redis知识库 1148  关注 | 603  收录
评论

本文转载自:http://jportal.iteye.com/blog/454018

apsaras
粉丝 8
博文 90
码字总数 0
作品 0
海淀
架构师
私信 提问
Java虚拟机标准(第10版)第一章(节选)翻译与评注

英文原文链接:https://docs.oracle.com/javase/specs/jvms/se10/html/jvms-1.html 评注是括在鱼尾号之间的文字,其余均为翻译 Java虚拟机是Java平台的基石,这种技术实现了诸如跨平台、生成...

Jelif
2018/06/03
0
0
Android的虚拟机Dalvik引来论战不断

随着上周Google的Android SDK的发布,关于它的API以及在移动电话领域所带来的预期影响这些方面的讨论不胜枚举。不过,其中的一个话题在Java社区是一石激起千层浪,这就是Android平台的基础—...

红薯
2009/09/27
2.4K
3
Java虚拟机基础——2JVM运行时数据区

Java虚拟机整体篇幅如下: Java虚拟机基础——1Java的内存模型 Java虚拟机基础——2JVM运行时数据区 Java虚拟机基础——3类加载机制 Java虚拟机基础——4内存回收机制 本篇文章主要讲解JVM运...

隔壁老李头
2018/10/03
0
0
android -------- java虚拟机和Dalvik虚拟机

java虚拟机 虚拟机是一种抽象化的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机有自己完善的硬体架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。Java虚...

切切歆语
2018/04/29
53
0
Android的虚拟机Dalvik 介绍

随着上周Google的Android SDK的发布,关于它的API以及在移动电话领域所带来的预期影响这些方面的讨论不胜枚举。不过,其中的一个话题在Java社区是一石激起千层浪,这就是 Android平台的基础—...

Kevin_Gan
2010/08/19
765
0

没有更多内容

加载失败,请刷新页面

加载更多

64.监控平台介绍 安装zabbix 忘记admin密码

19.1 Linux监控平台介绍 19.2 zabbix监控介绍 19.3/19.4/19.6 安装zabbix 19.5 忘记Admin密码如何做 19.1 Linux监控平台介绍: 常见开源监控软件 ~1.cacti、nagios、zabbix、smokeping、ope...

oschina130111
今天
13
0
当餐饮遇上大数据,嗯真香!

之前去开了一场会,主题是「餐饮领袖新零售峰会」。认真听完了餐饮前辈和新秀们的分享,觉得获益匪浅,把脑子里的核心纪要整理了一下,今天和大家做一个简单的分享,欢迎感兴趣的小伙伴一起交...

数澜科技
今天
7
0
DNS-over-HTTPS 的下一代是 DNS ON BLOCKCHAIN

本文作者:PETER LAI ,是 Diode 的区块链工程师。在进入软件开发领域之前,他主要是在做工商管理相关工作。Peter Lai 也是一位活跃的开源贡献者。目前,他正在与 Diode 团队一起开发基于区块...

红薯
今天
10
0
CC攻击带来的危害我们该如何防御?

随着网络的发展带给我们很多的便利,但是同时也带给我们一些网站安全问题,网络攻击就是常见的网站安全问题。其中作为站长最常见的就是CC攻击,CC攻击是网络攻击方式的一种,是一种比较常见的...

云漫网络Ruan
今天
12
0
实验分析性专业硕士提纲撰写要点

为什么您需要研究论文的提纲? 首先当您进行研究时,您需要聚集许多信息和想法,研究论文提纲可以较好地组织你的想法, 了解您研究资料的流畅度和程度。确保你写作时不会错过任何重要资料以此...

论文辅导员
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部