




已阅读5页,还剩70页未读, 继续免费阅读
(计算机应用技术专业论文)java虚拟机相关技术研究与实践.pdf.pdf 免费下载
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
西南交通大学硕士研究生学位论文第l 页 摘要 j a v a 体系结构包括四个相互关联的技术:j a v a 语言、j a v aa p i 、 d 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 语言的显著特点,本论文对垃圾收集算法进行 了深入研究。首先研究经典的垃圾收集算法和几种高级收集算法,然后重点 研究火车垃圾收集算法。通过对火车算法的详细研究,发现火车算法存在如 下问题:在移动对象时并未明确说明如何处理;在处理流行对象时仍然是破 坏性的;在某些特殊情况下,火车算法是失效的。本论文针对这三种情况分 别提出理论上的解决办法和处理策略。 本论文重点研究类装载器系统。首先分析类装载器的体系结构,如双亲 委派模式、c l 船s 文件格式等。在此基础上设计并实现了一个类装载器,它的 主要功能是根据系统环境变量的设置查找d 豁s 文件,对c l a s s 文件进行必要 的合法性检查,解析d 够s 文件并创建相应的内存方法区数据结构。此外, 本论文还针对现有的类装载器不能装载加密过的d a s s 文件这一问题,提出 改进方案,设计了一个加密算法对d a s s 文件进行加密。类装载器在加载此 类d a s s 文件时首先调用相应的解密算法还原成原始d a s s 文件数据,然后再 对此数据进行验证加载。 关键词:j a v a ;j a v a 虚拟机;类装载器:垃圾收集 西南交通大学硕士研究生学位论文第1 i 页 j a v aa r c h i t e c t u r ei n c l u d e sf o u rr e l a t i v et e c h n o l o g i e s , n a m e l yj a v al a n g u a g e j a v aa p lc l a s sf i l ea n dj a v av n - t u a lm a c h i n e ( j v m ) t h ej a v av i r t u a l m a c h i n ei st h ek e yp a r to ft h ej m at e c h n o l o g i e s a st h es a m ea sa na c t u a l c o m p u t e r , j v mi sa l la b s t r a c tc o m p u t e r , w h i c hh a si t so w ni n s t r u c t i o ns e ta n d u s e sd i f f e r e n tm e m o r ya r e a b y # r i n g 姐i n s i g h ti n t ot h e v m w ec a nf a s t m a s t e rt h ea d v a n c e dc o m p u t e rt e c h n o l o g y ,a n dg e tav a s ta m o u n to fe x p e r i e n c e t h e nw ec a na p p l yt h e s et e c h n o l o g i e st oo u rn a t i o n a ls o f t w a r ed e v e l o p m e n ta n d d e s i g n , a n dm a k eac o n t r i b u t i o nt oo u rn a t i o n a ls o f t w a r ed e v e l o p m e n t t h ej v m a d o p t ss t a c ks 缸 u c t u r e i nt h i sp a p e r , w ef i r s t l ys t u d yt h ea r c h i t e c t u r e o ft h ej a v l r t u a lm a c h i n e i n c l u d i n gc l a s sl o a d e r , r u n t i m ed a t aa r e aa n d g a r b a g ec o l l e c t i o n g a r b a g ec o l l e c t i o ni sa l s oa na t t r a c t i v ef e a t u r eo fj a v a l a n g u a g e i nt h i sp a p e r , w cr e s e a r c ht h ec l a s s i c a lg a r b a g ec o l l e c t i o nt e c h n o l o g i e s a n ds o m ea d v a n c e da l g o r i t h m s ,a n df o c u so nt h et r a i na l g o r i t h m w i t ht h ed e e p l y r e s e a r c h i n go nt h et r a i na l g o r i t h m ,w ef i n dt h a t t h et r a i n a l g o r i t h mh a st h e f o l l o w i n gp r o b l e m s :( 1 ) t h ep r o c e s si sn o te x p l i c i t l yp r e s e n t e dw h e nt h eo b j e c ti s t r a n s f e f r e db ys e v e r a lt r a i n s ;( i ti ss t i l ld e s t r u c t i v ew h e nd e a l sw i t ht h ep o p u l a r o b j e c t ;( 3 ) i ti s s u b t l e i ns o m es p e c i a lc o n d i t i o n s i nt h ep a p e r , w eg i v eo u r t h e o r e t i c a ls o l u t i o na n dp r o c e s ss c h e m ef o rt h e s et h r e ep r o b l e m s w em a i n l yr e s e a r c ht h ec l a s sl o a d e rs y s t e m f i r s t l yw ea n a l y z et h es t r u c t u r e o ft h ec l a s sl o a d e r ,s u c ha sp a r e n t c h i l da c c r e d i t a t i o nm o d e ,t h ef o r m a to fc l a s s f i l ea n ds oo n i nt h i sp a p e r , w ed e s i g na n di m p l e m e n tac l a s sl o a d e r , w h i c hm a i n f u n c t i o ni sa sf o l l o w i n g s :f i n dc l a s sf i l e a c c o r d i n gt ot h es e t u po fs y s t e r n e n v i r o n m e n tv a r i a b l e ,c h e c kt h ev a l i d i t yo fc l a s sf i l e ,p a r s ec l a s sf i l ea n dt h e n c r e a t ec o r r e s p o n d i n gm e m o r ym e t h o dd a t as t r u c t u r e i na d d i t i o n , i ti sf o u n dt h a t a l lp r e s e n tc l a s sl o a d e r sc a l ln o tl o a dt h ee n c r y p t e df i l e ht h i sp a p e r , w ep r o p o s e a ni m p r o v e ds c h e m e ,a n dd e s i g na ne n c r y p ta l g o r i t h mw h i c hi su s e dt oe n c r y p t t h ec l a s sf i l e 1 ki m p r o v e dc l a s sl o a d e rf i r s t l yc a l l st h ec o r r e s p o n d i n gd e c r y p t a l g o r i t h mt or e d u c eo r i g i n a lc l a s sf i l e ,t h e nv a l i d a t e sa n dl o a d st h i sd a t a k e y w o r d s :j a v a ;j a v a v i r t u a lm a c h i n e ;c l a s sl o a d e r ;g a r b a g ec o l l e c t i o n 西南交通大学硕士研究生学位论文第1 页 1 1 研究背景 第1 章绪论 虚拟机的设计思想早在上个世纪6 0 年代就被m m 公司应用在v m 7 0 操作系统1 1 1 。后来,s m a l l t a i k 更是将虚拟机发扬光大 2 1 。此外,很多公司开 始研究并开发虚拟机,如i n t e l ,m i c r o s o f t 等。通过使用虚拟机,使移植变得 方便,只需移植虚拟机和相关的支持程序库到新的架构,所有上层的应用程 序都不需要更动。同时由于虚拟机的隔离作用,也使得基于虚拟机之上的应 用程序变得更安全。 虚拟机技术也应用在反病毒领域。目前主流的反病毒软件如n o r t o n 、 k i l l 、w 等都采用了虚拟机技术作为特征码技术的补充【”。虽然各自的查 毒虚拟机的实现不相同,但是其基本工作原理却是一样的。查毒虚拟机是一 个软件模拟的c p u ,它象真正的c p u 一样取指,译码,执行,模拟一段代 码在真正c p u 上运行得到的结果。 s u nm i c r o s y s t e m 公司又将虚拟机技术应用到跨平台高级语言解释器 上。j a v a 源程序编译后产生二进制代码,它是一种与具体机器指令集无关 的指令集合,通过j a v a 虚拟机的解释,可以在不同的平台上运行。这就是 众所周知的“编写一次,到处运行”,它是j 越,a 诱人而又真实的口号【3 1 。 j a v a 虚拟机是一个由j a v a 虚拟机规范定义的抽象计算机,和实际的计算机 一样,它具有一个指令集并使用不同的存储区域,但是它却往往比实际的硬 件机器简单。虽然虚拟机技术在j a v a 之前已经出现一段时间了,但是没有 进入主流,而且使用虚拟机机制来实现编程语言并不是j a v a 的创举,这已 经是以前就有的做法,如u c s cp a s c a l 的p c o d e 机等,但是由于j a v a 的广 泛流行也使得j a v a 虚拟机相比其他语言解释器要出名得多。 s u nm i c r o s y s t e m 公司是j a v a 语言的创始者,它制定了业界的统一标 准:j a v a 虚拟机规范,但是该规范并不是十全十美的。作者通过在北京 s u n 中国工程研究院的实际实习与工作经验,经过与公司内部虚拟机研究人 员的交流与沟通,作者了解到,s u n 的h o t s p o t 虚拟机实现也存在一些问 题。而r i c h a r dh u d s o n 和e l i o tm o s s 提出的火车垃圾收集算法也存在一些缺 陷,该算法目前正在被s u n 的h o t s p o t 虚拟机采用。本文旨在针对现有的类 西南交通大学硕士研究生学位论文第2 页 装载器不能装载解析加密过的c l a s s 文件这一主要问题设计和实现了具有这 种功能的类装载器系统,并针对火车算法存在的缺陷进行改进。由于s u n h o t s p o t 虚拟机的垃圾收集技术并不公开其源代码,所以不能通过实验来对 比算法改进前后的性能差异,这一点也将作为以后进一步研究的工作。 1 2 课题的国内外研究现状和存在的问题 自动的垃圾收集是j 越,a 编程语言的一个显著特点。垃圾收集技术早在 上个世纪6 0 年代就被提出来了嘲。现在除了经典的垃圾收集技术,还有各 种各样的高级垃圾收集技术。其中每一种方法在特定条件下都有其优点和缺 点。例如,当有很多对象成为垃圾时,拷贝收集算法可以做得很好,但是有 许多长寿对象时它就变得很糟( 要反复复制它们) 。相反,标记紧缩对于长 寿对象可以做得很好( 只复制一次) ,但是当有许多短寿对象时就不大适合 了1 1 ”。目前,还不存在能够适用于任何环境的垃圾收集算法。s u n 公司的 j 2 s e 5 0h o t s p o t 虚拟机针对不同的环境提供了几种垃圾收集算法 7 1 。 类装载器是j a v a 虚拟机实现中非常重要的组成部分,类装载器体系结 构是j a v a 沙箱安全模型的第一道防线,它能防止恶意的代码去干涉善意的 代码,它守护了被信任的类库的边界,它将代码归入某个保护域从而确定了 代码可以进行那些操作 7 1 。但是,目前所有的虚拟机实现( s u nh o t s p o t ,勋位 等) 中类装载器的输入是原始的二进制c l a s s 文件,而随着计算机网络的发 展,网络安全也成为人们关注的焦点,这时候我们需要对原始c l a s s 文件进 行加密并装载。 目前,国内公司或科研机构对j a v a 虚拟机这一技术的研究并不是很多 唧。国内主要研究的是j a v a 虚拟机在嵌入式系统的应用,但是还没有自主 产权的嵌入式j a v a 虚拟机,全国只有清华大学等少数大学在研究开发自己 的嵌入式j a v a 虚拟机 4 1 ,但是与国外的同类产品还有很大的差距。在国内 对j a v a 虚拟机的研究主要有:j a 、,a 虚拟机的线程模型、j a v a 虚拟机的执 行引擎、自适应优化技术、编译优化、j a v a 虚拟机的内存管理策略等。近 年来,垃圾收集技术的研究在国内已经开展,主要研究有:垃圾收集机制的 研究、自动回收过程的实时性问题研究以及利用s u nh o t s p o t 虚拟机提供的 几种垃圾收集算法进行性能分析与调节。对于j a v a 虚拟机的类装载器的研 究主要有:类装载机制分析、装载远程类文件的实现、基于j a v a 类加载器 西南交通大学硕士研究生学位论文第3 页 的安全监察代码、动态类装载实现不确定性处理。 在国外,对j a v a 虚拟机的研究要比国内成熟一些,比如s u n 、m m 、 b e a 等国外公司都研发出了自己的j a v a 虚拟机产品。据作者在s u n 中国 工程研究院实习了解到,众所周知的h o t s p o t 虚拟机也存在很多的b u g 。由 于知识产权的问题,很多公司都没有公开其虚拟机的实现技术。这些公司的 虚拟机产品在垃圾收集方面采用的算法不尽相同,而各种垃圾收集算法都或 多或少的存在着一些缺陷,比如火车垃圾收集算法在处理移动对象、流行对 象等的时候就存在一些问题,本文中会对其进行理论改进。此外,在这些流 行的j a v a 虚拟机实现中,其类装载器都有一个相同的模式:它们只能分析 原始j a v a c l a s s 文件,都不能对加密后的d a s s 文件进行装载解析。在今天的 网络时代,网络安全已经成为一个非常重要的话题,我们对数据安全性的要 求也越来越高,如何使j a v a 虚拟机的类装载器能够装载并解析加密后的 c l a s s 文件,更好地保护我们的信息资源,这也是本论文重点研究并需要解决 的问题。 1 3 论文主要研究内容 本文针对现有的j a v a 虚拟机类装载器不能装载并解析加密过的c l a s s 文 件这一缺陷,做出了相应的改进并设计和实现了具有这种功能的类装载器子 系统,这样就使类装载器的功能更加完善,能够对加密过的c l a s s 文件进行 装载解析。另外,本文针对r i c h a r dh u d s o n 和e l i o tm o s s 提出的火车垃圾收 集算法进行重点研究,针对其存在的问题提出改进策略。 本文的主要研究工作如下: ( 1 ) 本文系统研究了j a v a 语言和j a v a 虚拟机的各项相关技术,对各个 技术做了简要而精辟的阐述。详细分析了j a v a 虚拟机的类装载器子系统、 方法区数据结构和垃圾收集算法。 ( 2 ) 本文深入探讨了各种垃圾收集算法,包括:引用计数、标记并清 除、标记紧缩、拷贝算法、分代算法、火车算法和渐进式算法,主要研究以 上算法的思想、优点和缺点。最后重点研究目前比较流行的火车算法,分别 针对移动对象、流行对象等情况提出理论改进思想。 ( 3 ) 本文重点研究的是类装载器子系统,首先分析它的体系结构,然后设 计并实现一个类装载器子系统,它的主要功能有:c l a s s 文件字节码流显示功 西南交通大学硕士研究生学位论文第4 页 能;c l a s s 文件装载过程中日志文件的生成;日志文件的显示功能;本地机器 环境变量的查找与解析:c l a s s 文件的基本验证功能;c l a s s 文件字节码流解 析,生成内存数据结构:c l a s s 文件内存数据结构的可读性显示;原始c l a s s 文件( c l a s s 文件) 的加密功能:加密后的c l a s s 文件( c l a s s 2 ) 字节码流解析, 生成内存数据结构,以及此内存数据结构的可读性显示;加密后c l a s s 文件 的解密功能等。 本论文实现的类装载器的主要改进之处在于:传统类装载器对c l a s s 文 件装载之后,生成相应的内存数据结构,此数据结构一般为内存片段,非常 难懂,本论文中的类装载器应用程序不仅生成了这段神秘的内存数据结构, 而且将此数据结构按照虚拟机规范以可读性非常高的形式展示在用户面前, 这样就使我们对类装载器的装载功能有了更加直观的认识;传统类装载器只 能够识别c l a s s 文件,一个加密过的c l a s s 文件对传统类装载器来说,是没法 解析装载的。本论文中实现了一个加密算法和解密算法,首先对原始c l a s s 文件进行加密,生成c l a s s 2 文件,类装载器在遇到这种文件格式后,会调用 相应的解密算法,还原出原始c l a s s 文件,然后对此原始c l a s s 文件进行解析 装载。 1 4 论文结构安排 本文分为五章: 第一章绪论:论述了课题的研究背景、国内外研究现状及存在的问 题。指出了当前流行的j 越,a 虚拟机实现中的类装载器技术的缺陷。 第二章j a v a 虚拟机相关理论及技术:对论文中用到的相关技术做了简 要的阐述,主要有j a v a 技术的体系结构、j a v a 虚拟机体系结构,包括类 装载器、运行时数据区、执行引擎、本地方法接口、垃圾收集等技术。 第三章垃圾收集算法研究及改进:首先介绍了经典的垃圾收集算法, 主要有引用计数、标记并清除、拷贝收集算法等,然后分析几种高级垃圾收 集算法:分代垃圾收集、火车垃圾收集算法等,最后重点对火车算法进行研 究并针对其存在的问题提出改进策略。 第四章类装载器分析:首先阐述了j a v a 虚拟机的类装载器子系统,然 后分析类装载器的体系结构,最后对类装载器提出改进方案。 第五章类装载器设计与实现:首先介绍了本文所设计和实现的类装载 西南交通大学硕士研究生学位论文第5 页 器,并把它与传统类装载器进行比较,其次对类装载器系统进行详细设计, 包括功能设计和数据结构设计,接着是类装载器的实现,最后对实现的类装 载器进行功能测试。 结束语:总结论文工作的成果及需要进一步研究的内容。 西南交通大学硕士研究生学位论文第6 页 第2 章j a v a 虚拟机相关理论及技术 2 1j a v a 技术 j a v a 语言是美国s u n 公司于1 9 9 5 年推出的面向对象的程序设计语 言。由s u n 公司的j a m e sg o s l i n g 等人于9 0 年代初开发。它最初被命名为 o a k ,作为一种小家用电器的编程语言 3 1 。在1 9 9 5 年5 月s u n 公司正式发 布j a v a 。j a v a 伴随着i n t c m e t 的迅猛发展而发展,逐渐成为重要的i n t c m e t 编程语言。 j a v a 技术的核心是j a v a 虚拟机【4 】,j a v a 虚拟机属于j a v a 体系结构的 一部分,该体系结构支持了j a v a 技术的三个特性:平台无关性、安全性和 网络移动性。 2 1 1j a v a 体系结构 j a v a 体系结构包括四个独立但是相关的技术:j a v a 虚拟机、j a v a 应 用编程接口( a p i ) 、j a v a 程序设计语言和j a v a c l a s s 文件格式【9 】。 当编写并运行一个j a v a 程序时,就同时体验了这四种技术。用j a v a 编程语言编写代码,把它编译成c l a s s 文件,再在j a v a 虚拟机中运行c l a s s 文件。当编写程序时,通过调用类( 这些类实现了j a v aa p i ) 中的方法来 访问系统资源。当程序运行的时候,它通过调用c l a s s 文件中实现了j a v a 应 用编程接口的方法来满足程序的j a v a 调用。图2 - 1 显示了这四者之间的联 系川。 j a v a 虚拟机和j a v a 应用编程接口一起组成了一个平台,称为j a v a 平 台。j a v a 程序可以在有j a v a 平台的任何地方运行。 西南交通大学硕士研究生学位论文第7 页 运行时环境 程序的源文件 程序的c l a s s 文件 ( j a v a )通过本地 ( c l a s s ) i i 或网络传 h递c l a s s 文 丫、虚拟机 乱 件 编译器, 卜 丫 。 程序的c l a s sj a v a a p i 的由s s 文件 文件r c l a s s )( 0 t o e c t c l a s s , s t r i n g c j 锄匐 图2 - 1j a v a 编程环境 2 1 2j a v a 技术特性 j a v a 技术具有三大特性:平台无关性、安全性和网络移动性,由于其 内在的与w e b 技术结合的紧密性,使其成为构建网络计算环境的首选技 术。 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 。组成 j a v a “沙箱”的基本组件有:类装载器结构、c l a s s 文件检验器、内置于 j a v a 虚拟机中的安全特性、安全管理器及j a v a a p i 。 西南交通大学硕士研究生学位论文第8 页 j a v a 的网络移动性利用了一种全新的软件模式,在分布式处理模式的 基础上,将软件和数据通过网络自动传送到各台计算机上。j a v a 体系结构 对网络移动性的支持是和它对平台无关性和安全性的支持密不可分的。平台 无关性使得在网络上传送程序更加容易,安全性促进了网络移动性的推广。 此外,j a v a 体系结构对网络移动性的支持主要是通过动态连接、动态扩展 和紧凑的c l a s s 文件体现的。动态连接和动态扩展允许j a v a 程序按照小功能 单元设计,在最终用户需要的时候才单独下载。a 雒s 文件的紧凑性有助于 减少j a v a 程序在网络上传送的时间。 因此,j a v a 的三大特点是相互支持、相互补充的,这三个特点完美地 结合在一起,支撑起了先进的j a v a 计算平台。 2 2j a v a 虚拟机体系结构 从概念上看,j a v a 虚拟机( j v m ) 是一个想象中的、能运行j a v a 字节 码的操作平台,是由j a v a 虚拟机规范定义的抽象计算机【堋。j a v a 技术的 核心就是j v m ,所有的j a v a 程序在j 订上运行。 每个j a v a 程序都是运行于某个具体的j a v a 虚拟机实现的实例上。在 j a v a 虚拟机规范中,一个虚拟机实例的行为是分别按照子系统、内存区、 数据类型以及指令这几个术语来描述的。这些组成部分一起展示了抽象的虚 拟机的内部抽象体系结构。规范本身通过定义这些抽象的组成部分以及它们 之间的交互,来定义任何j a v a 虚拟机实现都必须遵守的行为川。 j a v a 虚拟机的内部体系结构图2 2 所示c 7 1 。主要分为五大模块:类装载 器子系统,运行时数据区,执行引擎,本地方法接口和垃圾收集模块。垃圾 收集模块并未在图2 2 中画出,因为j a v a 虚拟机规范并没有要求垃圾收 集,但是在没有发明无限的内存之前,大多数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 虚拟机的这种基 于栈的体系结构,有助于运行时某些虚拟机实现的动态编译器和即时编译器 西南交通大学硕士研究生学位论文第9 页 的代码优化m 2 2 1 类装载器 圈2 - 2j a x , 0 t 虚拟机的内部体系结构 类装载器是用于从程序和j a v aa p i 中装载c l a s s 文件的【1 0 l 。j 越,a 虚拟机 有两种类装载器:启动类装载器和用户定义的类装载器。前者是j a v a 虚拟 机实现的一部分,而后者是j a v a 运行程序的一部分。由不同的类装载器装 载的类被放到删的不同名字空间中。 类装载器不仅仅用于找到并导入类的二进制数据,它也被用来检查导入 类的正确性,分配并初始化类变量,辅助符号引用的解析。这些动作必须严 格按照以下顺序执行1 1 8 】: ( 1 ) 装载查找并装载类型的二进制数据。 ( 2 ) 链接执行验证,准备,以及解析( 可选) 。 a 1 验证:保证被导入类型的正确性。 b 1 准备:为类变量分配内存,并将其初始化为缺省值。 解析:把类型中的符号引用转换为直接引用。 ( 3 ) 初始化一调用j a v a 代码把类变量初始化为合适的初始值。 西南交通大学硕士研究生学位论文第1 0 页 2 2 2 运行时数据区 当j a v a 虚拟机运行一个程序时,它需要内存来存储很多信息,例如: 字节码、从已装载的c l a s s 文件中得到的其他信息、程序创建的对象、传递 给方法的参数、返回值、局部变量以及运算的中间结果等。j a v a 虚拟机把 这些信息都组织到几个运行时数据区中,以便于管理。 每个j a v a 虚拟机实例都有一个方法区以及一个堆。当每一个新线程被 创建时,它都将得到自己的p c 寄存器以及一个j a v a 栈。 2 2 2 1 方法区 方法区是在虚拟机中被用于存放被装载类的信息的内存区。虚拟机在装 入某个类时,将该类的信息和静态变量存储在方法区中。当虚拟机运行某个 j a v a 程序时,它就会查找方法区中存储的信息。典型的情形是,j a v a 程序 的字节码存放在方法区,p c 寄存器指向方法区的某个位置,控制字节码的 执行。方法区的大小不是固定的,可以根据应用的需要由虚拟机动态调整。 同样,方法区也不必是连续的,可以是相互分割开的。方法区被虚拟机实例 中所有的线程所共享,可以被垃圾收集。 虚拟机在方法区中为每个被装载的类存储的类型基本信息,包括:类的 全限定名、直接超类的全限定名、类型( 类还是接口) 、访问修饰符 ( p u b l i c 、a b s t r a c t 或f i n a l 等) 以及直接超接口的全限定名的有序列表。除此 以外还存储一些扩展信息,包括:类的常量池、字段信息、方法信息、类的 静态变量、到c l a s s l o a d e r 的引用以及到c l a s s 的引用。这些信息的具体组织 形式是与具体实现相关的,由设计者根据具体的系统情况来加以取舍。 2 2 2 2d a v a 栈 j a v a 栈是以帧为单位保存线程的运行状态的。虚拟机对j a v a 栈有两种 操作:以帧为单位的压栈和出栈。j a v a 栈上所有的数据都是该线程私有 的。j a v a 栈是由许多栈帧( s t a c kf r a m e ) 所组成的,每个栈帧包含一个 j a v a 方法调用的状态。当线程调用一个j a v a 方法时,虚拟机压入一个新的 栈帧到该线程的j a v a 栈中;当该方法返回时,这个栈帧被从j a v a 栈中弹 出并抛弃。 图2 3 描绘了虚拟机为每个线程所创建的私有内存区。当前正在执行的 方法的栈帧以浅色表示。线程1 和线程2 正在执行j a v a 方法,线程3 正在 执行一个本地方法。 西南交通大学硕士研究生学位论文第1 1 页 圈2 - 3 线程专有的运行时数据区 2 2 2 3 堆 堆用来存放运行时创建的所有类实例或数组。一个j a v a 虚拟机实例只 存在一个堆空间,所有线程都将共享这个堆。因为一个j a v a 程序独占一个 j a v a 虚拟机实例,所以每个j a v a 程序都有它自己的堆空间。 j a v a 虚拟机有分配新对象的指令,没有释放内存的指令。程序本身不 用去考虑回收内存,通常,堆空间的回收由垃圾收集器来完成。此外,堆空 间不必是连续的内存区,在程序运行时,它可以动态扩展或收缩。 2 2 2 4p c 寄存器 对于一个运行中的j a v a 程序,它的每个线程都有自己的p c 寄存器, 它是在该线程启动时创建的。p c 寄存器的大小是一个字长。当线程执行某 个j a v a 方法时,p c 寄存器的内容总是下一条将被执行指令的地址。 2 2 2 5 本地方法栈 当某个线程调用一个本地方法时,它就进入了不再受虚拟机限制的世 界。本地方法可以通过本地方法接口来访问虚拟机的运行时数据区,任何本 地方法接口都会使用某种本地方法栈。当线程调用本地方法时,虚拟机简单 地动态连接并直接调用指定的本地方法。 前面曾经提到,每个线程都有自己的j a v a 栈。每当线程调用一个 j a v a 方法时,虚拟机都会在该线程的j a v a 栈中压入一个新帧。图2 _ 4 描绘 西南交通大学硕士研究生学位论文第12 页 了线程调用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 4 个线程讽用j 陬方法和本地方法时的棱 2 2 3 执行引擎 执行引擎是任何j a v a 虚拟机的核心,指令集定义了它的行为。执行 引擎是和i a 、,a 线程的生命周期相关联的,运行中j a v a 程序的每一个线程 都是一个独立的虚拟机执行引擎的实例。从线程的生命周期的开始到结束, 它要么在执行字节码,要么在执行本地方法。j 筒,a 虚拟机的实现可能包括 一些对用户程序不可见的线程,这些线程不是j v m 具体实现的执行引擎的 实例。所有属于用户程序的线程,都是实际工作的执行引擎。 执行引擎的实现可以使用多种执行技术,包括:解释、即时编译、自适 应优化、芯片级直接执行等1 2 1 l 。最初的虚拟机通过解释器来动态执行一条字 节码,然后各种各样的j a v a 编译器出现了,比如j u s t - i n - t t m e ( j i r ) 编译 西南交通大学硕士研究生学位论文第1 3 页 器,它在第一次执行方法的时候先把字节码编译成本地代码,然后执行这段 代码,以后再调用该方法总是执行保存过的本地代码,不需要再进行编译。 自适应优化的虚拟机开始的时候对所有的代码都是解释执行,但是它监视程 序的执行情况,当它判断出某个特定的方法是瓶颈的时候,它就启动一个后 台进程,把字节码编译成本地代码,非常仔细地优化这些本地代码。同时, 程序仍然通过解释来执行字解码。s u n 的h o t s p o t 虚拟机就采用了自适应优 化技术【2 1 l 。 2 2 4 本地方法接口 j a v a 虚拟机规范并没有要求j v m 实现一定要支持本地方法接口,有些 j v m 实现根本不支持本地方法接口,有些则支持几个,每一个都有其特定 的目的。s u n 公司的j a v a 本地接口( j n i ) 是为了可移植性设计的。j n i 设计 的目的是它可以被任何j v i 实现所支持,而不用管这个j v m 实现用的是什 么垃圾收集技术或对象表示方法。这反过来可以使得开发者在一个特定的主 机平台上把同一个( j n i 兼容) 本地方法的二进制代码链接到任何支持j n i 的虚拟机实现上。 除了j n i 之外,设计者可以选择创建专有的本地方法接口。为了提高性 能,j v m 实现设计者可以决定提供它们自己的低层本地方法接口,这是与 它们特定的实现结构紧密相关的。设计者也可以提供比j n i 高层的本地方法 接口,比如把i a v a 对象加入到一种组件软件模型中用。 为了有效地工作,本地方法必须与j v m 的内部状态进行某种程度的交 互。例如,本地方法接口允许本地方法执行下面这些操作:传递并返回数 据、访问实例变量或者调用被垃圾收集的堆上对象中的方法、访问类变量或 者调用类方法等。 设计一个提供这些服务的本地方法接口很复杂。设计需要保证垃圾收集 器不会释放正在被本地方法使用的任何对象,如果j v m 实现的垃圾收集器 移动对象以减少堆分段,那么本地方法接口设计必须保证下面两个条件之 一: ( 1 ) 对象的引用被传递到一个本地方法之后,该对象才可以被移动; ( 2 ) 对象的引用被传给一个本地方法之后,该对象被“钉住”,直到该 本地方法返回或者通知它已经不需要该对象为止。 西南交通大学硕士研究生学位论文第14 页 因此,本地方法接口与j 呱,a 虚拟机的内部工作是紧密联系在一起的。 2 2 5 垃圾收集 如果一个对象不再被程序引用,它所占用的堆空间就可以被回收,以便 分配给新的对象。j a v a 虚拟机规范并没有要求垃圾收集,但是在没有发明 无限的内存之前,大多数j v m 实现都是有垃圾收集的【1 8 l 。垃圾收集可以改 善堆碎片。堆碎片发生在正常的程序执行过程中,新的对象被分配,不再被 引用的对象被释放,被释放掉的堆空间就位于活对象占用的堆空间之间,这 时分配新对象的请求就可能导致必须扩展堆的大小,因为现存的堆中没有连 续的自由空间存放新对象,最后堆中只剩下一些间隔的小空间,造成资源浪 费,并且扩展堆的大小会严重影响程序的性能。垃圾收集还可以保证程序的 完整性,j a v a 程序员不会因为错误地释放内存造成m 崩溃。下一章将详 细研究垃圾收集技术。 西南交通大学硕士研究生学位论文第15 页 第3 章垃圾收集算法研究及改进 垃圾收集是j a v a 语言的显著特征,它是动态分配内存的自动管理机制 例。任何垃圾收集算法都必须作两件事情。首先,它必须检测垃圾对象。然 后,它必须回收这些对象占用的空间并在程序中重新利用这些空间1 8 1 。垃圾 检测是由定义一个根集( r o o ts e t ) ,然后从这个根集出发确定可达性来实现 的。如果从根集出发,存在一条引用路径,程序可以利用这条路径访问某个 对象,那么这个对象就是可达的。根集总是可被程序访问的,任何从根集可 达的对象都被认为是“活”对象,不可达的对象就被认为是垃圾,因为它们 不会影响程序将来的执行过程【2 1 1 。 本章主要研究垃圾收集技术,包括引用计数、标记并清除和标记紧缩等 经典的垃圾收集算法,以及分代垃圾收集、火车算法等高级的垃圾收集算 法,重点研究了火车垃圾收集算法。由于知识产权的原因,大部分虚拟机的 垃圾收集算法的实现并不公开其源代码,我们主要是对垃圾收集算法进行理 论研究,针对火车算法存在的问题提出理论改进策略。 3 1 经典垃圾收集算法 区分活动对象和垃圾对象的两个基本方法是引用计数和跟踪【2 l 】。引用计 数通过为堆中的每个对象保存一个计数来区分活动对象和垃圾对象。跟踪垃 圾收集实际上追踪从根结点开始的引用图,在跟踪中遇到的对象以某种方式 打上标记,当跟踪结束时,没有被打上标记的对象就被判定是不可触及的, 可以被当作垃圾收集。 3 1 1 引用计数算法 引用计数算法是为每个对象计算指向它的引用的数量。每个对象都有一 个计数器,存放的是现在有多少引用指向它。每当一个指向对象的引用被创 建,该对象的计数值就加一,当一个已经存在的指向某对象的引用被删除或 者重写,这个对象的计数值就减一。例如:p = q ,那么q 所指向的对象的计 西南交通大学硕士研究生学位论文第16 页 数值就加一,p 所指向的对象的计数值就减一。当一个对象的计数器的值被 减到零的时候,说明已经没有指针指向这个对象了,那么它所占的空间就可 以被回收。 当一个对象被回收的时候,它的每个指针域都要被检查,如果它包含指 向别的对象的指针,这些对象的引用计数也要减一。所以,回收一个对象可 能引起传递性的给别的对象的计数值减一,然后再回收那些因此而使得计数 值变成零的对象。 引用计数算法的主要优点有以下几点。首先,它的渐增性质。垃圾收集 的工作是跟应用程序本身的运行紧密交织的,因收集器的工作而引起的程序 运行的暂停时间一般来说是很短的。其次,该算法可以很快地执行,交织在 程序的运行之中,这个特性对于实时环境很有利。最后,当大部分的堆空 间都已经被占用的时候,使用该算法的收集器的性能也不会受到影响。 另一方面,引用计数也有很多的缺点。首先是循环的问题。引用计数对 于循环的数据结构会失效。如果在一组对象中的指针创建了一个循环,这些 对象的引用计数永远不可能减到零,即使从根集已经不可能到达这些对象 了。其次是效率问题。每次指针被修改,引用计数器都要被更新一次。而且 当一个对象的计数值被减到零以后要被回收,必须执行一些操作使得回收的 空间能被运行的程序访问到。每个对象都要消耗若干条指令来进行回收操 作。最后是计数器溢出问题。引用计数给每个对象增加一个域,但是这个域 的大小是有限制的,如果指向一个对象的引用数无限制增长,使得计数器溢 出,该算法就会失效。 总结上述引用计数算法的优缺点,可以说该算法的效率不高,再加上循 环所产生的有效性问题,导致这个技术在近年来失去了吸引力。现实中的 j a v a 虚拟机更有可能在垃圾收集堆中使用跟踪算法。 3 1 2 标记并清除收集算法 标记并清除算法是跟踪型收集器的一种,内存单元并不会在变成垃圾的 同时立刻回收,而是保持不可到达和未被发现的状态,直到所有可用的内存 都耗尽嗍。 该算法首先区别活对象和垃圾。这是通过跟踪做到的,从根集开始遍历 整个引用树,可以到达的对象就被用某种方式标记。一旦活对象和垃圾对象 西南交通大学硕士研究生学位论文第17 页 区别开以后,内存就会被清扫一遍,以发现所有的没有被标记的对象,然后 回收它们。 与引用计数算法相比,标记并清除算法有两个优点。第一,它可以非常 自然的处理循环数据结构,不需要采取特别的预防措施;第二,操纵指针没 有额外的开销。 但是,传统的标记并清除收集器有三大问题。首先是碎片问题,碎片问 题就是当我们要分配一个n 字节大小的对象的时候,发现有很多小于n 字 节的空闲块存在,但是没有合适的空闲块分配给这个对象。在标记并清除收 集器中处理大小不同的对象会产生碎片。被回收的垃圾对象和活对象交织在 一起,对对象的分配非常困难。其次是效率问题,收集的代价大小和堆的大 小成正比。每次垃圾回收都必须对所有的活对象进行标记,对所有的垃圾对 象进行收集。最后。标记并清除算法是一种“停止一启动”算法,在
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 环境保护法规对企业生产影响分析
- 销售团队绩效考核及激励机制
- 2025年危险化学品经营单位安全管理人员考试练习题含答案
- 加强未成年人思想道德教育交流材料
- 2025年豆类种植技术职业技能考试试卷及答案
- 初一数学思维训练提高方案
- 汽车维修站服务流程优化方案
- 高铁站服务质量提升策略
- 九年级体育教学计划与课程设计
- 高三理科综合试题集合及解析
- 学堂在线 工程伦理2.0 章节测试答案
- 子宫肌瘤麻醉管理
- 食用菌种植项目可行性研究报告立项申请报告范文
- 焦炉机械伤害事故及其预防
- 针灸调理养生在心脑血管疾病防治中的应用研究与实践
- 髋关节骨折护理
- 短视频运营合同协议
- 2025年中国文创产品行业市场发展现状及投资前景展望报告
- 6.2《多彩的职业》课件 - 2024-2025学年统编版道德与法治九年级下册
- 急性阑尾炎课件
- 部编版六年级上册语文(全册)教案设计(含教材分析、教学计划及进度)
评论
0/150
提交评论