




已阅读5页,还剩73页未读, 继续免费阅读
(计算机系统结构专业论文)嵌入式java虚拟机的研究与实现.pdf.pdf 免费下载
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
华东师范大学硕士学位论文嵌入式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 虚拟机:b l a c k d o w n 和k v m ,描述了它 们的应用范围和部署方法。 本文用了大量的篇幅阐述了在j a v a 虚拟机小型化方面做出的努力,根据j a v a 虚拟机规范设计并实现了一个通用的嵌入式j a v a 虚拟机e m j v m ,并提出了 一系列针对嵌入式系统进一步优化的方案。 本文最后介绍了e m j v m 的一个应用实例d v 7 1 0j a v a 运行环境及模拟 器,展现了j a v a 语言在嵌入式系统开发上的优越性。 与成熟的j a v a 虚拟机相比,尽管e m j v m 在性能上稍许逊色,但它占用的系 统资源更少,因此更加适合资源紧张的嵌入式系统应用。 现阶段的工作成果为今后的实际应用傲了很好的铺垫,并且本论文所采用的 研究方法对于其它平台上的应用也具有指导意义。 关键词:嵌入式系统,j a v a ,j a v a 虚拟机,a r m ,d v 7 1 0 v 华东师范大学硕士学位论文嵌入式j a v a 虚拟机的研究与实现 a b s t r a c t i nr e x e n ty e a r s ,t h ea p p l i c a t i o no fe m b e d d e ds y s t c m si sg e t t i n gw i d e r m o r ea n d m o r ep e o p l ej o i ni nd e v e l o p e r so fe m b c d d e ds y s t e m s 。f o r m e re m b e d d e ds y s t e m s c o u l do n l ya ma p p l i c a t i o n sd e s i g n e df o rt h e m ,a n dp r o g r a m m e r sh a dt od e s i g n d i f f e r e n ts o f t w a r ef o rd i f f e r e n th a r d w a r ep l a t f o r m a l t h o u g ht h ei n v e n t i o no fj a v a p r o g r a m m i n gl a n g u a g ep r o v i d eaw a yt os o l v et h i sp r o b l e m ,t h ej a v av i r t u a lm a c h i n e t os u p p o r tj a v aa p p l i c a t i o n so f t e nr e q u i r em a n yr e s o u r c e sf r o mh a r d w a r ep l a t f o r m s t h i st h e s i si n t r o d u c e st h ej v m s p e c i f i c a t i o n , a n de x p l a i n st h ek e yp o i n t so ft h e i m p l e m e n t a t i o no faj v mf i r s t i tt h e ni n t r o d u c e st w ow i d e l yu s e dj v l - b l a c k d o w n a n dk v m ,a n dd e s c r i b e st h e i r a p p l i c a t i o nr a n g e sa n dd e p l o y m e n tm e t h o d s t h i st h e s i su s e dm a n yp a g e st od e s c r i b et h ee f f o r tt om i n i a t u r i z ej v m s o nt h e b a s i so fu n d e r s t a n d i n gt h ej v m s p e c i f i c a t i o n , t h ea u t h o ro ft h i st h e s i s & s i g n e da n d i m p l e m e n t e d ag e n e r a l p u r p o s ej v m :e m j v m ,a n di n t r o d u c e d as e r i e so f o p t i m i z a t i o no fe m j v mf o re m b e d d e ds y s t e m s t h i st h e s i sa l s oi n t r o d u c e da l l a p p l i c a t i o n o fe m v m :aj a v am n t i m e e n v i r o n m e n to nd v 7 1 0a n di t ss i m u l a t o ro np c t h i sp r o j e c ts h o w st h ea d v a n t a g eo f d e v e l o p m e n tf o re m b e d d e ds y s t e mb yj a v a c o m p a r e dw i t ho t h e rw i d e l yu s e dj v i v s ,a l t h o u g he m j v mi sn o tv e r yg o o di n p e r f o r m a n c e ,e m j v mo c c u p i e sl e s ss y s t e mr e s o u r c e s s oe m j v mi sm o r es u i t a b l e f o re m b e d d e ds y s t e m sw h i c ha r el a c ko fr e s o u r c e s t h ew o r kd o n ea tt h i ss t a g ei sag o o dp r e p a r a t i o nf o rt h ef u t u r ep r a c t i c a l a p p l i c a t i o n ,a n dt h em o d h o d su s e di nt h i st h e s i sa r ei n s t r u c t i v ef o r t h ea p p l i c a t i o n sf i n o t h e rp l a t f o r m sa sw e l l k e yw o r d :e m b e d d e ds y s t e m ,j a v a , j v m ,a r m ,d v t l 0 v l 学位论文独创性声明 本人所呈交的学位论文是我在导师的指导下进行的研究工作及 取得的研究成果据我所知,除文中已经注明引用的内容外,本论文 不包含其他个人已经发表或撰写过的研究成果对本文的研究做出重 要贡献的个人和集体,均已在文中作了明确说明并表示谢意 作者签名:跫:丝垒日期:之= z ! ! :芝 学位论文授权使用声明 本人完全了解华东师范大学有关保留、使用学位论文的规定,学 校有权保留学位论文并向国家主管部门或其指定机构送交论文的电 子版和纸质版有权将学位论文用于非赢利目的的少量复制并允许论 文进入学校图书馆被查阅有权将学位论文的内容编入有关数据库进 行检索有权将学位论文的标题和摘要汇编出版保密的学位论文在 解密后适用本规定 学位论文作者签名:际商畴 日期: 1 1 1 华东师范大学硕士学位论文 嵌入式j a v a 虚拟机的研究与实现 1 1 课题背景 第1 章绪论 j a v a ,是一种可以编写跨平台应用软件的面向对象的程序设计语言,由s u n 公司的j a m e sg o s l i n g 等人于1 9 9 0 年代初开发。它最初被命名为o a k ,作为一种 小家用电器的编程语言,来解决诸如电视机、电话、闹钟、烤面包机等家用电器 的控制和通讯问题。由于这些智能化家电的市场需求没有预期的高,s u n 放弃了 该项计划。就在o a k 几近天折之时,随着i n t c r n e t 的发展,s u n 看到了o a k 在计 算机网络上的广阔应用前景,于是改造了o a k ,在1 9 9 5 年5 月以”j a v a ”的名称正 式发布了。j a v a 伴随着i n t e r n e t 的迅猛发展而发展,逐渐成为重要的i n t e r n e t 编 程语言。此时j a v a 的跨平台特性显得尤为珍贵,因为它能够屏蔽网络异质性, 为i n t c r n c t 上不同计算机提供一致的运行环境与交互平台,在很大程度上简化了 应用程序的开发与部署。 j a v a 编程语言的风格十分接近c + + 语言。j a v a 继承了c + + 语言面向对象技 术的核心,舍弃了c + + 语言中的指针( 以引用取代) 、运算符重载、多重继承( 以 接口取代) 等成分,增加了自动垃圾收集功能用于回收不再被引用的对象所占据 的内存空间。 j a v a 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将 源代码编译成字节码,然后依赖各种不同平台上的虚拟机来解释执行字节码,从 而实现了“一次编译、到处执行”的跨平台特性,尽管这在一定程度上降低了 j a v a 程序的运行效率。 j a v a 虚拟机( j v m ) 是一个由软件实现的抽象的计算机硬件平台,它对下 屏蔽了硬件的异质和操作系统的异质,对上提供了统一的运行环境。j a v a 编译器 生成的目标代码可以直接在j v m 上运行,无需考虑实际运行的硬件与操作系统 环境。 嵌入式计算机由于不同的应用需求往往差别较大,传统的应用程序在不同 平台间移植有很大难度。j a v a 正好能够解决这个问题,只要每个平台上都有相应 的j v m 在运行,j a v a 应用程序便可直接部属于这些平台上而无需重新编译。 在嵌入式系统上支持j a v a 还有另一个好处,就是方便了固件的开发。传统 固件由汇编语言或者c 语言编写,开发与调试都受到限制。嵌入式系统上的固 件必须根据所采用的微控制器类型及附带的外设被特别设计,并由特殊的编译器 华东师范大学硕士学位论文 嵌入式j a v a 虚拟机的研究与实现 进行编译。而调试时往往只能通过一些表征来诊断程序错误,费时费力且对开发 人员的专业技能要求较高。虽然近年来出现的新型微控制器都对i c e 提供了很 好的支持,但这无疑增加了成本且限制了器件的选择。另一方面,如果由于各种 原因需要更换微控制器,那么整个固件的开发很有可能需要推倒重来。采用j a v a 就不同了,由于m 提供了j a v a 应用程序的跨平台性,因此用j a v a 开发的固件 可以只做少量改动甚至不改动( 也无需重新编译) 便可运行在任何有j v m 支持 的嵌入式系统上,大大简化了开发;同时在p c 机上也可以部属为目标系统定制 的j v m ,以提供对目标机的仿真,因此整个固件的开发可以完全在p c 机上进行, 调试也可以通过模拟器,最终再把调试完成的固件下载到目标系统上即可工作。 于是在嵌入式系统发展日新月异的今天,研究嵌入式j v m 有很重要的意义。 1 2 国内外研究现状 目前国外成熟的j v m 有很多,无论是商品化的还是开源的。传统的j v m ( 如 当今流行的s u n 的h o t s p o t 虚拟机) 都被设计为运行在较高等级的硬件平台( 如 服务器) 上,它们功能强大,实现了j v m 规范的所有特性。能够运行在嵌入式 系统上的j v m 是近几年才出现的,这些j v m 一般都只实现了j v m 规范的一个 子集,使用裁减了的j a v a 运行库( 如j a v a m e ) ,但占用的系统资源也较少。 就开源j v m 而言,大多数项目都处于起步阶段,有些不够成熟稳定,有些 运行效率不高。 最近s u n 发布了k v m ,这是一种专门部属在嵌入式系统上的微型j v m , 是j 2 m ec l d c 的参考实现。由于k v m 的源码公开,因此我们可以将其移植到 自己的系统中。 国内对j v m 的研究不多,一般都只针对特定的应用开发专用的j v m ,没有 成熟的通用j v m 。在高端应用与支持多处理器的j v m 方面,国内基本是空白。 在嵌入式j v m 方面,清华大学、上海交大及个别企业有自己的方案,但也都是 专用方案( 如针对数字电视的方案) 。 1 3 研究目的与意义 尽管目前已经有很多针对嵌入式系统的j v m ,但成熟稳定且开源的版本屈 指可数。本论文的目标是在理解j a v a 语言机制的基础上,就j a v a 虚拟机的工作 原理展开研究,简单介绍嵌入式j v m 的移植,并针对嵌入式平台的特点设计实 现有一定通用性的j v m 。 另外,虽然现有的嵌入式系统j v m 对系统资源的占用量比普通j v m 要小 2 华东师范大学硕士学位论文 嵌入式j a v a 虚拟机的研究与实现 很多,但是仍然比较可观,比如s u n 的k v m 需要至少1 9 2 k b 的r a m 空间才能 运行。而目前大多数m c u 片内r a m 都不会超过9 6 k b ,因此研究如何进一步 降低j v m 对系统资源占用量( 主要是r a m 空间) 的问题仍然有着重要的意义。 本文提出的e m j v m 将把降低r a m 占用作为重要的设计指标和优化方向。 1 4 本文主要内容与结构 第2 章根据s u n 发布的j a v a 语言规范及j v m 规范阐述了j v m 模型架构, 并介绍了两款常用的嵌入式j v m 。 第3 章根据j v m 规范设计并实现一款简单灵活的j v m e m j v l 订。 第4 章介绍了e m j v m 针对嵌入式系统的进一步优化方案及评估。 第5 章介绍了e m j v m 的移植,以及e m j v m 的一个应用实例用于 d v 7 1 0 评估板( 基于s t r 7 1 0 f 微控制器) 的j a v a 运行环境,并搭配运行于 w i n d o w s 系统( x 8 6 平台) 上的模拟器。 第6 章对本文工作进行总结,并简单介绍了以后可能的发展计划。 3 华东师范大学硕士学位论文 嵌入式j a v a 虚拟机的研究与实现 2 1 总体结构 第2 章j v m 模型分析 一台最基本的j a v a 虚拟机包含了:控制中心、( 引导) 类装载器、指令执行 部件、方法区、常数池、运行栈和堆等几个部分。 通常j v m 都支持j a v a 的多线程机制,此时j v m 需要维护一个线程池,其 中每个线程都会维持自己的上下文( 运行状态) 和运行栈。另外如果在单任务操 作系统下或者没有操作系统,j v m 还需要有线程调度器的支持。 整个j v m 总体结构如下图所示: 图2 - 1j 、,m 总体结构 s u n 的j v m 规范定义了一台抽象的机器,它不包含具体j v m ( 包括s u n 自 己的j v m ) 的任何特定实现。要正确地实现j v m ,只需读撞j a v ac l a s s 文件格式, 并诈确地执行c l a s s 文件中指定的操作便可。不属于j v m 规范的实现细节会不必 4 华东师范大学硕士学位论文 嵌入式j a v a 虚拟机的研究与实现 要地约束实现者的创造力,提供这些细节只是为了使阐述更清楚。例如,运行时 数据区的存储器布局、使用的垃圾收集算法,以及对字节码的任何优化( 例如把 它们翻译成机器指令码) 等,都留给实现者去决定i 。 2 2 数据类型和值 像j a v a 语言一样,j v m 的数据类型包括两类:基本类型( p r i m i t i v et y p e s ) 和引用类型( r e f e r e n c et y p e s ) 。相应地,也有两类值可以存储在变量中、作为参 数传递、被方法返回并对其进行操作:基本值( p r i m i t i v ev a l u e s ) 和引用值 ( r e f e r e n c ev a l u e s ) 。 j v m 希望几乎所有的类型检查在编译期间完成而非j v m 自己来进行,因此 j v m 往往不需要给数据标记类型或进行检查。然而。j v m 的指令集使用操作于 特定数据类型的指令来区分它们的操作数类型。例如i a d d 、l a d d 、f a d d 和d a d d 都是对两个数值相加的j v m 指令,但是它们分别要求操作数的类型为i n t 、l o n g 、 f l o a t 和d o u b l e 。 j v m 包含对对象的显式支持。对象( o b j e c t ) 是一个动态分配的类实例 ( i n s t a n c e ) ,或者是一个数组( a r r a y ) 。对象的引用被认为具有j v m 中的引用类 型,引用类型可以看成是指向对象的指针或者是句柄。尽管j v m 对对象进行操 作,但j v m 从不对对象进行直接寻址,对对象的操作、传递和检查总是通过引 用类型的值进行。 下图显示了j v m 所支持的主要数据类型: 图2 - 2 - j 、,m 主要数据类型 5 眦姗 洫 呱嘶 脚 广卜丰匕t 卜镕广i - l k 瑚 型 型 型 型 蚺 类 类 鳇 类 类 w 值 镑 组 口 一 一 一 广+l乇 勤 孙 一 峄 别 华东帅范大学硕士学位论文嵌入式j a v a 虚拟机的研究与实现 2 2 1 基本类型和值 j a v a 虚拟机支持的基本数据类型有:数值类型( n u m e r i ct y p e s ) 、布尔类型 ( b o o l e a nt y p e s ) 和返回地址类型( r e t u r n a d d r e s st y p e s ) 。其中数值类型包括整型 ( i n t e g r a lt y p e s ) 和浮点型( f l o a t i n g - p o i n tt y p e s ) 。 2 2 1 1整数类型和值 整型包括: b y t e :8 位有符号二进制整数,其值域为【- 1 2 8 ,+ 1 2 7 ,e p 一2 7 ,2 7 - 1 】; s h o r t :1 6 位有符号二迸制整数,其值域为【一3 2 7 6 8 ,+ 3 2 7 6 7 】, 即卜矿,2 1 5 1 1 ; i n t :3 2 位有符号二进制整数,其值域为【- 2 1 4 7 4 8 3 6 4 8 ,+ 2 1 4 7 4 8 3 6 4 7 , e p 2 3 1 ,2 3 1 1 】; l o n g :6 4 位有符号二迸制整数,其值域为【9 2 2 3 3 7 2 0 3 6 8 5 4 7 7 5 8 0 8 , + 9 2 2 3 3 7 2 0 3 6 8 5 4 7 7 5 8 0 7 ,即【2 6 3 ,矿1 】; c h a r :表示u n i c o d e 的1 6 位无符号整数,其值域为r u 0 0 0 0 ,、u 自旺】; 用于数值表达式时,、u f f f f 表示6 5 5 3 5 而不是1 。 2 2 1 2浮点类型和值 浮点型包括: f l o a t :3 2 位i e e e 7 5 4 浮点数; d o u b l e :6 4 位i e e e7 5 4 浮点数。 j v m 的浮点型与j a v a 语言中的浮点型相对。根据i e e e7 5 4 标准【羽,浮点型 的值不仅包含正负有限非零数值,还包括正负零( o ) 、正负无穷( o o ) 和特 殊的n a n ( n o t a n u m b e r ) 值。 f l o a t 类型所能表示的正有限非零值范围从1 4 0 1 2 9 8 4 6 4 3 2 4 8 1 7 0 7 e 4 5 到 3 4 0 2 8 2 3 4 6 6 3 8 5 2 8 8 6 0 e + 3 8 ,d o u b l e 类型所能表示的正有限非零值范围从 4 9 4 0 6 5 6 4 5 8 4 1 2 4 6 5 4 4 e 3 2 4 到1 7 9 7 6 9 3 1 3 4 8 6 2 3 1 5 7 1 e + 3 0 8 。 浮点正零和浮点负零的比较是相等的,但是有些操作还是能够区分它们。 例如“+ 1 0 ,+ 0 0 ”结果为正无穷,而“+ 1 0 0 0 ”结果为负无穷。 除了n a n 外,浮点值都是有序的( o r d e r e d ) ,从小到大排列为:负无穷、 负有限非零值、正负零,正有限非零值和正无穷。n a n 是无序的( u n o r d e r e d ) , 6 华东师范大学硕士学位论文 嵌入式j a v a 虚拟机的研究与实现 因此如果数值比较的任意一个或两个操作数是n a n ,比较的结果都为f a l s e 。特 别地,设x 为任意浮点值( 包括n a n ) ,则“x = = n a n ”结果为f a l s e ,而“x ! = n a n ”结果为t r u e 。 另外,i e e e7 5 4 规范中定义了许多不同的n a n 值,但是没有规定在哪种情 况下应该产生哪种n a n 值。因此为了避免可移植性问题,j v m 把这些不同的 n a n 值合并成单个的概念n a n 值。 2 2 1 3布尔类型和值 在j a v a 语言中,布尔类型用于表示真值t r u e 和f a l s e 。尽管j v m 中也定义 了布尔类型,但j v m 只提供了非常有限的支持。j v m 中没有用于操作布尔类型 的指令,编译器将操作b o o l e a n 类型的j a v a 表达式编译为使用i n t 类型的操作。 j v m 也不直接支持b o o l e a n 数组,它使用访问b y t e 数组的指令来访问b o o l e a n 数组。 j v m 内部使用整型值1 来表示t r u e ,用0 表示f a l s e 。 2 2 1 4r e t u r n a d d r e s s 类型和值 r e t u r n a d d r e s s 类型的值是指向j v m 指令操作码的指针,j a v a 语言中没有任 何类型与之对应。 j v m 中的少数几条指令用到该类型,用于实现方法内的局部予程序。但该 类型完全是j v m 内部使用,j a v a 应用程序既无法生成也无法改变r e t u r n a d d r e s s 类型变量的值。 2 2 2 引用类型和值 j v m 中有三种r e f e r e n c e 类型:类类型、数组类型和接口类型。对应的值分 别是对动态创建的类实例的引用、对数组的引用,或者对实现了接口的类实例或 数组的引用。另外,引用类型的值也可以是空,表示不引用任何对象,记作n u l l 。 n u l l 本身没有运行时类型,但可以被转换为任何类型。 j v m 规范并没有规定n u l l 的内部编码,实现者可以自行定义( 通常为二进 制全0 值或全1 值) 。 7 华东师范大学硕士学位论文嵌入式j a v a 虚拟机的研究与实现 2 2 3 基本存储单位“字” 尽管j v m 规范规定了每种数据类型的值域,但并没有规定j v m 实现中保 存每种数据类型的值都需要多大的存储空间。 j v m 规范中定义了一个抽象的存储单位“字”并且规定:一个字大小的存 储单元必须能够容纳一个b y t e 、c h a r 、s h o r t 、i n t ( 包括b o o l e a n ) 、f l o a t 、r e f e r e n c e 或r e t u r n a d d r e s s 类型的值,而两个字大小的存储单元必须能够容纳一个更大值 域类型l o n g 和d o u b l e 的值。j v m 运行时数据区全部以抽象的字为单位进行定义。 一个字的大小通常是主机平台上一个机器字的大小。显然,对于目前常见 的3 2 位平台,一个字的大小可以定义为3 2 位。但对于1 6 位主机,将字大小定 义为1 6 位就显得不足了,因为一个字的存储空间无法容纳i n t 类型和f l o a t 类型 的值。而对于6 4 位主机,当然可以将字大小定义为6 4 位,但如果此时j v m 不 采取特别的设计,很有可能会浪费一半的存储空间。 2 3 运行时数据区 j v m 定义了几个数据区用于保存j a v a 程序运行时的相关数据结构。其中一 些数据区为全局所有,在j v m 启动时便建立,在整个j v m 运行过程中都将存在, 直到j v m 运行完毕退出时才删除;另一些数据区是与j v m 线程一一对应的,在 启动新线程时动态建立,在线程退出时动态删除。 2 3 1 线程上下文 每个j v m 线程都有它自己的上下文,这是一组寄存器,记录了线程当前的 运行状态,包括当前方法、p c 寄存器等。 除了p c 寄存器外,线程上下文中的其它内容在j v m 规范中均未严格定义。 j v m 的具体实现可以在当前栈帧中存储当前类和当前方法。 2 3 1 1当前方法 当前方法即线程正在执行的方法。j v m 必须记住每个线程正在执行哪个方 法,以便调度器在多个线程间切换。 8 华东师范大学硕士学位论文嵌入式j a v a 虚拟机的研究与实现 2 3 1 2 p c 寄存器 p c 寄存器用于标识所属线程正在执行的虚拟机指令。 如果该线程的当前方法不是本地方法,则p c 寄存器包含了正在执行的虚拟 机指令地址;如果当前方法是本地方法,则p c 寄存器的值没有定义。 j v m 的p c 寄存器占一个字宽,这个宽度保证可以持有一个r e t u m a d d r e s s 值或者一个硬件平台的指针。 2 3 2 运行栈 每个j v m 线程都有一个私有的、与线程同时创建的运行栈,用于存储栈帧 ( s t a c kf r a m e ) 。运行栈类似于传统语言,例如c 语言的栈:它保存了程序局部 变量、中间运算结果,并参与方法的调用与返回。 与其它传统语言不同,j v m 运行栈仅仅需要支持压入和弹出栈帧的操作, 此外没有任何操作可以直接访衄栈。因此j v m 运行栈不需要是连续的,可以是 从堆中分配的、由栈帧的链表组成的数据结构,例如下图所示; 空 图2 - 3 动态分配于堆中的非连续运行栈结构 j v m 规范允许运行栈的大小是固定的或者是可动态变化的。 如果运行栈是固定大小的,则每个运行栈的大小应该可以在建立线程时由 建立者指定,即j v m 应该向程序员和用户提供一个设置运行栈大小的接口。 如果j v m 支持运行栈动态扩展或收缩,则应该提供指定栈大小的最大值和 最小值的方法。限制栈大小的最大值是为了限制过度的存储器占用,并保护存储 器空间不会闪为无穷的递归调用带来的栈增长所耗尽。 以下两种运行时异常与运行栈的大小相关: 如果线程运行时对运行栈的使用超过了指定的栈大小( 对于固定大小的 9 华东师范大学硕士学位论文嵌入式j a v a 虚拟机的研究与实现 栈) ,或者栈所被允许扩展的最大大小( 对于可动态改变大小的栈) ,则 j v m 抛出s t a c k o v e r f l o w e r r o r 异常; 对于大小动态变化的栈,如果需要扩展栈却没有足够的存储器空间来实 现这一扩展,或者在建立新线程时没有足够的存储器空间来为其建立新 的运行栈时,j v m 会抛出o u t o t m e m o r y e r r o r 异常。 2 3 3 堆 堆( h e a p ) 是全局数据区,为所有线程所共享。整个j v m 运行期间所产生 的任何类的实例以及数组均由从堆中分配的空间来保存。 堆在虚拟机启动时便建立。堆中被各种对象占用的空间由自动存储器管理 系统( a u t o m a t i cs t o r a g em a n a g e m e n ts y s t e m ) 即垃圾收集器( g a r b a g ec o l l e c t o r ) 回收,因此对象从不需要在程序中显式地释放。j v m 规范并没有规定使用何种 自动存储器管理系统,j v m 的实现者可以根据具体的系统要求自行选择使用何 种存储管理技术。 j v m 堆可以是固定大小的,也可以根据堆分配需要扩展,或者在不再需要 那么大的堆空间时收缩。与运行栈类似,堆空间不需要是连续的。 j v m 实现可以向程序员和用户提供控制堆初始大小的接口;对于可动态改 变大小的堆实现,可以提供控制堆大小的最大值和最小值的接口。 以下运行时异常与堆大小有关: 如果j v m 运行时对堆的分配请求超过了自动存储器管理系统所能提供 的最大堆空间,则会抛出o u t o f m e m o r y e r r o r 异常。 2 3 4 方法区 方法区( m e t h o da r e a ) 是全局数据区,为所有线程所共享。方法区类似于 传统语言程序编译后的代码存储区,相当于通常编译器生成的“t e x t ”段。它存 储与类关联的各种数据结构,例如常数池、域和方法的定义等。 方法区在j v m 启动时创建。j v m 规范没有规定方法区的位置与管理策略, j v m 的具体实现可以将方法区建立在堆中以动态管理,也可以将方法区单独建 立。方法区的大小可以是固定的,也可以根据需要扩展或收缩。同样,方法区的 空间也不需要是连续的。 以下运行时异常与方法区有关: 如果j v m 运行时对方法区的分配请求超过了系统所能提供的最大能 力,则会抛出o u t o f m e m o r y e r r o r 异常。 1 0 华东师范人学硕士学位论文嵌入式j a v a 虚拟机的研究与实现 2 3 5 常数池 常数池( c o n s t a n tp 0 0 1 ) 是每个类或接口的c l a s s 文件中c o n s t a n t 表的pool 运行时表示,其功能类似于传统语言程序的符号表和常数段“r d a t a ”。它包含了 几种常数类型,有程序中的常数、字符串、对方法和域的引用等等。其中一些常 数在编译期间便确定了,建立常数池时只需简单地从c l a s s 文件中拷贝;另一些 常数( 如各种引用) 需要在运行时才能确定,因此要在装载类的时候进行解析方 能生成该常数的运行时表示。 常数池一般都从方法区中分配。类和接口的常数池在该类或接口的c l a s s 文 件被j v m 成功装载时建立。 以下运行时异常与常数池有关: 如果j v m 建立常数池时对方法区的分配请求超过了系统所能提供的最 大能力,则会抛出o u t o f m e m o r y e r r o r 异常。 另外,在常数解析的过程中也可能抛出其它类型的异常。 2 3 6 本地方法栈 j v m 线程除了使用j a v a 的运行栈外,还可以使用本地方法栈来支持本地方 法。本地方法栈是传统的栈实现,依赖于所用的硬件平台,也叫做“c 运行栈”。 本地方法栈也可用于支持j v m 本身的运行。对于既不支持本地方法也不依赖传 统栈运行的j v m 实现可以不建立本地方法栈;否则,j v m 通常在每个线程建立 时单独为其分配本地方法栈。 本地方法栈的大小可以是固定的,也可以根据需要扩展或收缩。根据传统 栈的实现,本地方法栈通常需要连续的存储空间。 以下运行时异常与本地方法栈有关: 如果线程运行时对本地方法栈的使用超过了指定的栈大小( 对于固定大 小的栈) ,或者栈所被允许扩展的最大大小( 对于可动态改变大小的栈) , 则j v m 抛出s t a c k o v e r f l o w e r r o r 异常; 对于大小动态变化的栈,如果需要扩展栈却没有足够的存储器空间来实 现这一扩展,或者在建立新线程时没有足够的存储器空间来为其建立新 的本地方法栈时,j v m 会抛出o u t o f m e m o r y e r r o r 异常。 值得注意的是,j v m 的具体实现可能不会去检测本地方法栈是否溢出,此 时j v m 不会抛出s t a c k o v e r f l o w e r r o r 异常,但本地方法的设计者需要小心避免 该栈的溢出,以免导致整个j v m 的崩溃。 1 1 华东师范人学硕士学位论文 嵌入式j a v a 虚拟机的研究与实现 2 4 运行栈帧 栈帧( s t a c kf r a m e ) 保存了程序局部变量、中间运算结果,并参与方法的调 用与返回以及发生异常时进行回溯。 每次一个j a v a 方法被调用时,j v l v l 都会在当前线程运行栈的栈顶建立一个 新的栈帧;当该方法结束运行时,无论是正常结束还是非正常结束( 抛出一个未 捕获的异常) ,框架均被删除。每个栈帧都有一个局部变量集和一个操作数栈, 同时也包括一个对当前方法所在的类及其常数池的引用。 局部变量集和操作数栈的大小在j a v a 程序编译期间就确定了,因此一个栈 帧的具体大小仅仅取决于j v m 的实现。 在任何时刻,一个线程中只有一个栈帧是活跃的,即正在执行的方法对应 的栈帧。该栈帧被称为当前栈帧( c u r r e n tf r a m e ) ,该方法被称为当前方法( c u r r e n t m e t h o d ) ,而该方法所属的类被称为当前类( c u r r e n tc l a s s ) 。对局部变量和操作数 栈的任何操作一般都是针对当前帧的。 如果当前方法调用了另一个方法或者结束运行,它对应的栈帧就不再是当 前帧了。如果是调用另一个方法,那么随之新建立的栈帧将成为当前帧;如果是 当前方法结束运行,那么当前帧被删除,返回后上一级栈帧将成为新的当前帧。 最后,栈帧是一个线程私有的数据结构,无法被其它线程访问。 2 4 1 局部变量 每个栈帧都包含有用于存放局部变量的数组,其大小在编译期间确定。该 数组的元素为字,即每个局部变量都是一个字大小,因此l o n g 和d o u b l e 类型的 值要占用两命局部变量,其它类型的值则占用一个。 局部变量通过从0 开始的整数索引值寻址,最大的索引值为局部变量的个 数减1 。 l o n g 和d o u b l e 类型的值占用相邻的两个索引值i 和i + 1 ,并且该值只能通过 较小的索引值i 来寻址,此时引用局部变量i + 1 是无意义的。这里j v m 并不要 求j 为偶数,所以对于6 4 位的j v m 实现,不能保证l o n g 和d o u b l e 类型的局部 变量值是按6 4 位的存储器边界对齐的,j v m 实现者需要自行决定该如何解决这 个问题。 另外在方法调用时,j v m 通过局部变量来传递参数。对于类方法( c l a s s m e t h o d ) ,j v m 将在方法调用时将参数按顺序存放在从索引值0 开始的连续的局 部变量中;对于实例方法( i n s t a n c em e t h o d ) ,参数是从索引值1 开始存放的,而 华东师范大学硕士学位论文嵌入式j a v a 虚拟机的研究与实现 索引值为0 的局部变量则存放了被调用方法的对象的指针( 即j a v a 语言中的t h i s 指针) 。 2 4 2 操作数栈 每个栈帧都包含一个后进先出( l i f o ) 结构的操作数栈,该栈的最大深度 在编译期间确定。 在栈帧建立时,其操作数栈是空的。有些i v m 指令可以向操作数栈压入常 数,或者将局部变量或域中的值压入操作数栈。而另一些j v m 指令则先从栈中 弹出操作数,对它们进行操作,再将结果压回栈中。操作数栈也被用于向被调用 的方法传递参数并接收其返回结果。 例如i a d d 指令的功能是将两个i n t 类型的值相加,它要求操作数是被之前的 指令压入栈顶的两个i n t 值。i a d d 执行时,先弹出栈顶的两个操作数,将其相加, 再将两数之和压回栈顶,这个结果又会被后续的指令作为操作数。 由于后进先出的栈结构,编译器很容易按后缀表达式( 又称波兰表达式或 华沙表达式) 的顺序来安排j v m 指令以完成对j a v a 表达式的计算。 操作数栈的每一项都是一个字大小,l o n g 和d o u b l e 类型的值被作为两个字 压入操作数栈。与局部变量类似,不能保证操作数栈中的l o n g 值和d o u b l e 值是 按6 4 位的存储器边界对齐的。 操作数栈中的值必须用与它们的类型相称的方法进行操作。例如,压入两 个f l o a t 值后将其当成一个l o n g 值进行操作,或者用i a d d 指令将它们相加都是不 合适的。 2 5c l a s s 文件结构 每个c l a s s 文件都描述了一个j a v a 类或接口,由j a v a 编译器生成,j v m 要 求能够读懂c l a s s 文件。 c l a s s 文件是由一个8 位字节流组成的,所有的1 6 位、3 2 位和6 4 位数据分 别由2 个、4 个或8 个连续的字节组成。多字节数据总是按照大端( b i g - e n d i a n ) 顺序存放,即高位字节在前。 本节定义的c l a s s 文件中的数据结构,用类型u 1 、u 2 和u 4 分别表示无符号 的1 、2 或4 字节数据。 c l a s s 文件格式用类似c 语言结构体的伪结构记号表示,每一项之间不允许 插入任何填充字段,即没有任何数据对齐存在。 1 3 华东师范人学硕士学位论文 嵌入式j a v a 虚拟机的研究与实现 2 5 1c l a s s f i l e 结构 c l a s s 文件可由一个c l a s s f i l e 结构表示: c l a s s f i l e u 4m a g i c ; u 2m i n o r _ v e r s i o n ; u 2m a j o r _ v e r s i o n ; u 2c o n s t a n t _ p o o l _ c o u n t ; c p _ i n f oc o n s t a n t _ i x x f l c o n s t a n t _ l x o l _ c o u n t 一1 】; u 2a c c e s s _ f l a g s ; u 2t h i s _ c l a s s ; u 2s u p e r _ c l a s s ; u 2i n t e r f a c e s _ c o u n t ; u 2i n t e r f a c e s i n t e r f ;i c e s _ c o u n t ; u 2f i e l d s _ c o u n t ; f i e l d _ i n f of i e l d s f i e l d s _ c o u n t ; u 2m e t h o d s _ c o u n t ; m e t h o d _ i n f om e t h o d s m e t h o d s _ c o u n t ; u 2a t t r i b u t e s _ c o u n t ; a t t r i b u t ei n f oa t t r i b u t e s a t t r i b u t e s _ c o u n t ; ) ; m a g i c 的值总是0 x c a f e b a b e ,用于标识一个合法的c l a s s 类型文件。 m i n o rv e r s i o n 、m a j o rv e r s i o n 分别存放了该c l a s s 文件的副版本号和主 版本号,j v m 的实现可以通过检测c l a s s 文件的版本号来判断是否能够 支持该c l a s s 文件所描述的特性,如果版本号大于j v m 所支持的范围, 则会拒绝装入或执行该c l a s s 文件的内容。版本号的值与j d k 的版本相 对应,并且只有s u n 才能定义新的版本号。 c o n s t a n t _ i x 帕lc o u n t 的值为常数池中的条目数量加1 ,即c o n s t a n t _ l x m l 数组中的元素个数加1 。 c o n s t a n t9 0 0 l ,c l a s s 文件的常数池,是一个不定长的数组类型,元素个 数为c o n s t a n t _ p o o l _ c o u n t 1 。c o n s t a n t _ p o o l 是从1 丌始索引的,合法的 索引范围为1 到c o n s t a n t _ p o o l _ c o u n t 1 。索引值0 用于表示空索引,有 特殊用途。 a c e e s s _ _ f l a g s 描述了该类或接口的访问属性,包括p u b l i c 、f i n a l 、a b s t r a c t 1 4 华东师范人学硕士学位论文嵌入式j a v a 虚拟机的研究与实现 等。每个属性由其中一位表示,因此多个属性可以组合。另外,其中有
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025北京市高校毕业生到农村从事支农工作招聘473人考前自测高频考点模拟试题及1套参考答案详解
- 2025昆明市五华区第三幼儿园教育集团招聘(2人)模拟试卷及答案详解(新)
- 2025年上半年山东铁投集团校园招聘、社会公开招聘165人考前自测高频考点模拟试题及答案详解(有一套)
- 2025北京市场监管总局直属单位招聘210人模拟试卷及完整答案详解1套
- 2025年河北承德医学院附属医院招聘工作人员20名模拟试卷及答案详解一套
- 2025广东连平县田源镇人民政府招聘编外人员1人模拟试卷及一套完整答案详解
- 2025内蒙古通辽市扎鲁特旗教体系统事业单位招聘30人模拟试卷附答案详解(黄金题型)
- 生物酶催化绿色合成-洞察与解读
- 2025内蒙古巴彦淖尔市临河区第三人民医院招聘部分人员3人模拟试卷含答案详解
- 2025黑龙江绥化市明水县人民医院招聘中医医生考前自测高频考点模拟试题含答案详解
- 十五五住房和城乡建设发展思路
- 马克思主义经典原著选读-1
- 医用废弃口罩管理制度
- T/CUWA 60055-2023城镇排水管道螺旋缠绕内衬法修复用硬聚氯乙烯(PVC-U)带状型材
- 《职业生涯概述》课件
- 企业会计准则实施典型案例
- 高考英语一轮专项复习:高考试题中的熟词生义(含解析)
- 混凝土路面裂缝修补施工方案
- (2025春新版)北师大版七年级数学下册《-整式的乘法》课件
- 实习生转正述职报告
- 《全新观光车操作与安全培训课件》
评论
0/150
提交评论