Java虚拟机分析_王立冬

合集下载

java实验报告上机过程遇到的问题及解决方法

java实验报告上机过程遇到的问题及解决方法

java实验报告上机过程遇到的问题及解决方法Java实验报告上机过程遇到的问题及解决方法在进行Java实验时,往往会遇到各种问题,这些问题可能与代码编写、调试、环境配置等方面有关。

在本文中,我将分享一些我在实验过程中遇到的常见问题以及相应的解决方法,希望能够帮助读者更好地进行Java实验。

1. 编译错误在编写Java代码时,经常会碰到编译错误。

编译错误可能是由于语法错误、缺少库文件、命名冲突等问题导致的。

解决这类问题的方法有:- 仔细检查代码,确保语法正确且符合Java语法规范。

常见的错误包括缺少分号、拼写错误等。

- 确保所使用的库文件已正确导入,并在代码中进行正确的引用。

- 对于命名冲突问题,可以尝试修改变量名或使用全限定名来解决。

2. 运行时错误在代码编译通过后,运行程序时可能会出现各种错误。

空指针异常、数组越界等。

解决这类问题的方法有:- 对于空指针异常,可以通过添加空指针判断来避免。

使用if语句判断对象是否为null再进行操作。

- 对于数组越界错误,需要确保访问数组元素时的索引值在合法范围内。

可以使用条件语句或循环来进行检查。

3. 调试问题在调试Java程序时,可能遇到程序无法正常运行或结果不符合预期的情况。

以下是一些解决方法:- 使用调试工具,如Eclipse、IntelliJ IDEA等,设置断点进行代码逐行调试。

通过观察变量的值和程序执行流程,可以找到问题所在。

- 添加日志输出语句,可以帮助我们查看程序在执行过程中的状态,从而找到错误原因。

- 使用try-catch块捕获异常,并在异常处理代码中添加适当的逻辑,以保证程序的正常运行。

4. 环境配置问题在进行Java实验时,可能需要进行一些环境配置,如设置类路径、引入第三方库等。

解决环境配置问题的方法有:- 确认所使用的开发工具是否已正确配置,并且已安装Java JDK和相应版本的JRE。

- 检查类路径是否正确设置,确保能够正确引用所需的库文件。

java设计模式参考答案

java设计模式参考答案

java设计模式参考答案Java设计模式参考答案设计模式是软件开发中常用的一种解决问题的方法论,它提供了一套经过实践验证的解决方案,可以帮助开发人员更加高效地编写可维护、可扩展的代码。

在Java开发中,设计模式被广泛应用,它们能够提高代码的可读性、可维护性和可扩展性。

本文将介绍一些常见的Java设计模式,并提供相应的参考答案。

一、单例模式单例模式是一种创建型模式,用于确保一个类只有一个实例,并提供一个全局访问点。

在Java中,可以通过以下方式实现单例模式:```javapublic class Singleton {private static Singleton instance;private Singleton() {// 私有构造方法}public static Singleton getInstance() {if (instance == null) {synchronized (Singleton.class) {if (instance == null) {instance = new Singleton();}}}return instance;}}```上述代码使用双重检查锁定来实现线程安全的单例模式。

在getInstance()方法中,首先检查instance是否为空,如果为空,则进入同步块。

在同步块中,再次检查instance是否为空,如果为空,则创建一个新的实例。

这种方式可以避免多线程环境下创建多个实例的问题。

二、工厂模式工厂模式是一种创建型模式,用于将对象的创建与使用分离。

在Java中,可以通过以下方式实现工厂模式:```javapublic interface Product {void operation();}public class ConcreteProduct implements Product {@Overridepublic void operation() {// 具体产品的操作}}public interface Factory {Product createProduct();}public class ConcreteFactory implements Factory {@Overridepublic Product createProduct() {return new ConcreteProduct();}}```上述代码定义了一个Product接口和一个ConcreteProduct实现类,以及一个Factory接口和一个ConcreteFactory实现类。

雪花算法解析范文

雪花算法解析范文

雪花算法解析范文雪花算法是Twitter开发的一种全局唯一ID生成算法,主要用于分布式系统中生成唯一ID。

该算法的特点是生成的ID是有序的、趋势递增的,且在分布式环境下保证ID的唯一性。

下面将对雪花算法进行详细解析。

雪花算法的ID结构如下:1位符号位+41位时间戳偏移量+10位工作节点ID+12位序列号1.符号位:雪花算法中的符号位始终为0。

2.时间戳偏移量:时间戳偏移量是指当前时间戳减去起始时间戳的差值。

在Java中,时间戳的单位是毫秒,因此,41位的时间戳偏移量可以支持2^41 - 1毫秒,大约可以使用69年。

3.工作节点ID:工作节点ID是分布式系统中每个节点的唯一标识。

在雪花算法中,将节点ID分配给10位,最多可以有2^10=1024个节点。

4.序列号:序列号是表示同一节点在同一毫秒内生成的多个ID的序列号。

为了保证同一毫秒内生成的ID的唯一性,序列号占据了雪花算法中的最后12位。

下面是雪花算法的生成过程:1.获取当前时间戳,并计算与起始时间戳的差值,得到时间戳偏移量。

2.判断当前时间戳与上次生成ID的时间戳是否相等:-如果相等,说明在同一毫秒内生成多个ID,需要递增序列号。

-如果不相等,说明进入了下一毫秒,需要将序列号重置为0。

3.更新上次生成ID的时间戳。

4.按照ID的结构,将时间戳偏移量、工作节点ID和序列号合并生成最终ID。

需要注意的是,在分布式系统中,每个节点的工作节点ID是唯一的,并且需要提前分配好。

如果节点数量超过10位的范围,需要重新分配更多位数给工作节点ID。

雪花算法的优点是生成的ID有序、趋势递增,可以在分布式环境下保证ID的唯一性。

另外,由于雪花算法的生成过程只涉及到位运算和加减操作,因此计算效率较高。

然而,雪花算法也存在一些缺点。

首先,雪花算法的可用时间为69年,在一些长期运行的系统中可能需要考虑可扩展性。

其次,雪花算法对系统时钟要求较高,如果系统时钟回拨,则可能会产生重复的ID。

基于ARM的智能楼宇无线网络信息系统设计

基于ARM的智能楼宇无线网络信息系统设计
些类 就会 被装 载 , 由执行 引擎来 执行 字节码 程序 。
4 2 嵌 入 式 客 户 端 .
上 归功 于 J v a a虚拟机 的特点— — 平 台无 关性 、 全性 安 及 网络移 动 性 。要 在 嵌入 式 系统 上运 行 J v a a程序 , 关
键 是 Jv a a虚 拟 机嘲 的 实 现 。首 先 应 对 AR 处 理 器 M 的外 围 I0 口进 行扩 展 , 后 在硬 件 平 台上移 植 嵌 入 / 然 式 L n x操 作 系统 。需要 在嵌 入式 操作 系统 上移 植对CKS Z 3 I E( 2*1 2 ) 0 4
望 在 日后 的发 展 中将其 完善 。
参考文献 :
( )使 用对 应 的 栈偏 移 , 来 存 储 栈 指 针 的 缓 冲 5 用
区 。定义 语句 如下 :
# d fn P_ eieS OFFS ET 3 2
3 无 线 网 络 设 计
网络 和通 讯系统 提供 了信 息 传输 的基 础 构 架 , 此基 在 础构 架之 上 , 算机 信 息 网络 和 控 制 网络 才 能 够 进行 计 有效 的通 讯 , 并且 可 以通过 统 一 的 平 台进 行 数 据 信 息
的管 理 。
根 据 智 能 楼 宇 的 应 用 环 境 ,系 统 设 计 采 用
De eo e s ain e t o_sz . v lp r/ l m n — f ie e g
# d fn t p n me ) eie A(y e, a )
图 3 客 户端 界面
5 结 束 语
Src{ tu t
Unsg e ha in d c r Ty e x: p
0 引 言

java判断题 博学谷

java判断题 博学谷

第一章一、判断题1.Java核心源码包存放在JDK安装目录的bin目录下A. 对B. 错答案:false解析:src.zip文件是Java的核心源码包,它在JDK安装的根目录下。

考察点:第一章Java开发入门题目难度:★☆☆☆容易2.JDK安装成功后,可以将bin目录的路径配置在环境变量path中。

A. 对B. 错答案:true解析:为了方便java程序开发,最好将bin目录的路径配置到环境变量中。

考察点:第一章Java开发入门题目难度:★☆☆☆容易3.安装JDK时可以选择不安装公共JREA. 对B. 错答案:true解析:由于开发工具中已经包含了一个JRE,因此没有必要再安装公共的JRE环境,此项可以不作选择。

考察点:第一章Java开发入门题目难度:★★☆☆一般4.lib是library的缩写,用于存放Java类库或库文件A. 对B. 错答案:true解析:lib是library的缩写,意为Java类库或库文件,是开发工具使用的归档包文件考察点:第一章Java开发入门题目难度:★☆☆☆容易5.如果classpath环境变量没有进行设置,Java虚拟机会自动将其设置为“.”,也就是当前目录。

A. 对B. 错答案:true解析:如果classpath环境变量没有进行设置,Java虚拟机会自动将其设置为“.”,也就是当前目录。

考察点:第一章Java开发入门题目难度:★☆☆☆容易6.JDK安装的时候不可以修改安装目录A. 对B. 错答案:false解析:JDK在安装的过程中,可以通过点击按钮进行选择或直接输入路径的方式修改JDK的安装目录。

考察点:第一章Java开发入门题目难度:★☆☆☆容易7.Java是一门高级计算机语言。

A. 对B. 错答案:true解析:Java是一种高级计算机语言,它是由Sun公司(已被Oracle公司收购)于1995年5月推出的一种可以编写跨平台应用软件、完全面向对象的程序设计语言。

新大陆java面试题

新大陆java面试题

新大陆java面试题Java是一门广泛应用于软件开发领域的计算机编程语言,具有跨平台、面向对象、高性能等特点。

在求职面试中,Java面试题是常见的内容之一。

本文将针对新大陆Java面试题展开讨论,从基础知识到应用技巧,帮助读者更好地准备和应对面试。

一、基础知识1. 请简要介绍Java的特点和优势。

Java具有跨平台性,即一次编写,到处运行;具备面向对象的编程范式,有利于代码的重用和维护;拥有丰富的类库和工具生态系统,能够快速开发应用程序;具备高性能和可靠性,支持多线程和分布式计算;安全性良好,能够防止潜在的安全威胁。

2. 什么是Java虚拟机(JVM)?Java虚拟机是Java语言的核心和基础,它是Java平台独特的关键特性之一。

JVM负责将Java程序解释为特定平台上的字节码,同时管理程序的内存、处理异常、进行垃圾回收等。

通过JVM的存在,实现了Java语言的跨平台性。

3. 请解释面向对象编程(OOP)的概念和特性。

面向对象编程是一种程序设计的范式,其核心思想是将程序看作是由对象组成的。

对象是类的实例化,具有属性和方法。

面向对象编程的特性包括封装、继承和多态。

- 封装:将数据和相关操作封装成类,通过类的接口进行访问,隐藏内部实现细节,提高代码的安全性和可维护性。

- 继承:通过继承机制实现代码的重用,子类可以继承父类的属性和方法,并可以在此基础上进行扩展或重写。

- 多态:同一个方法可以根据不同的对象产生不同的行为,提高代码的灵活性和扩展性。

二、常见面试题1. 什么是Java中的异常(Exception)?请解释异常处理的机制。

异常是程序在运行过程中出现的错误或意外情况。

Java提供了异常处理的机制,通过捕获和处理异常,可以避免程序的崩溃和运行时错误。

异常处理机制包括try-catch块、throw和throws关键字。

- try-catch块:用于捕获可能抛出异常的代码块,当发生异常时,会根据异常类型执行相应的处理逻辑。

java第四版课后习题答案

java第四版课后习题答案

java第四版课后习题答案Java第四版课后习题答案Java是一种广泛应用于软件开发领域的编程语言,具有跨平台、面向对象等特点。

对于学习Java的人来说,课后习题是巩固知识、提高编程能力的重要方式。

本文将为读者提供Java第四版课后习题的答案,帮助读者更好地理解和掌握Java编程。

一、基础知识1. 什么是Java虚拟机(JVM)?它的作用是什么?答:Java虚拟机(JVM)是Java程序运行的环境,它负责将Java源代码编译成字节码,并在不同的操作系统上运行。

JVM的作用是实现Java的跨平台特性,使得Java程序可以在不同的操作系统上运行。

2. Java中的八种基本数据类型是什么?答:Java中的八种基本数据类型分别是byte、short、int、long、float、double、char和boolean。

3. 什么是面向对象编程(OOP)?Java是一种面向对象的编程语言吗?答:面向对象编程(OOP)是一种编程范式,通过将数据和方法封装在对象中,以对象为中心进行程序设计和开发。

Java是一种面向对象的编程语言,它支持封装、继承和多态等面向对象的特性。

二、控制流程1. Java中的条件语句有哪些?答:Java中的条件语句包括if语句、switch语句和三元运算符。

2. Java中的循环语句有哪些?答:Java中的循环语句包括for循环、while循环和do-while循环。

3. 如何在循环中使用break和continue语句?答:break语句用于立即终止循环,跳出循环体。

continue语句用于跳过当前循环的剩余代码,继续下一次循环。

三、数组和集合1. 如何声明和初始化一个一维数组?答:可以使用以下方式声明和初始化一个一维数组:```int[] array = new int[5]; //声明一个长度为5的整型数组int[] array = {1, 2, 3, 4, 5}; //声明并初始化一个整型数组```2. 如何声明和初始化一个二维数组?答:可以使用以下方式声明和初始化一个二维数组:```int[][] array = new int[3][2]; //声明一个3行2列的整型二维数组int[][] array = {{1, 2}, {3, 4}, {5, 6}}; //声明并初始化一个整型二维数组```3. Java中常用的集合类有哪些?答:Java中常用的集合类有ArrayList、LinkedList、HashSet、TreeSet、HashMap和TreeMap等。

天地伟业java面试题

天地伟业java面试题

天地伟业java面试题1. 什么是Java虚拟机(JVM)?Java虚拟机(JVM)是Java程序的运行环境,它是一个虚拟的计算机,它可以在不同的操作系统上运行Java程序。

JVM负责将Java程序编译后的字节码解释成机器码,并执行程序。

2. 什么是Java的多态性?Java的多态性是指同一个方法可以在不同的对象上产生不同的行为。

这是通过继承和接口实现的。

多态性可以提高代码的可重用性和可扩展性。

3. 什么是Java的封装性?Java的封装性是指将数据和方法封装在一个类中,只对外暴露必要的接口,隐藏实现细节。

这可以提高代码的安全性和可维护性。

4. 什么是Java的继承性?Java的继承性是指一个类可以继承另一个类的属性和方法。

这可以提高代码的可重用性和可扩展性。

5. 什么是Java的抽象类?Java的抽象类是一种不能被实例化的类,它只能被继承。

抽象类可以包含抽象方法和非抽象方法,抽象方法必须在子类中被实现。

6. 什么是Java的接口?Java的接口是一种抽象类型,它只包含方法的声明,没有方法的实现。

接口可以被类实现,一个类可以实现多个接口。

接口可以提高代码的可重用性和可扩展性。

7. 什么是Java的异常?Java的异常是指程序运行时发生的错误或异常情况。

Java提供了一些异常类,可以用来处理不同类型的异常。

异常处理可以提高程序的健壮性和可靠性。

8. 什么是Java的线程?Java的线程是指程序中的一条执行路径,它可以独立运行,可以与其他线程并发执行。

Java提供了多线程编程的支持,可以提高程序的并发性和性能。

9. 什么是Java的反射?Java的反射是指在程序运行时动态获取类的信息和调用类的方法。

Java提供了反射机制,可以在运行时获取类的信息,创建对象,调用方法等。

反射可以提高程序的灵活性和可扩展性。

10. 什么是Java的注解?Java的注解是一种元数据,它可以用来描述类、方法、变量等元素的属性和行为。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第22卷 第1期2002年2月北京理工大学学报Jour na l o f Beij ing Institute of T ech no lo gyV o l.22 No.1Feb.2002 文章编号:1001-0645(2002)01-0060-04Java 虚拟机分析王立冬, 张 凯(北京理工大学计算机科学与工程系,北京 100081)摘 要:研究J av a 平台的核心——虚拟机.为了使J av a 在不同的平台上顺利运行,研究Jav a 虚拟机(J av a vir tua l machine,简称J V M )的组成及运行机制,为编程实现JV M 或向各种平台移植J V M 提供参考.通过对Kaffe (一种J av a 虚拟机的实现)桌面版本的源代码进行分析,得出虚拟机运行的整个流程,并对流程中的关键部分进行深入研究,同时结合Sun 的《J av a 虚拟机规范》,总结出实现J V M 的一些关键步骤,并提出改进J V M 运行效率的建议.关键词:J av a;Java 虚拟机;Java 平台中图分类号:T P 302.7 文献标识码:AAnalysis of a Java Virtual MachineW AN G Li-do ng , ZHAN G Kai(Dept.of Com puter Science and Engineering ,Beij ing Institute of T ech no lo gy ,Beijing 100081,China)Abstract :The Jav a virtual machine is studied,which is the core of a Jav a platfo rm.In order that Jav a can run smo othly o n v arious platfo rms,the com po sitio n a nd running mechanism of the Java virtual machine are studied and a reference for implementing JV M and po rting JVM to other plat-form s is prov ided.Through an analy sis o n the source of Kaffe w hich show s a case of implem enta-tion o f the JV M,the flow chart o f a running JVM it summa rized a nd in so me depth the JVM 's key parts are studied .At the same time ,some key steps in implem enting JVM are summa ried and som e advices a re giv en which can be used to im prov e the running efficiency o f JVM.Key words :Jav a ;Jav a virtual machine ;Jav a platfo rm收稿日期:20010420作者简介:王立冬(1977-),男,硕士生;张 凯(1949-),女,副教授.1 Java 虚拟机Jav a 不仅是一种跨平台的语言,而且是一种新的网络计算平台.该平台包括许多相关的技术,如符合开放接口标准的各种API 、优化技术等.J av a 技术使同一种应用可以运行在不同的平台上.Jav a 平台可分为两部分,即J av a 虚拟机(Java virtual ma-chine ,JVM )和Java API 类库[1].在Java 平台的结构中,JVM 处在核心的位置.它的下方是移植接口.移植接口由两部分组成,其中依赖于平台的部分称为适配器.JVM 通过移植接口在具体的平台和操作系统上实现.在JVM 的上方是Jav a 的基本类库和API.利用Jav a API 编写的应用程序(applica tion )和小程序(J av a a pplet )可以在任何Java 平台上运行而无需考虑底层平台,从而实现了Java 的平台无关性.Jav a 程序的执行过程DOI:10.15918/j.t b i t1001-0645.2002.01.015是:首先,源程序(.jav a )经过编译器编译后生成由字节码组成的类文件(.class ).然后由类装载器装入来自类文件的字节码,经过检验器安全验证后,由JVM 读取字节码,转换为特定平台的指令,并在相应的C PU 中运行.J V M 是Java 程序运行的心脏,了解并分析它对于实现Java 虚拟机是非常重要的.作者以Kaffe (一种J av a 虚拟机的实现)的桌面版本为例,对虚拟机进行较深入地分析.2 Java 虚拟机的运行过程Kaffe 是一个JVM 以及类库的实现,这种实现采用开放源代码的形式[2].任何Java 程序都是由若干个类组成的,其中只有一个主类.源程序是一个.java 文件,它经过编译后生成若干个.class 文件..class 文件的个数由程序中类的个数决定[3].J V M 在执行某个程序时,首先从主类的main 方法开始.所以在虚拟机运行的时候,首先要给出主类的名字,然后虚拟机会根据用户提供的名字按照系统设定的class 路径寻找该类,并将其装载、链接、初始化(如果找不到该类,则报告错误并退出).同时,该类的初始化有可能引起其他类的初始化(因为在一个类初始化之前它的父类必须被初始化).初始化完成后,虚拟机便寻找主类的main 方法,并按照用户为m ain 方法提供的参数执行.当main 方法的代码成功执行后,虚拟机卸载当前线程并退出.此时整个程序的执行过程完毕.用户可以自己设定一些JVM 的环境参数,虚拟机程序执行的第1步是处理用户对这些参数的设置,然后开始执行程序.例如,可以利用命令行kaffe v ersio n 获得这个虚拟机的版本号,也可以通过kaff mx 设置堆栈的最大容量.其他参数可以通过help 获悉.以下是一个Kaffe 执行过程的实例:欲执行程序hellow o rld.jav a,其源程序为:∥hello wo rld .jav a public class hello wo rld {public sta tic v oid main (String args []){sy stem.o ut.println (″hellow o rld″);}}Kaffe 虚拟机是用C 语言实现的,任何C 语言程序的执行都是从main 函数开始的,Kaffe 也不例外.图1是main 函数的程序流程图,它也是整个虚拟机的执行流程图.①程序执行过程如下:按照该流程,首先应该获得虚拟机环境参数的缺省值.获得该缺省值的功能由函数JN I GetDefault J av aV M InitArg s(&v margs )实现.该函数可将结构Kaffe JavaV M InitArg s 拷贝到v ma rg s 中.②处理命令行中用户设置的参数.该功能由函数static int o ptions (cha r **)完成.该函数的参数就是main (argc ,a rgv )中的a rgv ,它的返回值是一个整形量,表示该函数处理的参数量.③为虚拟机进行初始化、分配内存.该功能在main 中通过调用JN I Create Jav aV M (&v m ,&env ,&v marg s)实现.该函数中参数v mag s 是已经被赋初值的虚拟机参数集合,该函数在完成虚拟机的生成工作后将指向J V M 的指针存放在v m 中.虚拟机生成的工作主要是申请内存,然后将其中的参数进行缺省设置.④根据用户在命令行中提供的主类名寻找主类并将其装载、链接、初始化.这是整个虚拟机执行过程的重点.在函数main()中是通过调用kaffe Findclass()实现的.kaffeFindclass()起到了调度的作用,图2是它的流程图.可以看出,欲处理的类可能是数组或类.因为在Java 中数组是被看作类处理的.函数loo kupclass()的功能是寻找指定的非数组类并完成它的初始化.lookupclass ()的流程图见图3.61 第1期王立冬等:Jav a 虚拟机分析 lo okupclass *源程序如下:Hjava la ngClass *lo okupClass (const char *name ,error Info *einfo ){Hjava langClass *cla ss;Utf8Co nst*utf8;uft8=utf8Co nstNew (name,-1); /*将欲处理的类的名字转化为U tf8形式*/if (!utf 8){postOutOfM emo ry (einfo );return 0;}class=loadClass(utf8,N U LL,einfo ); /*调用loadclass()完成类的装载*/utf 8ConstRelease (utf 8);if (class !=0){ /*如果类已成功装载,调用processclass()*/if (processClass (class ,CSTA TECOM-PLETE ,einfo )==true ){return (class);} } return(0);}Lookupclass ()函数中所调用的两个子函数loadclass ()和processclass ()的功能分别是装载和链接、初始化.loadclass()的流程图见图4.loadclass ()首先检查classentry 表,该表记录已经被装载类的情况.假设方法1用到类A ,则装载类A,若方法2也用到类A,方法2就不必再装载该类.因为方法2通过classentry 表得知类A 已经被装载.每个classentry 表项的内容如下:typedef struct classEntry {U tf8Const* name;∥该表项所表示的类的名字Hjav a lang Class Loader * loader ;∥该类被装载时所用的装载器Hjav a langClass * class;∥指向该类在内存中的指针62北京理工大学学报第22卷 struct cla ssEntry* nex t;∥指向下一个表项的指针struct iLock* lo ck;∥实现查询或更改该表的同步}classEntry;Loadclass()查询classentry表,看所指定的类是否已经被装载.若装载,则返回指向该类的指针;否则,创建一个classentry表项、该类装载完成后使entry->class指向该类.查看它的父函数loo kupclass()是否给出了具体的装载器.装载器是Java中类cla sslo ader及它的子类,它们的功能是完成类的装载.如果给出了装载器,就执行该装载器类的方法.如果loo kupclass()没给出具体的loader,则使用findclass()函数.该函数寻找指定类,并完成它的装载,然后返回指向该类的指针.如果loader或findclass()执行不成功,就会给出错误信息并返回空指针.Loadclass()完成后,lo okupclass()会调用Processclass(),完成对已装载类的链接和初始化.装载、链接、初始化都完成后,对编译后的main方法的字节码逐条加以解释.这里虚拟机解释的是字节码,字节码是Jav a源程序经过编译后的结果.如果把虚拟机看成是一个真正的机器,那么字节码就是这台机器的汇编语言.按照Sun的Java虚拟机规范,JV M拥有大约220条指令.Jav a源程序经过编译后所生成的类文件相当于Java源程序的汇编程序,这里的汇编指令是虚拟机的指令.在Kaffe中,逐条解释字节码是通过函数runvirtualmachine()实现的.在kaffe.def中定义了每一条虚拟机指令的解释程序[4].runvirtualm achine()的执行过程是一个循环体很大的循环,该循环如下(忽略异常):do{fetch an opcode;If(opera nds)fetch o perands;ex ecuter the action fo r the o pcode;}while(there is mo re to do);kaffe的实现也是如此,取一条字节码指令后会进入一个大的case语句中,使其与指令集中的220条指令进行匹配,匹配指令的解释程序将被执行.3 面向堆栈的体系结构在一般计算机中,操作数放在寄存器或者存储器中.而Jav a虚拟机采用了面向堆栈的体系结构. JV M中的堆栈区用来存储操作数和中间结果,传递参数并返回结果,同时也跟踪方法的执行状态.方法的执行状态称为当前方法的堆栈框架(stack frame),它保存方法的当前执行信息(局部变量、中间结果等).堆栈框架包括3个部分:局部变量区、操作数栈和执行环境区.局部变量区包含当前方法用到的所有局部变量.操作数栈是字节码指令的工作区,操作数栈顶指针寄存器(o ptop register)存放栈顶地址.执行环境区维护栈本身的操作,执行环境寄存器(frame register)中包含指向它的指针.4 结束语Java是一种解释型语言,逐条解释字节码的过程是比较耗时的,这导致了Java的致命缺点——速度慢.Syma ntec,Borland,Microsoft等大公司都在开发JIT(及时)编译器,程序开始执行之前把字节码编译成本地机器码,这样就用字节码编译器代替了翻译器.采用这种技术的Jav a虚拟机性能大幅度提高,通常比翻译器的速度快5~10倍.也许将来JIT编译器会成为Java虚拟机整体的一部分,从而使Java虚拟机性能满足应用的要求.Java应用需要解决的主要问题之一是加快虚拟机的运行速度.本文中以一种JV M的源代码为例,分析了虚拟机的运行过程,意在对改进它的运行机制起到一些作用.参考文献:[1] V anhelsuwe L.J av a从入门到精通[M].邱仲潘译.北京:电子工业出版社,1997.V anhelsuwe L.M aste ring J av a[M].Qiu Zhong panT ransl..Beijing:Elect ro nics Industry PublishingHouse,1997.(in Chinese)[2] Sun M ic rosy stems Inc.The J av a lang uag e speci-fica-tio n, 1.0ed.[EB/O L].ht tp:∥jav a.sun.co m/docs/boo ks/,1999-09-01/2001-04-25.[3] Lindho lm T,Y ellin F.Java虚拟机规范[M].玄伟剑译.北京:北京大学出版社,1998.Lindho lm T,Yellin F.J av a v irtr al machine speci-fica-tio n[M].Xuan W eij ian T ra nsl..Beijing:Peking U ni-v er sity Pr ess,1998.(in Chinese)[4] Sun M icro systems Inc.The J av a v irtual machine spec-ification,2nd ed.[EB/O L].h ttp:∥java.sun.co m/do cs/boo ks/,1999-09-01/2001-04-25.63 第1期王立冬等:Jav a虚拟机分析。

相关文档
最新文档