实现将java技术移植到JVM上运行的方法

时间:2022-08-03 10:48:12

实现将java技术移植到JVM上运行的方法

摘要:完整的计算机体系结构实质上就是Java虚拟机在目标系统上通过软件模拟实现的,JVM是Java技术的重要组成部分,它是抽象设计出来的计算机的软件实现.本文设计完成了实现应用程序和目标平台分离的实例,成功地将java代码移植到JVM平台上。

关键词:JVM java虚拟机 Linux操作系统

中图分类号:TP314 文献标识码:A 文章编号:1007-9416(2012)07-0244-01

在应用程序与处理器之间建立多个中间层是Java虚拟机(JVM,Java Virtual Machine)的任务,将解释器根据JVM规格描述移植到特定的计算机系统上,经过编译的任何Java源程序就能在该特定系统上运行。

1、JVM的实现分析

JVM可以简单看成是由装载器和执行引擎组成,设计中的移植工作主要集中在执行引擎,执行引擎实质上就是一系列指令的集合.对于其中的每一条指令,Sun Microsystems公司在规范中描述了每条指令应该完成什么样的功能,但是并没有说明怎样实现功能,下面跟据kaffe[1]对其分析:

1.1 JVM指令集的设计

Java技术的平立性、网络移动性、安全性等一些特性影响了JVM指令集[2]的设计,其中平立性是指令集设计的主要影响因素.基于堆栈的结构使JVM可以在更多的平台上实现,微小的操作码、紧凑的结构使Java字节码可以更加有效的利用带宽,而一次性的字节码验证既使得字节码更安全又不影响太多的性能。

有时执行引擎可能会遇到一个需要调用本地方法的指令,在这种情况下执行引擎会去试图利用JNI调用本地方法,然后执行引擎决定下一步执行哪一条指令,执行引擎有三种方法[3]来读取下一条指令:执行和当前指令相关的指令;执行当前指令中指定的下一条指令,这些指令包括goto、return等;当前指令抛出异常时,执行引擎通过匹配catch语句来寻找下一条应该执行的指令。

1.2 引入不同的执行技术

许多种执行翻译技术可以用在Java虚拟机的实现中,包括解释执行与及时编译技术和动态编译技术等。

1.3 线程的管理

在JVM规范中,Java线程被描述为变量、主存区、工作区.每个JVM实例都有一个主存区,它包含了所有程序的变量(对象、数组合类变量)。其中对应的每一个线程都有自己的工作区,可以用来保存线程可能使用到的存放在主存中变量的拷贝。

2、JVM运行实例

下面是通过简单Java实例的运行过程,直观的描述Java代码在JVM中的运行过程.

首先输入Java源代码,如下所示,它实现的功能是在屏幕上输出“Hello China!”.

class He11oChina{

public static void main(String argv[])

{System.out.println("Hello China!");}}

源文件Hello.java通过编译器编译生成字节码文件Hello.class,再利用JDK中的反编译工具javap可以查看.class文件中包含该部分Java代码对应的字节码.然后Java虚拟机启动运行Hello.class文件,运行情况如下:

Stack=2,Locals=1,Args_size=1

0:getstatic#2;//Field java/hello/System.out:Ljava/io/PrintStream;

3:Idc#3;//String HelloChina!

5:invokevirtual#4;//MethodjavaCo/PrintStream.println:(Ljava/lang/String;)V

8:return

Hello.class文件在运行的时候,常量池的解析需要JVM的类装载器[4]调用其它基本Java API来完成。这个过程调用的非常重要,因为在常量池中不仅包含了代码中定义的各种基本数据类型和对象型的常量值,一些以文本形式出现的符号引用也包含其中,如字段的名称和描述符、类和接口的全限定名、方法和名称的描述符等。载入Hello.class文件的常量池后,constantPoolStruct的结构体实例将被生成,在constantPoolEntryStruct数组中最后一项后有一个字节数组,这个字节数组中的每一个字节实质是一个“常量池项头”,其长度为constant_pool_count-1,与实际的常量池项数相同,即相应常量池项的类型在这个字节中就被指明了。

由于Java库是动态调用的,在编译时如果发现对其它类字段的引用或者对其它类方法的调用,被记录进。class文件中的只是一个文本形式出现的符号引用,JVM将在连接过程中根据相应的文本信息去查找对应的方法或字段。而在C语言中,如要调用其它库中的函数,该函数在库中的位置(即相对于头文件的偏移量)在连接时必须写在程序的开头部分,在运行时将根据这个地址去调用相应函数.正因如此,JVM最终必须得到本地库的支持,如Linux平台下的基础类库libc.so。

此外,JVM在运行过程中还创建了独立于平台的方法区、堆、栈等,执行引擎此时就如同CPU硬核[5]一般,不断的获得字节码指令并执行,直到JVM退出运行为止。

3、结语

JVM处在Java平台的核心位置,是程序与底层操作系统和硬件无关的关键所在.它的下方是移植接口,移植接口由两部分组成:适配器和操作系统.其中依赖平台的部分称为适配器,JVM通过移植接口在具体的平台和操作系统上实现.在JVM的上方是Java的基本类库和扩展类库以及它们的API,利用Java API编写的应用程序可以在任何Java平台上运行.JVM采用这种结构实现了程序与操作系统的分离,从而实现了Java的平台无关性.

参考文献

[1]Peter Dibble.实时Java平台编程[M].北京:机械工业出版社,2003.

[2]Bill Venners.深入Java虚拟机[M].北京:机械工业出版社,2003.

[3]闫伟,谷建华.Java虚拟机即时编译器的一种实现原理[J].微处理机,2007(5).

1基金项目

牡丹江师范学院学校青年一般项目(QY201001)。

作者简介

金玉苹(1981-),女,讲师,硕士,主要研究方向:嵌入式系统设计。

上一篇:本达生物有机肥在玫瑰香葡萄上的施用效果 下一篇:复合稀土对帅枣生长和发育的影响