资源描述:
《java虚拟机分析》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、Java虚拟机分析1Java虚拟机Java不仅是一种跨平台的语言,而且是一种新的X络计算平台.该平台包括许多相关的技术,如符合开放接口标准的各种API优化技术等.Jjva技术使同一种应用可以运行在不同的平台上.Java平台可分为两部分,即Java虚拟机(Javavirtualmachine,JVM)和JavaAPI类库在Java平台的结构中,JVM处在核心的位置.它的下方是移植接口.移植接口由两部分组成,其中依赖于平台的部分称为适配器.JVM通过移植接口在具体的平台和操作系统上实现.在JVM的上方是Java
2、的基本类库和API.利用JavaAPI编写的应用程序(application)和小程序(Javaapplet)可在任何Java平台上运行而无需考虑底层平台,从而实现了Java的平台无关性.Java程序的执行过程是:首先,源程序(.java)经过编译器编译后生成由字节码组成的类文件(.class).然后由类装载器装入来自类文件的字节码,经过检验器安全验证后,由JVM读取字节码,转换为特定平台的指令,并在相应的CPU中运行.JVM是Java程序运行的心脏了解并分析它对于实现Java虚拟机是非常重要的.以Kaff
3、e(一种Java虚拟机的实现)的桌面版本为例,对虚拟机进行较深入地分析.1Java虚拟机的运行过程Kaffe是一个JVM以及类库的实现,这种实现采用开放源代码的形式m.任何Java程序都是由若干个类组成的,其中只有一个主类.源程序是一个.java文件,它经过编译后生成若干个.class文件..class文件的个数由程序中类的个数决定m.JVM在执行某个程序时,首先从主类的main方法开始.所以在虚拟机运行的时候,首先要给出主类的名字,然后虚拟机会根据用户提供的名字按照系统设定的class路径寻找该类,并将其
4、装载链接、初始化(如果找不到该类,则报告错误并退出).同时,该类的初始化有可能引起其他类的初始化(因为在一个类初始化之前它的父类必须被初始化).初始化完成后,虚拟机便寻找主类的main方法,并按照用户为main方法提供的参数执行.当main方法的代码成功执行后,虚拟机卸载当前线程并退出.此时整个程序的执行过程完毕.用户可以自己设定一些JVM的环境参数,虚拟机程序执行的第1步是处理用户对这些参数的设置,然后开始执行程序.例如,可以利用命令行kaffe_version获得这个虚拟机的版本号,也可以通过kaff一
5、mx设置堆栈的最大容量.其他参数可以通过_help获悉.以下是一个Kaffe执行过程的实例:欲执行程序helloain(Stringargs[]){system.out.println(helloain函数开始的,Kaffe也不例外.图1是main函数的程序流程图,它也是整个虚拟机的执行流程图.①程序执行过程如下:按照该流程,首先应该获得虚拟机环境参数的缺省值.获得该缺省值的功能由函数JNI_GetDefaultJavaVMInitArgs(vmargs)实现.该函数可将结构Kaffe_JavaVMInit
6、Args拷贝到vmargs中.②处理命令行中用户设置的参数.该功能由函数staticintoptions(char**)完成.该函数的参数就是main(argc,argv)中的argv,它的返回值是一个整形量,表示该函数处理的参数量.③为虚拟机进行初始化、分配内存.该功能在main中通过调用JNI_CreateJavaVM(vm,env,vmargs)实现.该函数中参数vmags是己经被赋初值的虚拟机参数集合,该函数在完成虚拟机的生成工作后将指向JVM的指针存放在vm中.虚拟机生成的工作主要是申请内存,然后
7、将其中的参数进行缺省设置.④根据用户在命令行中提供的主类名寻找主类并将其装载链接、初始化.这是整个虚拟机执行过程的重点.在函数main()中是通过调用kaffe_Findclass()实现的.kaffe_Findclass()起onst*utf8;uft8=utf8ConstNee,-1);/将欲处理的类的名字转化为Utf8形式*/if(!utf8){postOutOfMemory(einfo);return0;}>调用loadclass()完成类的装载*/utf8ConstRelease(utf8);if
8、(class!=0){*如果类己成功装载,调用processclass()*/if(processClass(class,CSTATE_PLETE,einfo)==true){return(class);}}return(0);}Lookupclass()函数中所调用的两个子函数loadclass()和processclass()的功能分别是装载和链接、初始化.loadclass()的流程图见图4.loadcla