(计算机应用技术专业论文)基于“龙芯”平台的java运行环境研究.pdf_第1页
(计算机应用技术专业论文)基于“龙芯”平台的java运行环境研究.pdf_第2页
(计算机应用技术专业论文)基于“龙芯”平台的java运行环境研究.pdf_第3页
(计算机应用技术专业论文)基于“龙芯”平台的java运行环境研究.pdf_第4页
(计算机应用技术专业论文)基于“龙芯”平台的java运行环境研究.pdf_第5页
已阅读5页,还剩48页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

摘要 随着j a v a 语言在许多领域的广泛应用以及“龙芯 处理器市场化的进一步扩大, 为改善“龙芯”处理器平台对j a v a 运行环境的支持,以提高对j a v a 程序的运行效率。 借鉴j d k l 5h o t s p o t 虚拟机在“龙芯 平台上移植和优化的工作经验,研究j d k 6 版本 h o t s p o tj a v a 虚拟机在“龙芯平台上的移植已成为迫切的任务。 本文主要讨论基于“龙芯”平台的j d k 6j a v a 虚拟机的移植技术。首先根据j a v a 虚拟机规范分析了j a v a 语言体系结构。然后研究了j d k 6h o t s p o t 虚拟机,主要分析了 j d k 6h o t s p o t 虚拟机的结构、运行机制等。接着分析了将j d k 6h o t s p o t 虚拟机的各个 功能模块,如汇编器、解释器、j i t 编译器以及运行时环境等。最后针对“龙芯”平台 上的具体应用,研究了j d k 6h o t s p o t 移植到龙芯处理器平台系统上的关键技术,给出 了相应的移植方案。通过初步的移植,使得“龙芯”平台通过移植后的j d k 6h o t s p o t 虚拟机能在c o n s o l e 端支持j a v a 运行环境。 最后借助j v m 9 8 基准测试程序和o p r o f i l e 性能分析工具,对已完成的j d k 6 h o t s p o t 虚拟机进行了性能分析,经过数据对比,分析了移植后的h o t s p o t 虚拟机的性 能瓶颈,并提出了初步的优化方案。 关键字: j d k 6h o t s p o t ,j a v a 虚拟机,龙芯平台,j a v a ,移植 r e s e a r c ho fj a v ae n v i r o n m e n to nl o o n g s o n - b a s e dp l a t f o r m l ip a n p a n ( c o m p u t e r a p p l i c a t i o nt e c h n o l o g y ) d i r e c t e db yp r o f w us h a o g a n g a b s t r a c t w i t ht h ee x t e n s i v ea p p l i c a t i o no fj a v al a n g u a g ei nm a n ya r e a sa n dt h ef u r t h e re x p a n s i o n o fm a r k e t - o r i e n t e do fl o o n g s o n ,a n dt oi m p r o v et h e ”l o o n g s o n ”p l a t f o r mf o rt h ej a v a r u n t i m ee n v i r o n m e n ts u p p o r ta n de n h a n c et h eo p e r a t i n ge f f i c i e n c yo fj a v ap r o g r a m ,d r a w i n g t h ew o r k i n ge x p e r i e n c eo fp o r ta n do p t i m i z a t i o no fj d k l 5h o t s p o tv i r t u a lm a c h i n e ( j v m ) , t h er e s e a r c ha n dp o r t i n go fj d k 6h o t s p o tj v mo nl o o n g s o np l a t f o r mi sb e c o m i n gau r g e n t t a s k t h i sd i s s e r t a t i o n m a i n l yf o c u s e so nt h ep o r to fj d k 6h o t s p o tj v mo nl o o n g s o n p l a t f o r m f i r s t ,w em a k ea ni n t e n s i v es t u d yo fj a v aa r c h i t e c t u r eb a s eo nt h ej a v av i r t u a l m a c h i n es p e c i f i c a t i o n t h e nt h ej a v av i r t u a lm a c h i n ew a ss t u d i e d t h ea r c h i t e c t u r ea n d r u n n i n gm e c h a n i s mo ft h ej d k 6h o t s p o tj v ma n a l y s e d t h e nt h ef u n c t i o nm o d u l e so f j d k 6 h o t s p o tj v ms u c ha sa s s e m b l e r , i n t e r p r e t e r , j i ti n t e r p r e t e r , a n dr u ne n v i r o n m e n tw e r e s t u d i e d f i n a l l y , t h ek e yt e c h n i q u e s o ft h e p o r t i n gj d k 6h o t s p o tv mt og i v e n l o o n g s o n - b a s e da n do p e r a t i n gs y s t e mf o rl o o n g s o n b a s e da p p l i c a t i o nw e r es t u d i e d ,t h e p o r t i n gs c h e m ew a sp r o v i d e d t h r o u g ht h ei n i t i a lp o r t i n go nl o o n g s o n b a s h e dp l a t f o r m ,t h e l o o n g s o n - b a s e dp l a t f o r mc o u l ds u p p o r tj a v ar u n n i n ge n v i r o n m e n t o nc o n s o l eb yp o r t e d j d k 6h o t s p o tv m u s i n gp e r f o r m a n c ea n a l y s i st o o l ss u c ha sj v m 9 8b e n c h m a r k s ,o p r o f i l e ,p e r f o r m a n c e a n a l y s isw a sc a r r i e d o u to np o r t e dj d k 6h o t s p o tj v m ,a f t e rc o m p a r i n gd a t a ,t h e p e r f o r m a n c eb o r l e n e c ko fh o t s p o tv mw a sa n a l y s e d ,a n dt h eo p t i m i z a t i o ns o l u t i o nw a s g i v e n k e yw o r d s :j d k 6h o t s p o t ,j a v a v i r t u a lm a c h i n e ,l o o n g s o n ,j a v a ,p o r t i n g 关于学位论文的独创性声明 本人郑重声明:所呈交的论文是本人在指导教师指导下独立进行研究工作所取得的 成果,论文中有关资料和数据是实事求是的。尽我所知,除文中已经加以标注和致谢外, 本论文不包含其他人已经发表或撰写的研究成果,也不包含本人或他人为获得中国石油 大学( 华东) 或其它教育机构的学位或学历证书而使用过的材料。与我一同工作的同志 对研究所做的任何贡献均已在论文中作出了明确的说明。 若有不实之处,本人愿意承担相关法律责任。 学位论文作者签名: 日期:1 。口7 年f 月五f 日 学位论文使用授权书 本人完全同意中国石油大学( 华东) 有权使用本学位论文( 包括但不限于其印刷版 和电子版) ,使用方式包括但不限于:保留学位论文,按规定向国家有关部门( 机构) 送交学位论文,以学术交流为目的赠送和交换学位论文,允许学位论文被查阅、借阅和 复印,将学位论文的全部或部分内容编入有关数据库进行检索,采用影印、缩印或其他 复制手段保存学位论文。 保密学位论文在解密后的使用授权同上。 学位论文作者签 指导教师签名: 日期:1 年5 月训e t 醐叫0 1 年朋训日 中国石油大学( 华东) 硕士学位论文 第一章绪论 “龙芯”系列处理器是我国拥有完全自主知识产权的高性能通用处理器,随着“龙 芯”产业化的进一步扩大,“龙芯平台对j a v a 环境的支持也需要进一步的加强。 1 1 课题来源和背景 本课题来源于8 6 3 计划项目低成本先进计算机( 项目号:2 0 0 6 a a 0 1 0 2 0 1 ) ,同 时受江苏省科技成果转化项目龙芯c p u 产业化应用( 项目号:b a 2 0 0 4 0 2 9 ) 资助。 “龙芯”系列处理器是我国拥有完全自主知识产权的高性能通用处理器,与龙芯1 号处理器相比,“龙芯”2 号处理器性能大大提高,应用范围也更加广泛。 j a v a 语言作为新一代面向对象的语言自诞生以来就因其跨平台、安全性、动态运行 和自动内存管理等特性在许多领域获得了广泛的应用。同时随着l i n u x 操作系统占据了 更大的市场,j a v a 也逐渐成为l i n u x 应用以及跨平台应用的首选开发工具,为“龙芯” 处理器开发一个高效的j a v a 虚拟机是十分重要和必需的。j a v a 语言在具有上述优点的 同时也带来了j a v a 程序运行效率低的缺点,主要是由于字节码的执行速度较慢、自动内 存管理带来的时空开销、动态运行方式( 虚方法、接口和类载入) 的运行时开销且难以 优化以及大量的同步开销等。j a v a 运行时环境一个十分庞大的工程,其中最为关键的是 j a v a 虚拟机部分,它是执行j a v a 程序的核心部件。 1 2 国内外研究现状 j a v a 平台于1 9 9 5 年推出,当时,j a v a 虚拟机采用解释执行的方式,每条指令都由 虚拟机当场解释执行,执行速度非常慢。1 9 9 6 年底,s u n 发布了第一个j i t 编译器,j i t 编译器在每段代码执行前进行编译,编译的结果为本地静态代码,执行速度有了质的提 高,但由于它需要实时地编译所有方法,性能仍和c c + + 有较大的差距。1 9 9 9 年初, s u n 发布了第一代h o t s p o tj a v a 虚拟机引擎,利用对程序运行状况采样结果选择性地编 译j a v a 方法,这是一种动态编译技术,在j a v a 虚拟机的发展上具有里程碑的意义。 2 0 0 5 年初s u n 公司将j d k 系列源代码全部开放,使之成为开源项目,这也使得 h o t s p o tj a v a 虚拟机执行引擎的研究与开发成为可能。 2 0 0 5 到2 0 0 6 年,中国科学院计算技术研究所完成了“龙芯”“2 c ”和“2 e ”处理 器平台,g c c 3 4 上h o t s p o t 虚拟机中汇编器、解释器在“龙芯”平台上的移植和优化 工作【i 】o 第一章绪论 2 0 0 6 年底到2 0 0 7 年9 月,上届课题组完成了h o t s p o t 虚拟机在g c c 4 1 上汇编器 的移植工作。目前“龙芯”平台上基于j a v a 虚拟机的软件都是运行在g c c 4 1 编译的汇 编器平台上。 1 3 本文的工作 总结刘超等在j d k l 5h o t s p o t 虚拟机移植工作的基础上【l 】,研究和分析了j d k 6 h o t s p o t 虚拟机在“龙芯”平台上的移植和初步优化工作。具体的工作包括下面几个方 面: 研究了j a v a 虚拟机相关的各种技术,为进行j a v a 虚拟机的移植奠定基础。j a v a 虚 拟机是一个庞大而复杂的软件,到现在为止,已经被s u n 公司开发了l0 多年,它涉及 到非常广泛的计算机理论和技术,包括j a v a 虚拟机规范、字节码解释器、j i t 编译器和 垃圾收集等。 通过参考j d k l 5h o t s p o t 虚拟机在“龙芯”平台上移植和优化的经验,分析j d k 6 h o t s p o t 虚拟机各功能模块的研究和移植,通过对编译器、解释器和j i t 编译器等各功 能模块的研究和移植,初步实现了j d k 6h o t s p o t 虚拟机的在“龙芯”平台上提供j a v a 运行环境。接着论述调试j a v a 虚拟机的方法,并通过两则调试实例详述的调试的过程。 分析j d k 6h o t s p o t 虚拟机目前在“龙芯”平台上运行的性能瓶颈,首先使用j v m 9 8 基准测试工具对虚拟机进行平台对比测试,根据测试结果提出了对虚拟机访存优化设计 的方案;利用l i n u x 的o p r o f i l e 工具分析并改进性能,通过数据对比,得出了“龙芯” 平台上j d k 6h o t s p o t 虚拟机性能瓶颈和解决方案。 1 4 本文的组织 第二章介绍了“龙芯”平台及其指令集,并对j a v a 虚拟机体系结构进行分析。 第三章研究了j d k 6h o t s p o t 虚拟机在龙芯平台上的移植,主要通过汇编器、解释 器和j i t 编译器各个主要功能模块的移植及其在“龙芯”平台上的实现。 第四章主要通过g d b 和j d b 调试工具对h o t s p o t 虚拟机进行调试工作,同时也通 过d e b u g 版虚拟机的内部选项对虚拟机进行调试,接着有针对性的对解释器和编译器的 调试做了深入的研究,并以两则调试过程的实例详述调试的过程。 第五章对j d k 6h o t s p o t 虚拟机的性能分析,主要采用j v m 9 8 和o p r o f i l e 两种性能 分析工具,分析了移植后的j d k 6h o t s p o t 虚拟机在“龙芯”平台上性能低下的瓶颈, 并针对这一瓶颈,提出了优化方案。 2 中国石油大学( 华东) 硕士学位论文 第六章主要是总结和展望,对论文工作做了简单的总结,并给出以后的进一步研究 方向。 第二章“龙芯”平台j a v a 运行环境研究 第二章“龙芯”平台j a v a 运行环境研究 本章首先分析和研究了“龙芯”平台的体系结构,特别是与j a v a 运行环境相关的“龙 芯”平台指令集及寄存器相关部分。j a v a 运行环境是个非常“庞大”的工程,接下来的 工作是研究j a v a 虚拟机的体系结构,将需要移植的功能模块划分出来进行移植。 2 1 “龙芯”平台及其指令集简介 “龙芯”2 e 微处理器是一款实现6 4 位m i p si i i 指令集的通用r i s c 处理器,其指 令流水线每个时钟周期取四条指令进行译码,并且动态地发射到五个全流水的功能部件 中。虽然指令在保证依赖关系的前提下进行乱序执行,但是指令的提交还是按照程序原 来的顺序,以保证精确中断和访存顺序执行。 “龙芯”2 e 微处理器有两个定点功能部件和两个浮点功能部件,浮点部件通过浮 点指令的f m t 域的扩展可以执行3 2 位和6 4 位的定点指令,以及8 位和1 6 位的用于媒 体加速的s i m d 指令【2 l 。 2 2j a v a 体系结构研究 j a v a 体系结构由j a v a 程序设计语言,j a v ac l a s s 文件格式,j a v a 应用编程接口,j a v a 虚拟机等4 个部分组成【3 1 。j a v a 程序设计语言用来编写j a v a 源代码,在这个过程调用j a v a 应用编程接口来访问系统资源,j a v a 编译器把它编译成j a v ac l a s s 文件格式,即j a v a 程 序,然后再在j a v a 虚拟机中运行c l a s s 文件。j a v a 虚拟机和j a v a 应用编程接口( j a v a a p i ) 构成了j a v a 平台。j a v a 程序的跨平台特性,主要是由于j a v a 平台屏蔽了平台相关部分。 j a v a 虚拟机是运行j a v a 程序的抽象计算机,它是j a v a 体系结构的核心。其规范定义了 每个j a v a 虚拟机都要实现的特性,但具体的实现方式是灵活多样的,甚至某些特性可以 利用硬件来实现,j a v a 规范的灵活性保证了它能够在广泛的计算机或设备上得到实现。 j a v a 源代码转化为本地代码的过程如图2 1 所示。 图2 - 1j a v a 源代码到本地代码的过程 f i g 2 - 1 t h ep r o c e s so fj a v as o u r c ec o d et on a t i v ec o d e 2 2 1j a v a 虚拟机的执行引擎 执行引擎是j a v a 虚拟机的核心部分,如图2 2 所示。在j a v a 虚拟机的规范中,执 4 中国石油大学( 华东) 硕士学位论文 行引擎的实现由指令集来定义,j a v a 虚拟机规范中详细地规定了每一条j a v a 指令完成 的功能【3 4 】。 j a v a 虚拟机 i c l 鹳s 文件卜一类装载器卜 j a y aa p i 的l 1c l a s s 3 阱i 耐訇 上 图2 - 2j a v a 虚拟机的执行引擎 f i g 2 2 e x e c u t i o ne n g i n eo fj a v av i t r u a lm a c h i n e j a v ac l a s s 文件中的方法是由j a v a 虚拟机的指令序列构成的,每一条指令包含一个 单字节操作码,后面跟零个或者多个操作数,操作码表明需要执行的操作,操作数指向 j a v a 虚拟机执行操作码时需要的额外信息。操作码本身已经规定了它是否需要跟随操作 数,以及如果有操作数的话,它是什么形式的。根据操作码的需要,除了跟随操作码的 操作数外,可能还需要从另外的存储区得到操作数,比如说,当虚拟机执行一条指令的 时候,可能使用当前常量池中的项,当前桢的局部变量中的值,或者位于当前帧操作数 顶端的值。执行引擎会不时的遇到请求本地方法调用的指令,在这个时候,虚拟机尝试 调用这个本地方法,如果本地返回,执行引擎继续执行下一条指令。 j a v a 虚拟机指令集关注的中心是操作数栈。虽然j a v a 虚拟机没有实际的寄存器, 但每个方法都有一个局部变量集合。指令集实际的工作方式就是把局部变量当作寄存 器,用索引来访问。在使用保存在局部变量中的值之前,必须先将它压入操作数栈。平 台无关性是影响指令集设计的最大因素。指令集这种以栈为中心,而非以寄存器为中心 的设计方法,使得在那些只有很少寄存器,或者寄存器很没有规律的机器上实现j a v a 更加便利,x 8 6 就是一个例子,由于指令集具有这种以栈为中心的特征,所以在很多平 台的体系结构上都很容易实现j a v a 虚拟机。 j a v a 指令在j a v a 虚拟机上执行,j a v a 指令由一个字节的j a v a 操作码,以及后跟的 一个或者多个操作数组成,很多j a v a 指令没有操作数,在j v m 的源代码中,j a v a 操作 码在- v m i n t e r p r e t e r b y t e c o d e s h p p 文件中被定义。 j a v a 虚拟机的执行引擎实现方式有解释执行与j i t 编译两种方式。解释执行是一种 简单的实现方式,执行引擎读取每条字节码指令,然后将每条字节码解释执行成为本地 第二章 “龙芯”平台j a v a 运行环境研究 代码,如此反复。这样的执行引擎实现方式比较简单,但是执行效率非常低下,因为解 释工作是逐条地反复进行,导致程序中会有大量代码重复执行而浪费了许多时间。不过, j i t 编译器的执行效率得到了很大的提高,它是在第一次调用某个方法的时候,才将方 法的字节码翻译成为本地代码,并在以后再次调用这个方法的时候,直接调用本地代码。 由于是对整段代码的翻译,而且可以通过代码缓冲区保存本地代码,从而极大提高了虚 拟机的运行速度。另外它还可以对整段代码进行本地优化,使解释字节码的效率得到大 大提高,节约了大量的调用时间和空间开销。 2 2 2j a v a 虚拟机的生命周期 每执行一个j a v a 程序,就会创建一个j a v a 虚拟机的实例。j a v a 虚拟机的实例在j a v a 工具中被创建,比如说b i n j a v a 这条命令在j 2 s e s r c s h a r e b i n j a v a c 文件中实现,它的 m a i n 函数会创建一个j a v a 虚拟机的实例,从这个m a i n 函数中可以看出j a v a 虚拟机实 例从创建到消亡的过程【5 】。 i 类装载嚣 j - +l 方溪压 常赣池i 一一一一j 一一一1 ( 装鼗 ( 存被雉区 围囡 j 舛a 方 一些链 ( 存毽 法的 接、珏 o o p 落 j 葛v a 指 麓权限寅铡鲫 、莓信 基) 令) 感 蟹个线程被镬 +辛牛 l 执行懿磐ll 拳地方法入疆 图2 - 3j a v a 虚拟机的体系结构 f i g 2 - 3 a r c h i t e c t u r eo fj a v av i t r u a lm a c h i n e j a v a 虚拟机的体系结构如图2 3 所示【4 巧j 。 当一个j a v a 程序开始运。- i , - t - ,就会创建一个j a v a 虚拟机实例。每个j a v a 虚拟机实 例都有一个类装载子系统,它根据给定的全限定名装载c l a s s 文件,同样,每个j a v a 虚 拟机实例都有一个执行引擎,它负责执行包含在被装载类的方法中的指令。当j a v a 虚拟 机运行一个程序的时,它需要“运行时数据区”来存储字节码,c l a s s 文件中的相关信息, 程序创建的对象,传递给被调用方法的参数,方法返回值,局部变量,以及运算的中间 结果等。其中某些数据区是由程序中所有线程共享的,还有一些则是线程独有的。每个 6 中国石油大学( 华东) 硕士学位论文 j a v a 虚拟机实例都只有一个方法区、一个常量池和一个堆区,它们由所有线程共享的。 当虚拟机装载一个c l a s s 文件时,它会从这个c l a s s 文件包含的2 进制数据中解析类型信 息。然后把这些类型信息放到方法区中。当程序运行时,虚拟机会把所有该程序运行时 创建对象都放到堆中,每当一个新的线程被创建时,它都将得到它自己的p c 寄存器, 以及一个j a v a 栈,如果线程正在执行的是一个j a v a 方法,那么p c 寄存器的值总是指示 下一条将被执行的指令。而它的j a v a 栈则总是存储该线程中j a v a 方法调用的状态,包 括它的局部变量,传进来的参数,返回值,以及运算中的中间结果等。h o t s p o tj a v a 虚 拟机本地方法的调用和j a v a 方法的调用共用一个j a v a 栈,j a v a 栈是由许多的帧组成, 一个帧包含一个j a v a 方法调用的状态,比如参数、局部变量和同步信息等,当线程调用 一个j a v a 方法时,虚拟机压入一个新的帧到该线程的j a v a 栈中,方法返回时,这个帧 被从j a v a 栈中弹出并抛弃。 2 2 3j a v a 虚拟机中的线程 j a v a 虚拟机是一个典型的多线程程序,各个线程相互协作完成对j a v a 指令执行的 功能。每个j a v a 虚拟机实例中,首先要对j a v a 虚拟机运行时环境做一个必要的初始化, 然后创建第一个线程,即j a v a 虚拟机主线程,这是执行j a v am a i n 方法的线程,然后, 创建其它j a v a 虚拟机执行需要的线程,f l 了- s r c v m r u n t i m e t h r e a d c p p :c r e a t e _ v m 方法完 成该部分功 t 6 j 。 j a v a 虚拟机运行时存在的线程,除了j a v a 虚拟机服务线程( 也叫v m t h r e a d ,j a v a 虚拟机线程) 和定时器线程( w a t c h e r t h r e a d ,提供时钟滴答的功能) 外,其它所有的线 程都叫j a v a 虚拟机线程。j a v a 虚拟机线程分为两类,一类是守护线程( d a e m o nt h r e a d ) , 用来对j a v a 程序的执行提供支持;另一种类型的线程是j a v a 执行线程,这与j a v a 程序 中的线程一一对应。此外,还有一个特殊的线程,即p t h r e a d 的管理线程,在一个进程 中,创建第二个线程时,这个线程被自动创建。无论是j a v a 线程还是j a v a 虚拟机线程, 都是基于l i n u x 的线程库实现的【7 捌。 2 2 4 运行时数据区 运行时数据区由方法区、堆区、p c 寄存器、栈区和本地方法栈等几部分构成,本 节将分别叙述这几个部分。 当虚拟机装载某个类型时,它使用类装载器定位相应的c l a s s 文件,然后读入这个 c l a s s 文件,接着j a v a 虚拟机提取其中的类型信息,并将这些信息存储到方法区,该类 7 第二章 “龙芯”平台j a v a 运行环境研究 型中的类( 静态) 变量同样也是存储在方法区中。对每个被装载的类型,虚拟机都会在 方法区存储该类型的全限定名、该类型直接超类的全限定名、该类型是普通类还是接口 类,该类型的访问修饰符和任何直接超接口的全限定名的有序列表。除了上面的基本类 型信息,虚拟机还为每个被装载的类型存储该类型的常量池、字段信息、方法信息、除 了常量以外的所有类变量、一个到c l a s s l o a d e r 的引用和一个到c l a s s 类的引用。由于所 有的线程都共享方法区,因此位于方法区的数据的访问必须被设计为线程安全的。比如, 假设同时有2 个线程都企图访问一个名为l a v a 的类,而这个类还没有装入虚拟机,那 么,这时只应该有一个线程去装载它,而另一个线程只是等待。方法区的大小不必是固 定的,虚拟机可以根据应用的需要动态调整。同样,方法区也不必是连续的,方法区可 以在堆中自由的分配。方法区也可以被垃圾回收,因为虚拟机允许通过用户定义的类装 载器来动态扩展j a v a 程序,因此些类也会成为程序不再引用的类,当某个类变为不再 引用的类时,j a v a 虚拟机可以卸载这个类,从而使得方法区占据的内存保持最小。 j a v a 程序运行时创建的所有类实例或数组都放在同一个堆中,而一个j a v a 虚拟机 实例中只存在一个堆空间,因此所有的线程都将共享这个堆。又由于一个j a v a 程序独占 个j a v a 虚拟机实例,因而每个j a v a 程序都有自己的堆空间,即它们不会彼此干扰。 但同一个j a v a 程序的多个线程共享着一个堆空间,在这种情况下,就得涉及多线程访问 对象的同步问题,和方法区一样,j a v a 堆也不必是连续的物理内存空间。 对于一个运行中的j a v a 程序而言,其中的每一个线程都由它自己的p c 寄存器,它 是在线程启动时创建的,p c 寄存器的大小是一个字长,因此它能够维持一个本地指针, 也能够持有一个返回地址,当线程执行某个j a v a 方法时,p c 寄存器的内容总是下一条 被执行指令的地址,这里的地址可以是一个本地指针,也可以是在方法字节码中相对于 该方法起始指令的偏移量。如果该线程正在执行一个本地方法,那么p c 寄存器的值是 未定义的。 栈帧由3 部分组成,包括局部变量区、操作数栈和帧数据区。局部变量区和操作数 栈的大小根据对应的方法而定,它们按字长计算,j i t 编译器在编译时就确定了这些值 并放在j a v ac l a s s 文件中,帧数据区的大小依赖于具体实现。 局部变量区中j a v a 栈帧的局部变量区被组织为一个以字长为单位的,从0 开始计数 的数组,即字节码指令通过从0 开始的索引来使用其中的数据。类型为i n t 、f l o a t 、r e f e r e n c e 和r e t u m a d d r e s s 的值在数组中只占据一项,且类型为b y t e 、s h o r t 和c h a r 的值在存入时 被转化为i n t ,但类型为l o n g 和d o u b l e 的值在数组中占连续的两项。局部变量区包括对 8 中国石油大学( 华东) 硕士学位论文 应方法的参数和局部变量,编译器按照声明的顺序把参数放入局部变量数组中。 对于操作数栈和局部变量区一样,操作数栈也是被组织为一个以字长为单位的数 组,但和前者不同的是,它不是通过索引来访问,而是通过标准的栈操作一压栈和出栈 来访问的。不同于具体硬件的实现,j a v a 虚拟机没有寄存器,程序计数器也无法被程序 指令直接访问,j a v a 虚拟机的指令是从操作数栈中而不是从寄存器中取得操作数的,因 此它的运行方式是基于栈的而不是基于寄存器的。虽然指令也可以从其它地方取得操作 数,比如从字节码流中跟随在操作码之后的字节中或从常量池中,但主要还是从操作数 栈获得操作数。虚拟机把操作数栈作为它的工作区一大多数指令都要从这里弹出数据, 执行运算,然后把结果压回操作数栈。 一个运行中的j a v a 程序,还可能用到一些跟本地方法相关的数据区。当某个线程调 用一个本地方法时,本地方法不受j a v a 虚拟机的限制,它可以通过本地方法接口来访问 虚拟机的“运行时数据区 ,任何本地方法接口都会使用某本地方法栈。当线程调用j a v a 方法时,虚拟机会创建一个新的栈帧并压入j a v a 栈。当调用本地方法时,虚拟机就会保 持j a v a 栈不变,只是简单的动态连接并直接调指定的本地方法。如果虚拟机实现本地方 法接口使用的是c 连接模型,那么它的本地方法栈就是c 栈。当c 程序调用一个c 函 数时,其栈操作是确定的,传递给该函数的参数以某个确定的顺序压入栈,它的返回值 也是用确定的方式传回给调用者。如果本地方法接口需要回调j a v a 虚拟机中的j a v a 方 法,该线程会保存本地方法栈的状态进入另一个j a v a 栈。就像其它“运行时数据区”一 样,本地方法占用的内存区不必是固定大小的,它可以根据需要动态扩展或者收缩。 2 3j d k 6j a v a 虚拟机体系结构介绍 j a v a 命令行工具是载入j a v a 程序的起点,它接受命令行参数,根据参数选择合适 版本的l i b j v m s o 虚拟机动态运行库,调用其中的j n ic r e a t e j a v a v m 方法创建虚拟机实 例,并将命令行参数传递给虚拟机实例。然后调用l i b j v m s o 动态库中的 j n ic a l l s t a t i c v o i d m e t h o d 方法运行j a v a 程序的m a i n 方法。j a v a 命令工具的源代码在 c o m m a n d 目录下。j d k 中包括了很多其它命令工具,它们大都是用j a v a 实现的,只需 要修改j a v a 命令工具执行的m a i n 方法即可,它们也可以在c o m m a n d 下直接编译出来。 本地库实现了j a v a 库中的本地方法,包括j a v a 、h p i 、v e r i f y 等。这些本地库由h o t s p o t 虚拟机在需要时动态载入。每个本地库都占一个目录,都可以单独编译。g u i 目录下的 是几个图形库a w t 、i a w t 、m a w t 等,其中m a w t 有两个版本分别基于x 1 1 和o p e n m o t i f - 2 1 。 9 第二章“龙芯”平台j a v a 运行环境研究 j s o u n d 目录下还有个j s o u n d a l s a 库。 h o t s p o t 的代码在目标h o t s p o t 下,它们编译生成l i b j v m s o 动态库文件,它提供j n i 规范规定的j n i 接口供c c + + 程序( 如i a v a 命令) 使用。 2 3 1内存模型与垃圾收集器 h o t s p o t 虚拟机性能引擎消除了句柄的概念。对象的引用被实现为直接指针,从而 可提供对实例变量的速度访问【1 0 1 。 h o t s p o t 虚拟机性能引擎使用双机器一字对象头,而不是像j a v a 2 s d k 那样使用三字 对象头。由于平均的j a v a 编程语言的对象尺寸较小,因而这种技术对节省空间产生了重 要作用( 大约节省了8 的堆的大小【1o 】) 。第一个对象头的字包含了身份标识h a s h 码和 g c 状态等信息,第二个对象头的字是一个对对象的类的引用,只有数组才有第三个对 象头字段,它是用来表示数组大小的。 j a v a 对象的 j a v a 数组分布 j a v a 对象分布k l a s s o o p d e s c u n i v e r s e :i n s t a n c e k l a s s k l a s s o b j 0 图2 - 4j a v a 对象模型 f i g 2 - 4 m a k e f i l eo fj d k 6 p r o j e c t h o t s p o t 中所有j a v a 对象都有c + + 类o o p d e s c 以其子类来描述,如c l a s s 类用 k l a s s o o p d e s c 描述、m e t h o d 用m e t h o d o o p d e s c 描述、普通j a v a 对象用i n s t a n c d o o p d e s c 表示等。每个o o p d e s c 类型都定义了相应的指针类型,即去掉后面的d e s c ,如 m e t h o d o o p d e s c 对应的指针类型是m e t h o d o o p 。 高级程序语言,如在c + + 中,对象所占的内存在程序结束运行之前一直被占用,在 明确释放之前不能分配给其它对象。而在j a v a 中,当没有对象引用指向原先分配给某个 对象的内存时,该内存便成为垃圾。为解决垃圾内存回收的问题,j a v a 虚拟机提供了垃 圾收集( g a r b a g ec o l l e c t i o n ,g c ) 机制,用以跟踪正在使用的对象和发现并回收不再使 用或引用的对象。 1 0 中国石油大学( 华东) 硕士学位论文 在j a v a 程序中,内存由程序动态地分配,通过n e w 操作完成,所有的对象都在堆 ( h e a p ) 中分配空间,对象的回收是由垃圾收集器决定和执行的。垃圾收集器的任务在 于识别以前分配出去而现在不被任何指针引用的内存块,使这些内存块可以被系统回收 并重新分配给用户循环使用。当对象被重新定位时,垃圾收集器也会寻找并更新所有对 在适当位置上的对象的引用。j a v a 虚拟机提供了垃圾收集器负责将不再引用的对象回 收,以释放内存空间。除了释放没用的内存对象,垃圾收集器也可以清除内存记录碎片。 由于创建对象和垃圾收集器释放丢弃对象所占的内存空间,内存会出现碎片。碎片是分 配给对象的内存块之间的空闲内存洞。碎片整理将所占用的堆内存移动到堆的一端, j v m 将整理出的内存分配给新的对象。 2 3 2 h o t s p o t 虚拟机j i t 编译器 j d k 6h o t s p o t 虚拟机性能的提升归功于儿t 编译器改进,引进了一种新的寄存器分 配算法,线形扫描寄存器分配算法【1 。 线形扫描寄存器分配算法中,操作数的生存周期和位置是寄存器分配的依据。首先 线形的排列一个方法中的所有指令,这这次排列中忽略条件转移和循环,然后计算每一 个虚拟寄存器的生存周期,生存周期指的是变量第一次定义到最后一次使用这段时期; 然后分析程序的条件转移很循环等,最后根据虚拟寄存器的生存周期等信息来分配物理 寄存器。算法的时间复杂度为o ( n ) ,n 是虚拟寄存器的个数。与图染色寄存器分配算 法o ( 1 1 2 ) 的复杂度相比,线形扫描寄存器分配算法的开销要小很多。同时,与按需分 配的算法相比,线形扫描寄存器分配算法在整个方法内分配,能够使寄存器得到充分的 利用,能够用多余的寄存器来缓冲局部变量,生成代码的质量将更加优秀,执行效率更 高【8 】o 2 3 3j d k 6 工程源代码树体系结构 m a k e f i l e 文件定义了整个工程的编译规则。在j d k 6 工程中大量的源文件中,其按 类型、功能、模块分别放在若干个目录中,m a k e f i l e 定义了一系列的规则来指定,哪些 文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的 功能操作。m a k e f i l e 具有“自动化编译”的功能,一旦写好,只需要一个m a k e 命令, 整个工程完全自动编译,极大的提高了软件开发的效率。从另外一个方面,分析工程的 m a k e f i l e 文件能直观的了解一个工程功能模块,因此,对j d k 6 工程的研究首先从分析 其m a k e f i l e 文件开始。j d k 6 工程的m a k e f i l e 的结构如图2 5 所示。 第二章“龙芯”平台j a v a 运行环境研究 图2 - 5j d k 6 工程的m a k e f i l e 结构图 f i g 2 - 5 m a k e f i l eo fj d k 6p r o j e c t j d k 6 编译的工作目录在c o n t r o l m a k e 下: m a k e f i l e 是整个工程编译的主文件; 宰砒文件是各个模块编译的规则文件; j p r t 木是不同平台检测,配置相关的文件; c o m m o n 目录是通用的编译配置文件和不同操作系统下编译的配置文件。 在移植过程中,需要关心的h o t s p o t 虚拟机模块的h o t s p o t r u l e s g i i l l 【规则文件以及 定义整个工程编译规则的c o n s o l e r u l e s g m k 文件。 在h o t s p o t r u l e s 割 1 l ( 中定义了一些里关系到h o t s p o t 虚拟机各种编译规则的 h o t s p o t - b u i l d 、h o t s p o t b r i n g o v e r 和h o t s p o t c l o b b e r 等伪命令,这些伪命令可被上层的 m a k e f i l e 文件调用,实现整个j d k 的编译规则,也可以单独使用,对h o t s p o t 的某一模 块进行编译。 s u nj d k 6 的源代码中,h o t s p o t 目录下有4 个子目录,s h a r e 目录具有平台无关性, 是整个j a v a 虚拟机的核心部分。平台相关部分分别放在c p u 、o s _ c p u 、o s3 个目录中。 c p u 目录是体系结构部分代码,o s _ c p u 是体系结构和操作系统的接口,o s 目录是操作系 统接口部分,这3 个目录分别代表了j a v a 虚拟机的3 个层次,从最低层的c p u ,然后通 过和操作系统的接口层到达操作系统,再通过操作系统和应用程序的接口到达应用程 序。 h o t s p o t 的目录分为四个子目录,s h a r e 目录是j a v a 虚拟机实现平台无关的部分,o s l , 中国石油大学( 华东) 硕士学位论文 目录是操作系统相关的部分,o s _ c p u 是实现中操作系统与体系结构的一个接1 2 1 ,c p u 目 录是j a v a 虚拟机实现中平台相关的部分,这四个目录从上层到底层,层次关系比较清晰。 主要目录的功能如下: a d l c :根据平台描述文件生成平台相关的* h p p ,* c p p 文件,这个目录主要用来 支持服务器版j a v a 虚拟机的编译; a s m :汇编器的实现,平台相关部分放到了c p u 目录中,这个目录主要用来支 持解释器,j i t 编译器等生成机器代码; c 1 :j i t 客户版编译器的实现,平台相关的部分放到了c p u 目录中; c i :j i t 编译器接口的实现,用来支持客户版和服务器版的j i t 编译器; c o d e :支持运行时生成代码的存储,重定位等: c o m p i l e r :目录主要是实现一个编译的线程,管理编译队列等: g c _ i m p l e m e n t a t i o n :这个目录主要是两种垃圾回收器的实现; g ci n t e r f a c e :这个目录主要是垃圾回收器的接口实现; i n t e r p r e t e r :解释器的实现,平台相关的部分在c p u 目录中; l i b a d t :定义了几个抽象类,用来支持服务器版j i t 编译器: m e m o r y :实现内存管理的功能; o o p s :定义了j a v a 虚拟机中使用的j a v a 对象; o p t o

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论