(计算机应用技术专业论文)java虚拟机关键机制研究与实践.pdf_第1页
(计算机应用技术专业论文)java虚拟机关键机制研究与实践.pdf_第2页
(计算机应用技术专业论文)java虚拟机关键机制研究与实践.pdf_第3页
(计算机应用技术专业论文)java虚拟机关键机制研究与实践.pdf_第4页
(计算机应用技术专业论文)java虚拟机关键机制研究与实践.pdf_第5页
已阅读5页,还剩61页未读 继续免费阅读

(计算机应用技术专业论文)java虚拟机关键机制研究与实践.pdf.pdf 免费下载

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

文档简介

摘要 j a v a 体系结构包括四个相互关联的技术:j a v a 语言、j a v aa p i 、 c l a s s 文件和j a v a 虚拟机,其中j a v a 虚拟机是整个体系的核心部分, 它使j a v a 程序在不同的计算机系统之间具备高度的可移植性。 本文研究虚拟机的类装载器、执行引擎和垃圾收集三方面的机 制,所做的工作如下:对类装载器相关方面的阐述,包括c l a s s 文件 格式、常量池解析、双亲委派模型和类的动态装载技术,并对常量池 的u t f 8i n f o 表进行了改进,传统的类名存储方式是把所有类的全限 定名分别存储于u t f 8m f o 表中,此方式产生了许多冗余的信息,改 进的方法把类的全限定名分离为不同的结点,减少整个类的字符串在 常量池中所占据的大小,这使得在内存有限的系统中装载c l a s s 文件 后能减少对存储空间的占用。 对于j a v a 虚拟机的执行引擎,讨论了以堆栈为工作区的机制, 介绍了虚拟机的指令系统的功能,探讨了相关的执行技术,最后根据 j a v a 虚拟机规范,设计与实现了部分有代表性的虚拟机指令的功能。 在虚拟机的存储管理方面,对比了传统存储管理与j a v a 体系中 存储管理的异同,讨论了现有的垃圾收集算法,提出了对火车算法失 效情况下的处理方案,最后按照j a v a 虚拟机中分代的思想在一种嵌 入式虚拟机k v m 上设计了一个分代回收方案,该方案简单地把j a v a 内存堆分为新生代和旧生代,实验结果表明,分代后的垃圾收集相比 于默认的垃圾收集效果有了部分的提升。 关键词j a v a 虚拟机,类装载器,执行引擎,垃圾收集,分代 a b s t r a c t j a v aa r c h i t e c t u r ei n c l u d e sf o u ri n t e r r e l a t e dt e c h n o l o g i e s ,i n c l u d i n g j a v al a n g u a g e ,j a v aa p i ,c l a s sf i l ea n dj a v av i r t u a lm a c h i n e j a v av i r t u a l m a c h i n ei st h ec o r eo ft h eja v aa r c h i t e c t u r ea n di tm a k e sj a v ap r o g r a m s t r a n s p l a n t e db e t w e e n d i f f e r e n tc o m p u t e rs y s t e m sw i t hh i 曲p o r t a b i l i t y i nt h i st h e s i sc l a s sl o a d e r , e x e c u t ee n g i n ea n dg a r b a g ec o l l e c t i o n m e c h a n i s m sa r es t u d i e d t h ea s p e c t sa r ea sf o l l o w s c l a s sl o a d e ra n a l y s i s i n c l u d e sc l a s sf i l ef o r m a t ,c o n s t a n tp o o lr e s o l u t i o n ,d y n a m i cl o a d i n ga n d t h em o d e lo fp a r e n t sa s s i g n m e n t t h et r a d i t i o n a lm e t h o do fc l a s sn a m e s t o r a g ei n c l u d e sa l lc l a s sn a m ep a t h ,w h i c hc o n t a i n sa l o to fr e d u n d a n t i n f o r m a t i o n t h ep r o p o s e dm e t h o di m p r o v e st h et a b l eo f u t f 8 一i n f o ,p u t s t h ef u l l yq u a l i f i e dn a m eo fc l a s si nu t f 8 一i n f ot a b l ew i t hd i f f e r e n tn o d e s t h i sr e d u c e st h es p a c eo fc o n s t a n tp o o l ,t h e r e b yr e d u c i n gt h ec l a s sf i l e s i z e ,e s p e c i a l l ys a v e ss p a c ei nl i m i t e dm e m o r ys y s t e m r e g a r d i n g t h ee x e c u t ee n g i n e ,t h ew o r ka r e ao fs t a c k ,i n s t r u c t i o ns e t , a n dt h ef u n c t i o n so ft h ee x e c u t et e c h n o l o g ya r ed i s c u s s e d f i n a l l ys o m e i n s t r u c t i o n sa r ed e s i g n e da n di m p l e m e n t e da c c o r d i n gt os t a n d a r dj a v a v i r t u a lm a c h i n es p e c i f i c a t i o n i n s t o r a g em a n a g e m e n t ,j a v av i r t u a l m a c h i n ea r ec o m p a r e dt o t r a d i t i o n a l s y s t e m g a r b a g ec o l l e c t i o na l g o r i t h m s a r ei n t r o d u c e da n d r e s o l u t i o no ft h ef a i l u r eo ft h et r a i na l g o r i t h ma r ep r o p o s e d f i n a l l ya s c h e m eo fg c n e r a :t i o n 出c o l l e c t i o ni nk v mi sd e s i r e d ,w h i c h q i m r n 1 ,v d i v i d e dt h em e m o r yh e a pi n t oy o u n gg e n e r a t i o na n do l dg e n e r a t i o n t h e e x p e r i m e n tr e s u l ts h o w sal i t t l eu p g r a d eo fp e r f o r m a n c ec o m p a r e dt ot h e d e f a u l tg a r b a g ec o l l e c t i o nm e t h o di nk v m k e yw o r d sj a v av i r t u a lm a c h i n e ,c l a s s l o a d e r ,e x e c u t ee n g i n e , g a r b a g ec o l l e t i o n ,g e n e r a t i o n n 原创性声明 本人声明,所呈交的学位论文是本人在导师指导下进行的研究工 作及取得的研究成果。尽我所知,除了论文中特别加以标注和致谢的 地方外,论文中不包含其它人已经发表或撰写过的研究成果,也不包 含为获得中南大学或其它单位的学位或证书而使用过的材料。与我共 同工作的同志对本研究所作的贡献均已在论文中作了明确的说明。 作者签名:至e 叠盔日期:j 竺l 年月l 日 学位论文版权使用授权书 本人了解中南大学有关保留、使用学位论文的规定,即:学校有 权保留学位论文并根据国家或湖南省有关部门规定送交学位论文,允 许学位论文被查阅和借阅;学校可以公布学位论文的全部或部分内容, 可以采用复印、缩印或其它手段保存学位论文。同时授权中国科学技 术信息研究所将本学位论文收录到中国学位论文全文数据库,并通 过网络向社会公众提供信息服务。 作者签名:望雌 导师签名日期:丑年月上e t 硕士学位论文 第一章绪论 1 1 研究背景 第一章绪论 多数软件产品在开发初期,由于受到各种限制,设计者并没有从架构与实现 上考虑程序的可移植性,从而导致对平台的依赖性较强,用户界面和事务逻辑的 分离不够完善,因此在技术上给移植带来了极大的困难。尤其是桌面应用程序, 系统模型和函数接口本身差异很大,平台依赖更加紧密【1 1 。 另外,由于历史的原因,企业或部门内必然存在多种互不兼容的计算平台, 许多迟钝、老化的遗留系统必须继续加以应用。计算平台的差异性,增加了i t 管理的复杂性,从而导致内部管理成本的提高,减弱企业的竞争力。最为糟糕的 情况莫过于在某个非常陈旧的系统上运行的业务逻辑出现了问题,尤其是在那些 运行关键核心业务的系统上。此外,对遗留系统代码的移植也会成为一个问题。 使用虚拟机可以在一定程度上避免这种事情的发生【2 1 。虚拟机运行于操作系统之 上,为每个操作系统开发一个版本,它向上提供一组标准的应用程序编程接口 ( a p p l i c a t i o np r o g r a m m i n gi n t e r f a c e ,a p i ) ,实现了自定义的a p i 到操作系统的 a p i 之间的连接、转换。虚拟机屏蔽了底层系统的差异性,实现了程序在操作系 统间的复用,同时增加了一个系统运行级别,提升了系统的安全性能。j a v a 就是 一个这样的先进企业计算平台,j a v a 虚拟机( j a v av i r t u a lm a c h i n e ,j v m ) 有自己完 善的硬件架构,如处理器、堆栈等,还具有相应的指令系统。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 3 l 。 因此,j a v a 虚拟机作为一种先进的技术,提供了开发者更多的自主和选择, 为大型软件的开发提供了一个功能强大、扩展性良好的平台。研究j a v a 虚拟机 技术,可以使软件更高效的在虚拟机上运行,而不用过多考虑程序的移植性,从 而使得软件的可重用性大大提高。由于国外各大公司并没有对旗下的j a v a 虚拟 机产品公开技术的细节,所以通过j a v a 虚拟机的研究,还能够快速掌握先进的 计算机技术,获得大量有益的经验,继而将这些技术应用于国产软件的研发和设 计上来,打破国外公司在技术上的垄断。 硕七学位论文第一章绪论 1 2 国内外研究现状 在2 0 世纪6 0 年代i b m 公司的v m 3 7 0 操作系统上最早应用了虚拟机的设 计思想,此后,很多公司也陆续开始研究虚拟机技术,如i n t e l 、m i c r o s o f t 、s u n 等公司。通过使用虚拟机,程序的移植变得更方便,只需移植虚拟机和相关的支 持程序库到新的系统,所有上层的应用程序都不需要更动。同时由于虚拟机的隔 离作用,也使得基于虚拟机的应用程序变得更安全1 4 1 。j a v a 源程序编译后产生二 进制代码,它的指令集与具体机器指令集无关,通过j a v a 虚拟机解释后,j a v a 程序可以在不同的平台上运行。j a v a 虚拟机规范所定义的抽象计算机,和实际的 计算机一样,具有一个指令集,但是它却往往比实际的硬件机器简单。虽然虚拟 机技术在j a v a 之前已经出现一段时间了,但是没有进入主流,而且使用虚拟机 机制来实现编程语言并不是j a v a 的创举,此方法在此之前已经出现,如 u c s c p a s c a l 的p c o d e 机等,由于j a v a 语言的广泛流行,使得s u n 公司j a v a 虚 拟机相比其他语言解释器要出名得多。s u n 公司是j a v a 语言的创始者,它制定了 业界的统一标准,即j a v a 虚拟机规范【5 j 。 在嵌入式系统上运用j a v a 虚拟机使得嵌入式程序的编写和移植更加简单易 行,其中著名的嵌入式虚拟机有s u n 公司的k i l o b y t e sv i r t u a lm a c h i n ,即k v m , 最早的k v m 的是在p a l m 操作系统上实现的。为了达到让应用程序本身能够跨 平台,已经有许多公司极地将k v m 放置到本身的产品之中,例如i b m 的 v i s u a l a g e ,k a d a s y s t e m s 的k a d a v m ,i n s i g n i a s o l u t i o n s 的j e o d e v m 掣6 。目前各 虚拟机厂商对嵌入式j a v a 虚拟机的研究和应用作了很多工作,但是还是不能够 达到一个令人满意的程度,所以很多大公司都在不停地研究提升自己产品的性 能。 在j a v a 虚拟机类装载器的常量池中,目前的做法是把类的全限定名完整路 径全部存储于u t f 8i n f o 表中,这样的做法简单易行,但是,当虚拟机转载的类 数目庞大时,会产生很多的冗余空间,此方法在在系统有限的嵌入式环境上会浪 费较多的存储空间。本文将对此问题提出一种新的类名存储方案,来减少类的全 限名对存储空间的占用。 对于j a v a 虚拟机指令的执行技术,最早采取的是解释执行的方法,此方法 每次对一条指令解释后,再在宿主机上执行,这种执行方式简单,但是执行的速 度较慢,随后又产生了即时编译的技术,即把所有的虚拟机指令全部编译为本地 代码后再执行,即时编译的执行技术在执行指令时速度很快,但需要额外的空间 来存储编译后的机器码。自适应优化技术根据指令的执行频度,把常用的指令编 译为本地码,这种执行方式不但加快了指令的执行速度,而且降低了编译后指令 2 硕士学位论文 第一章绪论 所需的存储空间,是目前最常用的指令执行技术。 自动垃圾收集是j a v a 虚拟机的一个显著特点,现在除了经典的垃圾收集技 术,还有各种各样的高级垃圾收集技术,如分代式回收等,这些垃圾收集方采用 的算法不尽相同,而各种垃圾收集算法都或多或少的存在着一些缺陷,比如火车 算法,它作用于分代收集的成熟对象空间,其目的是为了在成熟对象空间提供限 定时间的渐进收集,目前正用于s u n 公司的h o t s p o t 虚拟机,但火车算法会在某 种情况下失效:如果在收集当前火车的其它车厢引用到当前车厢的对象,并且此 对象在本列火车的转移而导致对同- n 火车的回收不断循环,使得不能完成后面 车厢的回收,本文会对其进行改进。在k v m 的垃圾回收方面为了使程序简单高 效,默认采取的是标记清楚算法,此算法虽简单易行,却失去了分代算法的优势, 本文将尝试在l m 上设计一个分代算法。 在国外,各大i t 公司对j a v a 虚拟机的研究较为成熟,如s u n 、i b m 等公司 都研发出了自己旗下的j a v a 虚拟机产品。目前,我国对j a v a 虚拟机这的研究并 不是很多,还没有自主产权的j a v a 虚拟机,全国只有少数大学在研发自己的嵌 入式j a v a 虚拟机,国内的虚拟机和国外的同类产品还存在很大的差距。在g n u 7 j 等组织的推动下,现在已经有许多很好的开源j a v a 虚拟机,同时也吸引了大批 的爱好者投入到j a v a 虚拟机的研究中。 1 3j a v a 虚拟机体系结构简介 j a v a 包括四个相互关联的技术:j a v a 语言、j a v aa p i 、c l a s s 文件和j a v a 虚 拟机,其中j a v a 技术的核心是j a v a 虚拟机,所有的j a v a 程序都在其上运行。j a v a 虚拟机是一个想象中的机器,在实际的计算机上可以用不同的方式( 软件或硬件) 加以实现【8 】。j a v a 虚拟机屏蔽了与具体操作系统平台相关的信息,使得j a v a 语言 编译程序只需生成在j a v a 虚拟机上运行的目标代码( 字节码) ,就可以在多种平 台上不加修改地运行。j a v a 虚拟机有自己想象中的硬件,如处理器、堆栈、p c 寄存器等,还具有相应的指令系统。s u n 公司定义了j a v a 虚拟机规范,只要根据 j a v a 虚拟机规格描述,将解释器移植到特定的计算机上,就能保证经过编译后的 j a v a 代码能够在该系统上运行。图1 1 是j a v a 虚拟机的体系结构图。 类装载器子系统负责把c l a s s 文件载入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 。 硕士学位论文第一章绪论 j a v a 虚拟机的每个实例都有一个它自己的方法区和一个堆,运行于j a v a 虚 拟机内的所有的线程都共享这些区域。当虚拟机装载类文件的时候,它解析其中 的二进制数据所包含的类信息,并把它们放到方法区中。当程序运行的时候,j a v a 虚拟机把程序初始化的所有对象置于堆上,而每个线程创建的时候,都会拥有自 己的程序计数器p c 和j a v a 栈,其中程序计数器中的值指向下一条即将被执行的 指令,线程的j a v a 栈则存储为该线程调用j a v a 方法的状态:本地方法调用的状 态被存储在本地方法栈,该方法栈依赖于具体的实现。 c l a s s 文件 圈田曰圈圈 图1 1j a v a 虚拟机体系结构 类装载器、运行时数据区、执行引擎、本地方法接口等模块一起组成了虚拟 机的内部体系结构,这些定义严格地规定了虚拟机所要实现的外部特征以及模块 之间的交互,对于运行时的具体细节,大多由实现的设计者来决定。 1 3 1 类装载器 j a v a 虚拟机的类装载就是指将包含在类文件中的字节码载入j a v a 虚拟机中, 并使其成为j a v a 虚拟机的一部分【9 1 。类装载器把一个类装入j a v a 虚拟机中,要 经过三个步骤来完成t 装载、连接和初始化,其中链接又可以分成校验、准备和 解析三步,除了解析外,其它步骤是严格按照顺序完成的,各个步骤的主要工作 如下【l o l : 装载 查找和导入类或接口的二进制数据; 连接 执行校验、准备和解析步骤。其中校验指检查导入类或接口的二进制数据的 正确性;准备阶段负责给类的静态变量分配并初始化存储空间;解析的作用是将 4 硕士学位论文第一章绪论 符号引用转成直接引用。 初始化 初始化类的静态变量和静态j a v a 代码块。 j a v a 虚拟机中类的装载是由c l a s s l o a d e r 和它的子类来实现的,j a v a c l a s s l o a d e r 这个类负责在运行时查找和载入类文件。 1 3 2 运行时数据区 当j a v a 虚拟机运行一个程序时,它需要内存来存储各类信息,例如字节码、 从已装载的c l a s s 文件中得到的信息、程序创建的对象、传递给方法的参数、返 回值、局部变量、以及运算的中间结果等【l i j 。j a v a 虚拟机把这些数据都组织到 “运行时数据区 中,以便于管理。运行时数据区包括方法区、堆、j a v a 栈、p c 寄存器和本地方法栈。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 和j a v a 栈,其中程序计 数器中的值指向下一条即将被执行的指令,线程的j a v a 栈则存储为该线程调用 j a v a 方法的状态。本地方法调用的状态被存储在本地方法栈,该方法栈依赖于具 体的实现。p c 寄存器和j a v a 栈域是私有的,任何线程都不能访问另一个线程的 p c 寄存器和j a v a 栈i l 2 。 1 3 3 执行引擎 执行引擎是j a v a 虚拟机实现的核心,j a v a 虚拟机中的执行引擎就好比中央 处理器,使得j a v a 虚拟机重复不断地读取字节码并执行,直到虚拟机进程退出。 j a v a 虚拟机规范中规定:执行引擎的行为由指令集来规定。对于每条指令,规范 都详细规定了执行该指令时应该“做什么 ,但是没有说明“如何做 ,因此j a v a 虚拟机的实现者可以采取解释执行技术、即时编译( j u s ti nt i m e ,j i t ) 技术或 者直接在专用芯片上执行指令的技术,甚至可以是它们的混合技术。由于指令系 硕士学位论文 第一章绪论 统的简单性,使得虚拟机执行指令的过程十分简单,从而有利于提高指令的执行 效率13 1 。 1 3 4 本地方法接口 本地方法是把j a v a 程序与非j a v a 语言程序和平台相关功能结合的有效方式, 在考虑较少安全性和可移植性的情况下,j a v a 本地方法对于大量已有非j a v a 软 件的利用,以及直接操纵硬件的程序将发挥很好的作用【l4 1 。 本地方法接口( j a v a n a t i v ei n t e r f a c e ,j n i ) 是用于实现与本地方法交互的机 制,它可以使得开发者在一特定的主机平台上,把与j n i 兼容的本地方法以二进 制形式连接到任何支持j n i 的虚拟机实现上。j n i 最重要的好处是它没有对底层 j a v a 虚拟机的实现施加任何限制。因此,j a v a 虚拟机厂商可以在不影响虚拟机 其它部分的情况下添加对j n i 的支持。程序员只需编写一种版本的本地应用程 序或库,就能够与所有支持j n i 的j a v a 虚拟机协同工作。然而,对于本地方 法接口,实现j a v a 虚拟机并不要求一定要有它的支持,甚至可以完全没有。s u n 公司实现j n i 是出于可移植性的考虑,当然也可以设计出其它的本地接口来代替 s u n 公司的j n i t ”j 。 1 4 论文主要工作和结构安排 本文的主旨是对j a v a 虚拟机的类装载器、执行引擎和垃圾回收机制三个方 面的内容进行研究,主要工作为:对常量池的u t f 8 一i n f o 表进行改进,实现虚拟 机有代表性的指令的功能,在一种嵌入式虚拟机k v m 上设计一种分代算法。论 文内容的组织结构如下: 第一章绪论:论述课题的研究背景和国内外研究现状,分析j a v a 虚拟机体 的基本体系结构,并在此基础上简要分析各组成部件的功能。 第二章类装载器分析:首先阐述j a v a 虚拟机的类装载器子系统,然后分析 类装载器的体系结构,最后对常量池中的u t f 8 一i n f o 表提出改进方案。 第三章指令系统与执行引擎:阐述j a v a 虚拟机的指令系统,分析执行引擎 是如何获取并执行指令的,并在此基础上实现常用指令的算法。 第四章垃圾收集算法分析:首先介绍经典的垃圾收集算法,对火车算法进 行研究并针对其存在的问题提出改进策略,最后在一种嵌入式虚拟机k v m 上设 计一个分代回收算法。 第五章总结与展望:总结论文工作的成果及需要进一步研究的内容。 6 硕士学位论文第二章类装载器内部实现原理分析 第二章类装载器内部实现原理分析 类装载器是j a v a 虚拟机中重要的组成部分,它根据用户或者上一级程序所 提供的类或接口的名字,寻找相应的c l a s s 文件,然后在方法区中生成一种能够 存储c l a s s 文件中所有信息的数据结构,最后将这些信息导人该数据结构中,并 使其成为j a v a 虚拟机的一部分。 2 1j a v ac l a s s 文件 j a v ac l a s s 文件是对j a v a 程序二进制文件格式的精确定义。每一个j a v ac l a s s 文件都对一个j a v a 类或接口做出了全面的描述。对j a v ac l a s s 文件的精确定义使 得所有j a v a 虚拟机都能够正确地读取和解析c l a s s 文件。表2 1 按照在c l a s s 文件 中出现的顺序列出了主要表项1 1 。 表2 1c l a s s f i l e 表的格式 7 硕士学位论文第二章类装载器内部实现原理分析 j a v ac l a s s 文件是8 位字节的二进制流。数据项按顺序存储在c l a s s 文件中, 相邻的项之间没有任何间隔,从而可以使c l a s s 文件紧凑,其中占据多个字节空 间的项按照高位在前的顺序分为几个连续的字节存放【1 5 】。 和j a v a 的类可以包含多个不同的字段、方法、方法参数、局部变量等一样, j a v a c l a s s 文件也能够包含许多大小不同的项。在c l a s s 文件中,各项的大小和长 度位于其实际数据之前,这个特性使得c l a s s 文件流可以从头到尾被顺序解析, 首先读出项的大小,然后读出项的数据【l6 1 。 在c l a s s 文件表中,u 2 表示占两个字节的无符号整型,“表示占四个字节的 无符号整型。m a g i c 即魔数:o x c a f e b a b e ,作用在于分辨j a v ac l a s s 文件和非 j a v ac l a s s 文件,如果一个文件不是以魔数开头则肯定不是j a v ac l a s s 文件。 m a j o rv e r s i o n 和m i n o rv e r s i o n 是c l a s s 文件的主次版本号。 c o n s t a n tp o o l 表示常量池,常量池包含了与文件中的类和接口相关的常量。 常量池中存储了诸如文字字符串、f i n a l 变量值、类名和方法名的字符串常量。j a v a 虚拟机把常量池组织为入口列表的形式。尽管c o n s t a n tp o o l 列表中没有索引值 为0 的入1 2 1 ,但缺失的这一入1 2 1 也被c o n s t a n tp o o lc o u n t 计数在内。每个常量池 入口都从一个长度为一个字节的标志开始,这个标志指出了列表中该位置常量的 类型。表2 2 列出了所有常量池标志的名字和值【i 】。 表2 2 常量池标志 硕士学位论文第二章类装载器内部实现原理分析 常量池表中的每一个标志都有一个相对应的表。表名通过在标志名后加上 “i n f o ”来产生。例如对应于入口类型c o n s t a n tc l a s s 的标志为7 ,它的表 名是c o n s t a n tc l a s si n f o 。在动态连接的j a v a 程序中,常量池充当了十分重 要的角色,在运行时,j a v a 虚拟机使用常量池的全限定名、方法和字段的描述符, 把当前类或接口中的代码与其它类或接口中的代码连接起来。 c l a s s 文件表中的a c c e s sf l a g s 表示类或接口的信息,如是类还是接口、修饰 符信息等。t h i sc l a s s 是对一个常量池的索引,在t h i sc l a s s 位置的常量池入口必 须为c o n s t a n tc l a s si n f o 表。如图2 1 : 常量池入口2 常量池入口7 t h i sc l a s s 项 图2 1t h i s c l a s s 对常量池的引用 在图2 1 中,虚拟机首先通过索引2 进入c o n s t a n tc l a s si n f o 常量池2 号入 口,再根据当中的n a m ei n d e x 进入c o n s t a n tu t t 8i n f o 常量池入口7 ,从而 得到类名。 s u p e rc l a s s 也是对一个常量池的索引,在s u p e rc l a s s 位置的常量池入e l 是一 个指向该类型超类的全限定名的c o n s 吖悄tc l a s si n f o 入口。i n t e r f a c e sc o u n t 和i m e r f a c e s 这两项的含义分别为:该类的父接口的数量和i n t e r f a c e s 数组。 f i e l d sc o u n t 是类变量和实例变量的字段数量总和。f i e l d s 是不同长度的 f i e l d si n f o 表的序列。在f i e l d s 列表中,不列出从超类或者父接口继承而来的字 段。每一个f i e l di n f o 表都展示了一个字段的信息,此表包含了字段的名字、描 述符和修饰符。m e t h o d sc o u n t 是所声明的方法的总计数,这个计数值包括在该 类或着接口中显示定义的方法。m e t h o d s 是m e t h o di n f o 表的序列,它包含了与 方法有关的信息,如方法名和描述符( 方法的返回值类型和参数类型) 。 a t t r i b u t e sc o u n t 是所定义的属性的总和。a t t r i b u t e s 是a t t r i b u t ei n f o 表的序列,每 个a t t r i b u t ei n f o 的第一项是指向常量池中c o n s t a n tu t t 8i n f o 表的索引,该 9 硕士学位论文 第二章类装载器内部实现原理分析 表给出了属性的名称。 2 2 双亲委派模型 j a v a 虚拟机在运行时会产生如下几个类装载器:b o o t s t r a pc l a s s l o a d e r 、 e x t e n s i o nc l a s s l o a d e r 和a p pc l a s s l o a d e r 。其中b o o t s t r a pc l a s s l o a d e r 为启动类 加载器,主要负责i d k 目录下的 等核心类库的装入工作;h o m e l i ba j a r e x t e n s i o n c l a s s l o a d e r 为扩展类加载器,主要负责j d kh o m e l i b e x t 目录下的j a r 包装入工 作;a p p c l a s s l o a d e r 为系统类加载器,主要负责j a v a c l a s s p a t h d j a v a c l a s s p a t h 所指定目录下的类与j a r 包的装载。 j a v a 虚拟机提供了抽象类c l a s s l o a d e r ,所有用户自定义类装载器都实例化 自c l a s s l o a d e r 的子类。 a p pc l a s s l o a d e r 是一个特殊的用户自定义类装载器, 由j a v a 虚拟机的实现者提供,在编程者不特别指定装载器的情况下默认装载用 户类。系统类装载器可以通过c l a s s l o a d e r g e t s y s t e m c l a s s l o a d e r 0 方法得到。j a v a 采用了“双亲委派”的加载模式,如图2 2 所示, 图2 2 双亲委派模型 从图2 2 可以看出,在双亲委派模式下,当一个装载器被请求装载某个类时,它 首先委托自己的父装载器去装载,若父装载器能装载,则返回这个类所对应的 c l a s s 对象,若不能装载,则由父装载器的父装载器去装载。具体来说就是,首 先自底向上,逐个检查是否已经加载了要装载的类,如果已经载入,则直接返回 该类实例的引用;如果直到b o o t s t r a pc l a s s l o a d e r 也未加载成功指定的类,则抛 出异常,然后自顶向下逐个尝试加载,直到c u s t o m c l a s s l o a d e r ,若还未能加载, 1 0 硕士学位论文第二章类装载器内部实现原理分析 就抛出c l a s s n o t f o u n d e x c e p t i o n 给调用者。这种双亲委派模式使得用户自定义的 类装载器不可能装载应该由父亲装载器装载的可靠类,从而防止不可靠甚至恶意 代码带来的安全隐患。 2 3 动态加载机制 j a v a 的加载方式分为隐式加载和显示加载,所谓隐式加载就是在程序中用 n e w 关键字来定义一个实例变量,在虚拟机执行到n e w 关键字的时候就会把对应 的实例类加载进入内存【1 7 】。所谓显式加载就是由程序员调用自定义的类装载器 把需要的类加载到内存当中,其方式又分为两种,一种是由类i a v a 1 a n g c l a s s 的 方法f o r n a m e o 提供,另一种由类j a v a 1 a n g c l a s s l o a d e r 的方法l o a d c l a s s o 提供。 显示加载方法大大提高了程序的灵活性1 1 引。用户自定义类加载器 ( j a v a 1 a n g c l a s s l o a d e r 的子类) 在程序运行期间,通过j a v a 1 a n g c l a s s l o a d e r 的子 类动态加载c l a s s 文件,体现了j a v a 动态实时类装入特性【1 9 】。 在j a v a 中,c l a s s l o a d e r 是一个抽象类,位于j a v a 1 a n g 包中,它有如下几个 重要方法【2 啦! 】: l o a d c a s s 方法 l o a d c l a s s ( s t r i n gn a m e ,b o o l e a nr e s o l v e ) 使用委托机制来加载类。首先它执行 f i n d l o a d e d c l a s s 方法,在本类加载器中检查要加载的类是否已经加载,如果加载 了就直接返回以前加载过的这个类对象。如果这个类没有被本类加载器加载过, 则委托父类加载器去加载。 d e f i n e c l a s s 方法 这个方法接收类文件的字节数组,然后把它转换成c l a s s 对象,并校验被加 载的类的有效性。 f i n d s y s t e m c l a s s 方法 f i n d s y s t e m c l a s s 方法从本地文件系统装入文件。它在本地文件系统中找到类 文件,并使用d e f i n e c l a s s 将字节数组转换成c l a s s 对象。当运行j a v a 应用程序 时,虚拟机默认调用此方法加载类。 r e s o l v e c l a s s 方法 r e s o l v e c l a s s ( c l a s sc ) 方法解析装入的类,即把符号引用解析为直接引用。 6 n d l o a d e d c l a s s 方法 这个方法查看待装载的类是否已经被载入方法区中,如果已装入,那么返回 存在的c l a s s 对象,否则返回n u l l 。 f i n d c l a s s 方法 硕士学位论文第二章类装载器内部实现原理分析 此方法首先试图查找或者生成一个字节数组,内容是j a v ac l a s s 文件格式, 如果无法确定此数组,它产生一个异常并中止装载,否则调用d e f i n e c l a s s 把类 装入虚拟机中。 当加载一个类时,类加载器通过l o a d c l a s s o 的参数发出加载某个类文件的请 求,然后l o a d c l a s s o 既可以调用d e f i n e c l a s s o 完成类加载并定义一个c l a s s 对象, 也可以调用其它加载器的l o a d c l a l s s ( ) 委托加载类文件1 2 2 j 。因此在加载类文件时可 以通过继承c l a s s l o a d e r 并且覆盖l o a d c l a s s 或者f i n d c l a s s 方法,来产生自定义 的类装载器。另外,j a v a 1 a n g c l a s s 类中的f o r n a m e 方法也能装载类型( 类或接 口) ,f o r n a m e 方法和l o a d c l a s s 方法的不同点在于:l o a d c l a s s 方法试图保证被装 载的类型是被装载到用户自定义的类装载器的命名空间里,而f o r n a m e 方法试图 确认所需的类型被装载到当前命名空间中,这个当前命名空间就是类型所属的定 义类装载器的命名空间1 2 引。 2 4 对常量池的改进方案 2 4 1 问题的提出 常量池是一个可变长度c p _ i n f o 表的有序序列,这些c p _ i n f o 表的通常形式 如下所示: 一 c p _ i n f o u lt a g ; u li n f o j c p _ i n f o 表中的t a g 项是一个无符号的b y t e 类型值,它表明了表的类型和格式, c p _ i n f o 表一共有1 1 种类型,分别代表整数、浮点数、长整数、双精度浮点数、 类、字符串、字段、方法、接1 2 1 方法、描述符、和u t f 8 常量字符串等信息,i n f o 数组的值取决于t a g 值,如果t a g 表示整数、浮点数等则为固定大小,若为字符 串形式则长度为可变的。 在常量池中所有的字符串都被编码为标准的u t f 8 的格式,并存放到常量池 中的u t f 8 一i n f o 表中,u t f 8 一i n f o 表的结构如下【2 4 1 : c o n s t a 幔u # _ i n f o u lt a g ; u 2l e n g t h ; 1 2 硕士学位论文第二章类装载器内部实现原理分析 u lb y t e s 1 e n g t h j ) 其中t a g 项的值为c o n s t a n t _ u t f s ( 1 ) ,l e n g t h 项给出了后续b y t e s 项的长度,b y t e s 数组包含的是按照u t f 8 格式存储的字符串。c o n s t a n tu t f 8i n f o 表中存储了 四种基本的信息类型:文字字符串、被定义的类和接口的描述符、对其它类或接 口的符号引用以及与属性相关的字符串【2 5 】。 在常量池的其它表中,如f i e l d r e lm e t h o d r e f 和i n t e r f a c e m e t h o d r e f ,它们具 有相似的结构,如图2 3 所示: 图2 3 字段和方法的结构图 根据字段和方法中引用结构的相似性,可以知道,虚拟机在解析类、字段以 及方法时要利用u t f 8i n f o 表取得类型名字、描述符信息等的关联,在这之前, 虚拟机需要预先存储各种字符串常量到u t f 8i n f o 表中,字段和方法的结构如下: f i e l d _ i n f o u 2a c c e s s _ f l a g s ; u 2n a m e i n d e x ; z 口d e s c r i p t o ri n d e x ; u 2a t t r i b u t e s _ c o u n t ; a t t r i b u t e _ i n f o * f i e l d s _ a t t r i b u t e ; 在f i e l d i n f o 结构中其中a c c e s s _ f l a g 表示字段的访问类型,n a m e i n d e x 表示对常 量池u t f 8 一i n f o 的索引,代表所在的类型名,d e s c r i p t o r i n d e x 也是对常量池 u t f 8i n f o 的索引,代表字段的描述符,a t t r i b u t e sc o u n t 表示字段所具有的属性个 数,最后一项是字段的属性。 m e t h o di n f o u 2a c c e s s _ f l a g ; 硕+ 学位论文第二章类装载器内部实现原理分析 u 2n a m

温馨提示

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

评论

0/150

提交评论