(计算机应用技术专业论文)java虚拟机内存管理及其实时性的研究.pdf_第1页
(计算机应用技术专业论文)java虚拟机内存管理及其实时性的研究.pdf_第2页
(计算机应用技术专业论文)java虚拟机内存管理及其实时性的研究.pdf_第3页
(计算机应用技术专业论文)java虚拟机内存管理及其实时性的研究.pdf_第4页
全文预览已结束

下载本文档

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

文档简介

摘要 摘要 j a v a 语言的面向对象,平台无关,安全,开发效率高等特点,使其在许多领域中得 到了越来越广泛的应用。但是由于j a v a 程序由于自身的局限性,使其无法应用于实时领 域。由于垃圾收集器运行时将中断j a v a 程序的运行,其运行时刻和垃圾搜集时间具有不 确定性。在应用程序高频率分配和释放内存时,垃圾收集要占用的时间可能比程序自身 运行的时间还要多。这些都使得j a v a 程序无法满足在实时领域应用的要求。 j a v a 实时规范( r t s j ) 的内存管理机制既保证了j a v a 本身的内存安全的优势,同时又 保证了在实时系统中对内存操作的的可预测性。不产生垃圾的代码不会导致请求式的垃 圾收集;不引用堆中对象的代码可以抢占垃圾收集器的线程。为了能够保留垃圾收集的 好处又能避免垃圾收集器对实时特性的影响,基于以上两个事实r t s j 扩展了j a v a 内存 管理机制,在传统的堆内存的基础上,又提出了内存区域( m e m o r y a r e a ) 的概念。在新增 加的这几个内存区域中分配对象不会导致垃圾收集器的执行,不会使系统受到其不可预 测性的影响。 本文根据r t s j 的要求,介绍了r t s j 内存管理机制实现的各个基本要点,包括使 用d i s p l a y 树的内存引用检查,l t m e m o r y 和v t m e m o r y 的分配机制,s c o p e s t a c k 的维 护等。文章通过研究一个可运行在多种操作系统并兼容多种硬件平台的开源的j a v a 虚拟 机s a b l e v m 的基础上,结合国内外最新的理论,提出了一个对其实时性进行改进的方 案,并对其进行实验。该方案有别于国内外现有的实时j a v a 虚拟机的实现,在内存管理 方面即符合i h s j | 的要求,同时又保证了j a v a 程序可移植性的要求。 关键词:j a v a 虚拟机;实时j a v a 规范;内存区域;实时j a v a ;领域内存 a b s t r a c t a b s t r a c t j a v ah a sb e e nm o r ea n dm o r ew i d e l yu s e di nv a r i o u sf i e l d sd e p e n d i n go ni t s a d v a n t a g e ss u c ha so b j e c t o r i e n t e dl a n g u a g e ,p l a t f o r m - i n d e p e n d e n t ,s e c u r i t y , h i g he f f i c i e n c yf o rd e v e l o p m e n ta n ds oo n b u td u et oi t s1i m i t a t i o n s ,i tc a n n o tb ea p p l i e dt or e a l t i m ef i e l d s i n c eg a r b a g ec o l l e c t i o nw i1 1i n t e r r u p tt h e r u n n i n gj a v ap r o g r a m s ,w h i c hr u n n i n gt i m ea n dg a r b a g ec o l l e c t i o nt i m ea r e u n c e r t a i n w h e nt h ef r e q u e n c yo fa l l o c a t i o no rr e l e a s em e m o r yi sh i g h ,t h et i m e o fg a r b a g ec o ll e c ti o nm a ye v e nb el o n g e rt h a nt h er u n n i n gti m ec o s tb yt h ej a v a a p p lic a ti o n s ot h e s ea r et h er e a s o nt h a tj a v ap r o g r a mc a nn o tm e e tt h ed e m a n d i nt h er e a l ti m ea p p li c a ti o nf i e l d s t h em e c h a n i s m so fm e m o r ym a n a g e m e n to fr e a l t i m ej a v as p e c i f i c a t i o n ( r t s j ) n o to n l ye n s u r et h ea d v a n t a g eo fs e c u r it yo fj a v a ,b u ta l s oe n s u r et h ep r e d i c t a b l e o ft h eo p e r a t i o n st om e m o r y t h e r e f o r e ,i nr e a l t i m ej a v a ,i ti sn e c e s s a r yt o i m p r o v ea n do p t i m i z et h eg a r b a g ec o l l e c t i o nt e c h n o l o g y t h ec o d e st h a td on o t g e n e r a t eg a r b a g ew i1 1n o tr e q u e s tf o rg a r b a g ec o ll e c ti o n :t h ec o d e st h a td on o t h a v er e f e r e n c et oh e a pm e m o r yc a ns e i z et h eg a r b a g ec o l l e c t i o nt h r e a d i no r d e r t or e t a i nt h eb e n e f i t so fg a r b a g ec o l l e c t i o na n da v o i dt h ei m p a c t i o nt ot h e r e a l t i m ep e r f o r m a n c eb yg a r b a g ec o l l e c t i o n ,t h er t s je x t e n dt h ej a v am e m o r y m a n a g e m e n tm e c h a n i s mb a s e do nt h et w of a c t sa b o v e t h er t s jp u t sf o r w a r dt h e c o n c e p to fm e m o r ya r e a a l l o c a t eo b j e c t si nt h e s en e wm e m o r ya r e a sw i l ln o tc a u s e g a r b a g ec o l l e c t i o n ,a n dw i l l c a u s eu n p r e d i c t a b l e a c c o r d i n gt ot h er e q u i r e m e n t so fr t s j ,t h er t s jm e m o r ym a n a g e m e n tm e c h a n i s m o fv a r i o u sb a s i ce l e m e n t si si n t r o d u c e di nt h i sp a p e r ,i n c l u d i n gt h eu s eo f d i s p l a yt r e ef o rm e m o r yi n s p e c t i o n ,t h ea l l o c a t i o nm e c h a n i s mo fl t m e m o r ya n d v t m e m o r y ,m a in t e n a n c eo fs c o p es t a c k b a s e do na no p e n s o u r c ej a v av ir t u a l m a c h i n es a b l e y mt h a tc a nr u no nm u l t i p 士eo p e r a t i n gs y s t e m s ,c o m p a t i b l ew i t ha v a r i e t yo fh a r d w a r ep l a t f o r m s ,o nt h eb a s i so ft h el a t e s tt h e o r ya th o m ea n d a b r o a d ,as c h e m ef o ri m p r o v i n gi t sr e a l t i m ep e r f o r m a n c ei sp u tf o r w a r da n ds o m e e x p e r i m e n t sa r ed o n et ov e r i f yi t t h ep r o g r a mi sd i f f e r e n tf r o mt h ee x i s t i n g d o m e s t i ca n di n t e r n a t i o n a lr e a l t i m ej a v av i r t u a lm a c h i n ei m p l e m e n t a t i o n s i t n o to n l yi sc o n s i s t e n tw i t ht h er e q u i r e m e n t so fr t s j ,b u ta l s oe n s u r e st h e p o r t a b ilit yo ft h ej a v ap r o g r a m m i n gr e q u i r e m e n t si nm e m o r ym a n a g e m e n t k e w v o r d s :i v m ;r t s j ;m e m o r ya r e a ;r e a l - t i m ej a v a ;s c o p e dm e m o r y h 独创性声明 本人声明所呈交的学位论文是誉人在导师指导下进行的研究工作及取 得的研究成果尽我所知,除了文中特别加以标注和致谢的地方外,论文 中不包含其他人已经发表或撰写过的研究成果,也不包含誉人为获得江南 大学或其它教育机构的学位或证书而使用过的, t , h - 与我一向工作的同志 对本研究所做的4 鞠 - j t r 献均已在论文中作了明确的说明并表示谢意 签名:袷、乞强日 期: 兰丝仝垒曼璺 关于论文使用授权的说明 本学位论文作者完全了解江南大学有关保留,使用学位论文的规定: 江南大学有权保留并向国家有关部门或机构送交论文的复印件和磁盘,允 许论文被查阅和借阅,可以将学位论文的全部或部分内容鳊入有关数据库 进行检索,可以采用影印、缩印或扫描等复制手段保存、汇编学位论文, 并耳拳人电子文档的内容和纸质论文的内容相一致 保密的学位论文在解密后也遵守此规定 签名:拣盔该 导师签名: c :塞! = 丛 日 期: 丝2 绛三宴 第一章绪论 第一章绪论 1 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 指令解释和执行,这在一定程度上影响了其性能。更为 严重的是,为了使得程序员避免对内存的复杂申请和释放的操作,提高程序开发的效率, j a v a 虚拟机采用了垃圾收集机制对内存进行自动管理。由于垃圾收集器运行时将中断 j a v a 程序的运行,其运行时刻和垃圾搜集时间具有不确定性,在应用程序高频率分配和 释放内存时,垃圾收集要占用的时间可能比程序自身运行的时间还要多,这些都使得 j a v a 程序无法满足在实时领域应用的要求。 为了弥补传统j a v a 语言在实时性方面的不足,g r e gb o l l e l l a 等人提出了j a v a 实时规 范( r t s j t u ) ,针对其影响实时性的各个方面进行了改进。内存管理技术是r t s j 关注的主 要问题之一。不产生垃圾的代码不会导致请求式的垃圾收集;不引用堆中对象的代码可 以抢占垃圾收集器的线程l i 】。为了能够保留垃圾收集的好处又能避免垃圾收集器对实时 特性的影响,基于以上两个事实i 玎s j 扩展了j a v a 内存管理机制,在传统的堆内存的基 础上,又提出了内存区域( m e m o r ya r e a ) 的概念。内存区域是j a v a 虚拟机内存管理的单 元,它派生出了h e a pm e m o r y ,i m m o r t a lm e m o r y ,s c o p e dm e m o r y 等子类,其中h e a p m e m o r y 就是对传统堆内存的j a v a 类封装,而i m m o r t a lm e m o r y 和s c o p e dm e m o r y 是与 h e a pm e m o r y 处于同一等级的内存区域,也就是说,r t s j 使得j a v a 虚拟机由原来的一 个h e a p 内存区域变成了现在的多个内存区域。这些内存区域的继承关系如图1 1 所示。 由于只有对h e a p 内存的操作才会导致垃圾收集,因此在新增加的这几个内存区域中分 配对象不会导致垃圾收集器的执行,不会使系统受到其不可预测性的影响。 m e m o r ya r e a 、 ih e 印m e m 。 i m m o r t a lm e m o r y s c o p e dm e m o r y 图卜1m e m o r ya r e a 继承关系 f i g 1 1m e m o r ya r e ai n h e r i t a n c er e l a t i o n s 由于内存管理对j a v a 虚拟机的实时性具有非常大的影响,通过深入研究j a v a 虚拟 机的内存管理机制,改善其内存管理的实时性,对于实现j a v a 虚拟机整体的高效率、高 可靠性、高可预测性都具有很大的实际意义。 由于实时j a v a 技术所具有的优点,使它具有广泛的应用前景。具体来说有以下几个 方面。 江南大学硕十学位论文 1 传统的实时应用领域:交通导航系统、空中交通控制、虚拟现实环境和部队防御 系统等。 2 分布式的w w w 实时应用:股票市场交易系统、视频游戏和电视会议等。 3 用电子产品:i n t e m e t t v ( 电视机顶盒装置) 、p d a 、无线电话和智能卡等。 1 2 研究现状 目前国内外对实时j a v a 虚拟机已有较多的研究,对于实时内存管理器提出了许多 的改进方案,并且有了一定的实现,有些已经进入实用化的阶段,但我国在这一领域的 研究和开发工作还处于初级阶段。 国外有代表性的实时j a v a 虚拟机的实现,如t i m e s y s 的r t s j 参考实现 2 1 ,基于g c j 的j r a t e 3 1 、j u n i + + 【4 】,支持部分r t s j 的s i m p l e r t j 5 1 等,它们的实现方法基本上可以归 类为以下几种: 1 修改虚拟机内部,将实时部分和非实时部分做在同一个虚拟机中,如t i m e s y s 公 司的参考实现( 见图1 2 ) 。该实现完全符合r t s j ,可直接执行j a v a 字节码,具有较好 的可移植性。缺点:实现难度较大,实时与非实时之间的关系处理较麻烦。 r t - j a v aa p p l i c a t i o n r t 。m h o s t ( x 8 6 ,p p c ,a r m s ) 图l 2t i m e s y s 实现方案 f i g 1 - 2t i m e s y si m p l e m e n t a t i o ns c h e m e 2 将r t s j 的实现单独做个模块如j r a t e ( 见图1 3 ) 。j r a t e 依赖于g c j 1 2 1 ,g c j 的 特点是把j a v a 源代码提前编译成的本地代码,运行时,实时部分提供给j r a t e 模块处理, 非实时部分直接提供给g c j 处理。优点是j r a t e 基本上符合r t s j ,不需修改虚拟机, 把j a v a 程序编译成本地代码,运行效率高。缺点是编译成本地代码失去了动态类装载特 性,可移植性差。 图1 - 3 j r a t e 实现方案 f i g 1 - 3j r a t ei m p l e m e n t a t i o ns c h e m e 2 第一章绪论 3 j u n i + + 实现( 见图1 4 ) 。通过一个j n i 接口将j a v a 虚拟机j u i c e 与r t s j 实现模 块j r a t e 连接起来【6 1 。j a v a 应用程序被分为两个部分,字节码和本地代码,如果是字节 码则由j u i c e 通过j n i 与j r a t e 模块连接执行,如果是本地代码,则直接给j r a t e 模块执 行。优点是即保持了j r a t e 的优点,又可以执行j a v a 字节码,提高了其可移植性和动态 类装载特性。缺点是j n i 调用会有一些性能损失。 r t s j a p p l i c a t i o n b y t e c o d e n a t i v ec o d e 、b y t e c o d e j u n i + + j a v a x r e a l t i m e 煅嘶伽 b y t e c o d e - t o - n a t i v e j r a t e n a t i v e - t o - b y t e c o d e c l a s s e sj u i c e c o r e p r o x t e s 图l - 4j u n i 抖实现方案 f i g 1 4j u n i + + i m p l e m e n t a t i o ns c h e m e 此外,s i m p l e r t j 也是把j a v a 程序编译成本地代码,而且只支持m 规范和r t s j 中的少部分特性,适合于嵌入式系统。 j a v a 虚拟机内存管理的具体实现方法在很大程度上依赖于j a v a 虚拟机的实现,不 同的j a v a 虚拟机的实现对于其内存管理的性能也有一定的影响。但是其理论研究归纳起 来主要有两个方面:一是对于领域内存的分配和释放问题,要求具有可预测性和高效性 等:二是内存引用检查机制的效率问题,由于s c o p e dm e m o r y 的引入,要求在其中的对 象的引用要遵循一定的规则。目前在这些方面的研究并不完善,还有较大的改进余地。 1 3 本文研究的内容 本文的工作是在一个可运行在多种操作系统并兼容多种硬件平台的开源的j a v a 虚 拟机s a b l e v m t l 8 】的基础上,结合国内外最新的理论对其实时性进行改进,使其在内存管 理方面符合r t s j 的要求,同时又要保证j a v a 程序可移植性的要求。其具体实现方案如 图1 5 所示。 实时j a v a 应用程序包括实时部分和非实时部分,非实时部分直接由原有的兼容j 2 s e 的j a v a 类库和相应的虚拟机运行时来执行,而实时部分使用扩展的类库j a v a x r e a l t i m e 枣 和修改过的支持实时特性的虚拟机核心代码来执行。由于实验条件和研究方向的限制, 主要关注于实时内存管理机制的研究与实现,没有采用实时的操作系统,实时线程实现 得不是很完善。 3 江南大学硕十学位论文 r t - j a v a r tc l a s s a p p l i c a t i o nl i b r a r y r t ( m o d i f i e d ) s a b l e v m 1 i hm e m o r ym a n a g e m e n t 2 r t t h r e a d o s ( l i n u x ) h o s t ( x 8 6 ,p p c ,a r m s ) j 2 s e s e r v i c e s 图1 5 最终实现方案 f i g 1 - 5f i n a li m p l e m e n t a t i o ns c h e m e n o nr t s a b l e v m m o d i f i e ds a b l e v m r t ( m o d i f i e d ) s a b l e v m 本文主要包括以下内容: 1 深入研究j a v a 虚拟机s a b l e v m 的体系结构,尤其是其内存管理机制。 2 探讨实时j a v a 虚拟机及其内存管理机制的实现原理。 3 对普通的j a v a 虚拟机s a b l e v m 进行实时性改进。着重对内存管理的实时性改进, 对其他机制进行辅助性改进,最后对实时内存管理的性能进行实验,得出实验结果。 4 n 一 一 咀 一蓥i 蕊。瓣工删晨互 a 一 删姗 一耋 第二章实时系统与实时j a v a 规范 第二章实时系统与实时j a v a 2 1 实时系统 2 1 1 实时系统的概念 i e e e ( 美国电气电子工程师协会) 定义实时系统为“那些正确性不仅取决于计算的 逻辑结果,也取决于产生结果所花费的时间的系统”。简单地说,实时系统可以定义为 对外部事件及时响应的系统同,如图2 1 所示。 图2 - 1 实时系统的结构 f i g 2 - 1t h es t m c t i j r eo fr e a l - t i m es y s t e m 出 一般来说,这意味着实时嵌入式系统必须在一个可预测可保证的时间段内做出对外 部事件的反应。如果没有达到上述要求,那么系统就会做出错误的操作。 在股票报价、天气预报、交通报告等系统中都有实时操作系统的影子。按照定义, 下面的系统可以认为是实时系统: 必须在1 0 毫秒内移走机械手来避免碾压的控制系统。 必须在3 0 秒时间内关闭安全阀来防止发动机停转的控制系统。 必须在8 0 微秒时间内对通信端口中断做出响应、否则可能会丢失数据包的控制 系统。 2 1 2 实时系统的特性 实时系统有两个基本特性:实时系统必须产生正确的结果,称为逻辑或功能正确; 计算必须在预定的周期之内完成,称为时间正确。功能正确和时间正确同样重要,实时 系统只有同时保证这两点,才能保证实时系统的确定性。 在实时系统中,对检测到的事件的响应时间是有界的。响应的动作( 或多个动作) 和响应时间是事先知道的。一个确定的实时系统意味着系统的每个部件都必须具有确定 的行为,使得整个系统是确定性的。确定的实时系统很少能够适应变化的环境,缺乏适 应性可能导致系统差的鲁棒性,确定性和鲁棒性的平衡要求系统和应用必须是特定的。 江南大学硕七学位论文 2 1 3 硬实时与软实时 实时系统必须保证计算再到达死线( d e a d l i n e ) 前完成。换句话说,实时系统有时间约 束并且是死线驱动( d e a d l i n e d r i v e n ) 的。因此,根据对错过死线的容忍程度,可以把实时 系统分为硬实时系统和软实时系统这两大类【8 】: 硬实时系统( h a r dr e a l t i m es y s t e m ) 有一个刚性的、不可改变的时间限制,它不允 许任何超出死线的错误。超时错误会带来损害甚至导致系统失败、或者导致系统不能实 现它的预期目标。死线之后得到的结果是对大多数系统来说是毫无价值的。 软实时系统( s o f tr e a l t i m es y s t e m ) 的时限是一个柔性灵活的,它可以容忍偶然的 超时错误。死线可以包含可变的容忍等级、平均时间死线,甚至可以是一个响应时间的 统计分布。软实时失败造成的后果并不严重,仅仅是轻微的降低了系统的吞吐量,但是 根据应用的性质,代价会随延迟时间成比例的增加。 可以说实时代码并不一定是运行速度最快的代码。在实时系统中,可预测性比速度 更重要。因此,要避免使用那些在大多数情况下速度很快、但在某些条件下速度又会慢 下来的算法,而采用虽然慢一些但是更有可预测性的算法。 2 2 实时j a v a 2 2 1j 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 语言有许多方面的优势: 1 j a v a 代码的可移植性很好。 2 使用j a v a 语言编程通常比采用其他常见的编程语言( 如c ,c + + 等) 的工作效率 要高,尤其是其自动垃圾收集机制,避免了许多其他语言中常见的内存泄漏现象。 3 j a v a 现成的类库十分丰富,提高了代码的利用率。 4 j a v a 平台在异构分布式系统中工作得很好。 5 运行与实时系统中的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 规范很好的解决了这个问题。 6 第二章实时系统与实时j a v a 规范 2 2 2 实时j a v a 规范 实时j a v a 规范在六个方面增强了j a v a 规科9 1 : 1 增加实时线程。实时线程提供了比普通线程更完善和细致的控制属性和操作内 容,例如更大的优先级范围,控制内存分配等; 2 增加了新的工具类和编程方式,比如内存工具类。利用这些工具类,可以完成 不需要垃圾回收的j a v a 程序; 3 增加了异步事件处理器类和相应的机制。把异步事件和j v m 外界发生的事件直 接关联起来; 4 增加了异步传输的控制机制,允许一个线程更改另一个线程中的控制流。也就 是说,可以中断或者继续另一个线程的运行; 5 增加一种机制,能够控制对象分配到内存的位置; 6 增加一种机制,能够访问特定地址的内存。 r t s j 对传统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 类库完全实时化, 比如a w t ,s w i n g ,t e x t 等。而一些常用的基础类库l a n g ,u t i l ,i o 等都有实时化的实现。对于 r t s j 的核心和基础,主要有以下3 个方面: 1 领域内存s c o p em e m o r y 2 实时线程r e a l t i m et h r e a d 3 高精度时间h i g hr e s o l u t i o nt i m e 为了完成本课题,这三个方面是必须实现的,其中领域内存是重点,高精度时间是 基础,由于实时线程的实现远超出了本课题的研究范围,故仅仅进行了简单的模拟。 7 江南大学硕十学位论文 第三章实时j a v a 虚拟机及其内存管理 3 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 虚拟机系统框图见图3 1 所示。 图3 1 实时j a v a 虚拟机系统图 f i g 3 1r e a l - t i m ej v ms y s t e mb l o c kd i a g r a m 嵌入式系统是设计一套完成复杂功能的硬件和软件,并使其紧密耦合在一起的计算 机系统。嵌入式实时系统是具有实时性能的嵌入式系统。一般情况下它并不要虚拟一个 系统,而是其本身的操作系统即具有实时特性。如图3 - 2 所示。这种专门为实时而设计 的简洁专用的实时系统,往往能够实现比虚拟机更加精确的响应时间,但是在这样的系 统上开发应用,一般采用的是汇编或c 语言,开发难度较大。 图3 - 2 嵌入式实时系统图 f i g 3 - 2e m b e d d e dr e a l - t i m es y s t e mb l o c kd i a g r a m 因此实时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 虚拟机实时内存管理的机制,因此忽略了其它方面的次要矛盾。在普通的 x 8 6 硬件平台上,运行非实时的操作系统u b u n t u ( 1 i n u x 的一个发行版本) ,在其基础上, 对j a v a 虚拟机实时内存管理进行了深入的研究,并且予以实现。同时为了实验的需要, 在普通线程的基础上,模拟了一个简单的实时线程。本课题所设计的实时j a v a 虚拟机框 图如图3 3 所示。 图3 - 3r t s a b l e v m 系统图 f i g 3 - 3r ts a b l e v ms y s t e mb l o c kd i a g r a m 实时线程要达到实时,必须要有实时操作系统的支持,对于非实时系统中的“实时 线程”只能给实时内存管理提供一个编程的接口。由于只是在比较理想的环境下测量内 存管理的实时特性,非实时线程对其影响不会很大,不会对实验结果造成太大的影响。 3 2 普通j a v a 虚拟机的内存管理 实时j a v a 虚拟机内存管理是建立在普通j a v a 虚拟机内存管理的基本原理基础上的, 首先介绍一下普通j a v a 虚拟机的内存管理机制。 图3 - 4 是j a v a 虚拟机的体系结构【1 0 】。j a v a 虚拟机为每个执行的程序定义了不同的运 行时数据区,有一些数据区是在j a v a 虚拟机启动时创建而在退出时销毁。而其他一些数 据区是为每一个线程服务的,当线程创建时创建该数据区,而在线程退出时销毁。 图3 - 4j a v a 虚拟机体系结构 f i g 3 - 4j v m a r c h i t e c t u r eb l o c kd i a g r a m 9 江南大学硕士学位论文 如图3 4 ,我们可以看出j a v a 虚拟机将内存划分方法区( m e t h o da r e a ) 、堆( h e a p ) 、栈 0 a v as t a c k ) 、寄存器( r e g i s t e r ) 、本地码栈( n a t i v es t a c k ) 等几个部分。执行一个虚拟机实例 时,虚拟机需要对申请到的内存进行管理,这就涉及到一个管理策略的问题。在j a v a 虚拟机中的运行时数据区在虚拟机设计时都以某种形式实现的,但虚拟机规范对其描述 较为抽象,在运行时的数据结构细节大多数由具体的设计者决定。 下面分别介绍跟内存有关的这几个部分。 3 2 1 方法区 j a v a 虚拟机有一个被所有虚拟机线程共享的方法区【l 川( 如图3 - 5 ) ,它保存的是每一 个类的数据比如运行时常量池、字段、方法数据和代码。当虚拟机装载某个类型时,它 使用类装载器定位到相应的c l a s s 文件,然后读入这个文件( 一个线性二进制数据流) ,将 它传输到虚拟机中。紧接着虚拟机提取其中的类型信息,并将这些信息存储到方法区。 该类型中的类( 静态) 变量也是存储在方法区中。 类型信息 运行时常量池 字段信息 方法数据 类变量 类装载器 图3 。5j a v a 方法区 f i g 3 - 5j a v am e m o r ya r e a 由于所有线程都共享方法区,因此它们对方法区的数据的访问必须被设计为线程安 全的。比如,假如同时有两个线程都企图访问一个名为c l a s s l 的类,而这个类还没有被 装入虚拟机,那么,这时应该只有一个线程装载它,而另一个线程则只能等待。 方法区的大小不必是固定的,虚拟机可以根据需要动态调整。同样,方法区也不必 是连续的,方法区可以在一个堆( 甚至虚拟机自己的堆) 中自由分配。另外,虚拟机也可 以允许用户或程序员指定方法区的初始大小以及最小和最大尺寸等。 方法区也可以被垃圾收集,因为虚拟机允许通过用户定义的类装载器来动态扩展 j a v a 程序,因此一些类也会成为程序“不再引用”的类。当某个类变为不再被引用时, j a v a 虚拟机可以卸载这个类( 垃圾收集) ,从而使方法区占据的内存保持最小。 在方法区中,存储着每个类型的以下信息:类型信息、常量池、字段信息、方法信 息、类( 静态) 变量、类装载器等。 1 0 第三章实时j a v a 虚拟机及其内存管理 3 2 2j a v a 堆 j a v a 堆由所有的虚拟机线程共享,所有的类实例和数组都是从堆中分配内存【l o 】( 如 图3 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 a v a 程序的多个线程却共享着同一个堆空间,在这种情况下,就得考虑多线程 访问对象( 堆数据) 的问题。 图3 - 6j a v a 堆 f i g 3 6j a v ah e a p j a v a 虚拟机有一条在堆中分配新对象的指令,却没有释放内存的指令。虚拟机自己 负责决定如何以及何时释放不再被运行的程序引用的对象所占据的内存。通常,这个任 务虚拟机交给垃圾收集器来完成。垃圾收集器的主要工作就是自动回收不再被运行的程 序引用的对象所占用的内存。此外,它也可能去移动那些还没有使用的对象,以此减少 堆碎片。和方法区一样,堆空间也不必是连续的内存区。在程序运行时,它可以动态扩 展或收缩。事实上,方法区也可以在堆中实现。换句话说,就是当虚拟机需要为一个新 装载的类分配内存时,类型信息和实际对象可以都在同一个堆上。因此,负责回收无用 对象的垃圾收集器可能也要负责无用类的释放( 卸载) 。另外,某些实现可能也允许用户 或者程序员指定堆的初始大小、最大最小值等。 j a v a 对象中包含的基本数据由它所属的类及其所有超类声明的实例变量组成。只要 有一个对象引用,虚拟机就必须能够快速地定位对象实例的数据。另外,它也必须能够 通过该对象引用相应的类数据( 存储于方法区的类型信息) 。因此在对象中通常会有一个 指向方法区的指针。通常,堆空间以下有两种设计方法1 1 9 1 。 一种是把堆分成两个部分:句柄池和对象池。如图3 7 所示,对象引用就是指向句 柄池的指针。句柄池的每个条目有两个部分:一个指向对象实例变量的指针,一个指向方 法区类型数据的指针。这种设计的好处是有利于堆碎片的整理,当移动对象池中的对象 江南大学硕士学位论文 时,句柄部分只需要更改一下指针指向对象的新地址就可以了,也就是将在句柄池中的 对象指针替换为新地址。缺点是每次访问对象的实例变量都要经过两次指针传递。 旬柄池 堆空间 i 一一7 - - - 。 图3 7 第一种堆空间的设计方法 f i g 3 7f i r s td e s i g nm e t h o df o rh e a ps p a c e 另一种方法是使对象指针直接指向堆中一组数据,而该数据包括对象实例数据以及 指向方法区中类数据的指针,如图3 8 所示。这样设计的优缺点正好跟上一种相反,它 只需要一个指针就可以访问对象的实例数据,但是移动对象会变得更加复杂。当使用这 种堆的虚拟机为了减少内存碎片而移动对象时,它必须在整个运行时数据区中更新指向 被移动对象的引用。 堆空间 缀缀缓戮豢 缓 对象实例 鬓缓 类数据指针 貉钐彩戮荔笏缪黝 图3 - 8 第二种堆空间的设计方法 f i g 3 8s e c o n dd e s i g nm e t h o df o rh e a ps p a c e 1 2 第三章实时j a v a 虚拟机及其内存管理 3 2 3j a v a 栈 每当启动一个新线程时,j a v a 虚拟机都会为它分配一个j a v a 栈10 1 ( 如图3 9 ) 。j a v a 栈是以帧( f r a m e ) 为单位保存线程的运行状态。虚拟机只会直接对j a v a 栈执行两个操作: 以帧为单位的压栈或出栈。 j a v a 线程 。姥弭1 线程2线程3 线程4 - 栈帧栈帧栈帧 栈帧栈帧栈帧 栈帧栈帧栈帧 栈帧栈帧 本地方 f 栈帧 法调用 当前帧 本地方法栈 j a v a 栈 图3 - 9j a v a 栈 f i g 3 - 9j a v as t a c k 本地 线程 某个线程正在执行的方法被称为该线程的当前方法,当前方法使用的栈帧称为当前 帧,当前方法所属的类称为当前类,当前类的常量池称为当前常量池。在线程执行一个 方法时,它会跟踪当前类和当前常量池。此外,当虚拟机遇到栈内操作指令时,它对当 前帧内数据执行操作。 每当线程调用一个j a v a 方法时,虚拟机都会在该线程的j a v a 栈中压入一个新帧。 而这个新帧自然就成为了当前帧。在执行方法时,它使用这个帧来存储参数、局部变量、 中间运算结果等数据。 j a v a 方法可以以两种方式完成。一种通过r e t u r n 返回的,称为正常返回;一种通过抛 出异常而异常终止。不管以哪种方式返回,虚拟机都会将当前帧弹出j a v a 栈然后释放掉, 这样上一个方法的帧就成为当前帧。 j a v a 栈上的所有数据都是此线程私有的。任何线程都不能访问另一个线程的栈数 据。 栈帧由三个部分组成:局部变量区、操作数栈和帧数据区。局部变量区和操作数栈 的大小要视对应的方法而定,它们是按字长计算的。编译器在编译时就确定了这些值并 放在c l a s s 文件中。而帧数据区的大小依赖于具体的实现。 当虚拟机调用一个j a v a 方法时,它从对应类的类型信息中得到此方法的局部变量和 操作数栈的大小,并据此分配栈帧内存,然后压入j a v a 栈中。 1 3 江南大学硕十学位论文 3 2 1 寄存器 对于一个运行中的j a v a 程序而言,其中的每一个程序都有它自己的p c ( 程序计数器) 寄存器,它是在该线程启动时创建的。p c 寄存器的大小是一个字长,因此它既能够有 一个本地指针,也能够持有一个返回地址( r e t u r na d d r e s s ) 。当线程执行某个j a v a 方法 时,p c 寄存器的内容总是下一条将执行的地址。这里的地址可以是一个本地指针,也 可以是方法字节码中相对于该方法起始指令的偏移量。如果该线程正在执行一个本地方 法,那么此时p c 寄存器的值是“未定义的( u n d e f i n e d ) ”。 3 2 1 本地方法栈 任何本地方法接口都会使用某种本地方法栈。当线程调用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

温馨提示

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

评论

0/150

提交评论