专利名称:一种java卡对象管理方法
技术领域:
本发明涉及智能卡领域,尤其涉及一种JAVA卡对象管理方法。
背景技术:
智能卡自诞生起,几十年来,随着集成电路技术、计算机技术和信息安全技术的发展,从接触式卡发展到射频卡甚至多界面卡,从单一应用发展到多应用,种类更加丰富,技术也更趋先进。目前这样,支持多应用的智能卡软件平台成为关键,特别是JAVA卡。由于JAVA卡是运行时解析,因此对象的定位速度会很大的影响JAVA卡运行时的性能;另外,JAVA卡允许发卡后动态下载、删除应用,随着用户对应用的更替,JAVA卡的用户空间也是很宝贵的资源JAVA卡的对象管理方式也会影响到JAVA卡空间的利用效率。在已有的实现中,JAVA卡的对象使用2级表索引的方式,对象占用空间跟对象类型相关,最少的占用8字节;这种管理方案,不仅对象解析、访问的效率比较低(需要解析2 3次,才可以访问到对象),而且对象表也需占用大量的存储器空间,而不简洁的对象头表示方式,也对存储器·空间造成了浪费。针对JAVA卡技术的上述缺陷,本发明要提供一种高效率的JAVA卡对象管理方法,方便对象的定位,节省堆空间资源,提高JAVA卡的空间使用效率。
发明内容
本发明的目的是提供一种高效率的JAVA卡对象管理方法。JAVA卡对象管理方法的目的是加速对象引用在堆空间中的定位速度,合理利用空间,减少资源浪费。为了实现上述发明目的,本方法提供的JAVA卡对象管理方法包括以下步骤JAVA卡对象的对象头与对象体在堆中分离;任何类型的对象头都固定占用8字节长度,对象体则根据JAVA卡对象的具体内容而占用不同的堆存储空间或者RAM空间。对象头分配在存储器堆空间的一端,对象体则在存储器堆空间的另一端分配或在RAM空间进行分配。;举例来说,从低地址往高地址分配对象头空间、从堆的高地址往低地址分配持久性对象体空间;或者,反之,从低地址往高地址分配持久性对象体空间,从堆的高地址往低地址分配对象头空间。JAVA卡动态下载的包代码所使用空间,也与对象体空间的使用方式相同。预先分配一些对象头空间,并做好初始化;当预留的对象头空间已使用时,以存储器的一个Page为单位再申请空闲空间,但,需要保证对象头空间的连续性。对象头信息为8个字节,由于所有类型对象都是相同长度,因此对象头以Page为单位进行存储空间申请;申请的Page空间,按照每8字节为一个对象头块,再进行单独的空间管理;每个Page需要留出起始的8个字节,作为Page管理信息,该8字节的用途为标识本Page中每个对象头是否被使用的情况。每个对象头块都对应Page头标识中的一个bit位,bit位置I,表明该块空间已经被分配;bit为置O,表明该对象头块为空闲。新对象被创建时,首先申请对象头空间从堆对象头使用空间开始,顺序检查每个Page头的标识字节,确定是否本Page中未被使用的空闲对象头块,如果有,则将空闲的对象头分配给新对象的头,并重新设置该对象头块所在Page的标识信息;然后申请对象体空间如果是持久对象,从堆对象体使用空间一端的第一个空闲块开始,查找并分配适合大小的空闲空间作为对象体;如果是瞬态对象,则从RAM空间分配对象体。当有垃圾对象被删除,则直接将该对象使用的对象头块所对应的page中标志信息的bit位置0 ;同时将对象体的空间释放,如果是持久对象,将释放的空间加入到堆的空闲块中统一管理,以供再次使用。每个对象的头信息的最后3个字节为一个地址指针,内容为该对象内容在存储器堆空间的物理地址或者RAM空间地址。对象引用的表示方式为存储器堆空间的Page编号和对象头在该Page中的块编号,,其中Page编码为该Page起始地址/(除以)每个Page的大小;Page中以每8字节为一个块,块编号则从I开始,顺序递增。举例来说,存储器中每 个Page大小为128字节,则该对象引用(2字节,即16bit)的表示方式为12bit表示page编号,4bit表示page中块编号,则可以寻址128X2~12 = 2~19,即可以表示512K的空间;同样类推,存储器中的Page大小为64字节、256字节或者512字节等,分别可以使用3bit、5bit或者6bit表示对象在Page中的块编号,而使用13bit、Ilbit或者IObit标识Page编号,都同样可以寻址512K空间。JAVA卡对象定位对象头的方式为存储器的Page编号XPage大小+对象在该Page中的块编号X每个对象头块的大小。这样,对象头地址不需要在索引表存储,因此,不仅不需要额外的索引表存储对象头地址,定位对象头信息时,也不需要多次定位、读取索引表;而定位对象体,则在对位对象头以后,通过对象头最后3字节的链接指针,来定位,比对象头多一次定位,但仍比二级表的定位方式要快。本发明所提供的JAVA卡堆空间对象管理方法将加速对象引用在堆空间中的定位速度;节省堆空间,提高空间使用效率。
图I持久性对象在存储器堆中的结构图(对象头从堆低地址分配空间,对象体从堆高地址分配空间)图2持久性对象在存储器堆中的结构图2 (对象头从堆高地址分配空间,对象体从堆低地址分配空间)图3瞬态对象在存储器堆/RAM中的结构图
具体实施例方式JAVA卡对象的对象头与对象体在堆中分离;任何类型的对象头都固定占用8字节长度,对象体则根据对象的具体内容而占用不同的堆存储空间;对象体的内容为JAVA卡应用的数据,例如,钱包余额,或者一条记录,当然,也包括对象的域;由于应用的领域不相同,应用的数据就不同,因此对象的内容也不同。每个对象的头信息的最后3个字节为一个地址指针,内容为该对象内容在存储器堆空间的物理地址或者RAM空间地址。为了对象头信息的统一,将持久性类数组对象、以及简单类对象的定义类所在包标识和类偏移信息,放到对象体中,占用对象体的前3字节。对象头分配在存储器堆空间的一端,对象体则在存储器堆空间的另一端分配或在RAM空间进行分配。举例来说,从低地址往高地址分配对象头空间、从堆的高地址往低地址分配持久性对象体(及JAVA卡的其他数据)空间;或者,反之,从低地址往高地址分配持久性对象体空间,从堆的高地址往低地址分配对象头空间。对象的头信息始终占用紧凑的、相邻物理空间,当低地址没有相邻的空闲块时,应进行堆空间紧凑操作。对象头信息为8个字节,由于所有类型对象都是相同长度,因此对象头以Page为 单位进行存储空间申请;申请的Page空间,按照每8字节为一个对象头块,再进行单独的空间管理;每个Page需要留出起始的8个字节,作为Page管理信息,该8字节的用途为标识本Page中每个对象头是否被使用的情况。Page中以每8字节为一个对象头块,每个块都对应Page管理信息的标志字节中的一个bit位,bit位置‘I’,表明该块空间已经被分配;bit为置‘0’,表明该块空间为空闲;由于Page管理信息中有8个字节被用作了标志字节,每个字节有8个bit,所以共可以标识8X8 = 64个对象头块。先预先分配一些对象头空间,并做好初始化;当预留的对象头空间已使用时,以存储器的一个Page为单位再申请空闲空间,但,需要保证对象头空间的连续性;预留空间的方式,可以减少对象头空间申请的过程,加快对象创建;预留空间的大小,可以根据JAVA卡已有应用可能创建对象的多少来确定。对象的创建分为对象头空间的申请、对象体空间的申请两个步骤1、对象头的创建新对象被创建时,首先从堆对象头使用空间开始,顺序检查每个Page头的标识字节,确定是否本Page中未被使用的块,如果找到有未使用块,则将该块分配给新对象的头,并设置该块所对应的Page标识信息为‘I’ ;如果预留的对象头空间已全部使用,以存储器的一个Page为单位再申请空闲空间,并分配一个对象头块给对象头;2 :对象体的创建如果是持久性对象,从堆对象体使用空间的第一个空闲块开始,分配空闲空间;如果是瞬态对象,则分配RAM空间;持久性对象,是指卡片在掉电情况下,其内容能被完好保存的对象,该类型对象的对象体需要保存在非易失性存储区中,例如EEPROM ;瞬态对象,也就是Clear_0n_Reset对象、以及Clear_On_Deselect对象,是在卡片掉电时,其内容被丢失的对象,该类型对象的对象体需要保存在易失性存储区中,例如RAM。对象删除后,回收对象空间时直接将对象头所在Page中,该对象使用的对象头块所对应的标志信息的bit位置0 ;如果删除对象为持久性对象,则将对象体的空间释放,加入到堆的空闲块中;堆中的空闲块是所有堆未使用空间的集合,堆管理所有空闲块,在对象或者包代码申请空间时,为其分配请求的空间;而在对象删除时,将对象占用空间加入到空闲块集合中,以供再次使用。对象引用的表示方式为2字节的对象引用=存储器的Page编号|对象在该Page中的块编号,Page编号占用高N bit,块编号占用低M bit,N加M—共为16bit,也就是2字节。其中Page编码为该Page起始地址/每个Page的大小;Page中以每8字节为一个块,块编号则从I开始,顺序递增。举例来说,存储器中每个Page大小为128字节,则该对象引用(2字节,即16bit)的表示方式为12bit表示page编号,4bit表示page中块编号,则可以寻址128X2~12 = 2~19,即可以表示512K的空间;同样类推,存储器中的Page大小为64字节、256字节或者512字节等,分别可以使用3bit、5bit或者6bit等表示对象在Page中的块编号,而使用13bit、Ilbit或者IObit标识Page编号,都同样可以寻址512K空间。对象通过解析以上的引用,可以直接被定位,,可以直接被定位,对象头地址=存储器的Page编号XPage大小+对象在该Page中的块编号X每个对象头块的大小。这样,对象头地址不需要在索引表存储,因此,不仅不需要额外的索引表存储对象头地址,定位对象头信息时,也不需要多次定位、读取索弓I表;而定位对象体,则在对位对象头以后,通过对象头最后3字节的链接指针,来定位,比对象头多一次定位,但仍比二级表的定位方式要快。总之,JAVA字节码解析执行时,可以根据对象引用,通过一次解析,可以直接定位对象的头信息,包括对象的类型、对象所在的包标识、对象域的个数等信息;通过两次解析 可以访问到对象的内容。对象头所在Page块每个page开始的8个字节是块标志字节。表I对象头所在Page块的格式
PAGE块格式长度(Bytes)
对象头是否有效的标志 8_
第I个对象头块 8第2个对象头块__8_
对象头的存储方式 对象类型标志I字节,标识对象类型,其定义如下表(未作出说明的bit,为保留)表2对象头类型标志的定义说明
Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 BitlBitO 类型说明
— — _ — 00 持久性
0I表明为 Clear—On—Reset 瞬态
1IClear—On—Deselect 瞬态
0— 0 I — ~通Oilboolean 数组
1__0__0_______byte 数组_
10 1short 数组
I ~ I ' 0 一 — ■一 int 数组
111reference 数组对象包含各种类型的瞬态对象以及持久性对象;例如普通类型的持久性对象;byte数组类型的Clear_0n_Reset瞬态对象。 普通对象头表3普通对象头信息格式定义
权利要求
1.JAVA卡对象管理方法,其特征在于JAVA卡对象的对象头与对象体分离存储,JAVA卡对象以Page为单位申请对象头的存储空间并进行Page编号,Page中以每8字节为一个块,块编号则从I开始,顺序递增;对象头占用8字节,最后3字节为对象体在存储器堆空间的物理地址指针或者RAM空间地址指针,对象体则根据JAVA卡对象的具体内容而占用不同的存储器堆空间或RAM空间。
2.如权利要求I所述的方法,其特征在于每个Page起始的8个字节作为Page管理信息,标识本Page中JAVA卡对象的对象头存储空间是否被使用的情况。
3.如权利要求2所述的方法,其特征在于Page中每8字节作为一个对象头存储空间,每个对象头都对应Page管理信息中的一个bit位,bit位置I,表明该对象头存储空间已经被分配;bit位置O,表明该对象头存储空间为空闲。
4.如权利要求I所述的方法,其特征在于对象头分配在存储器堆空间,对象体则在存储器堆空间的另一端分配或在RAM空间进行分配。
5.如权利要求I所述的方法,其特征在于预先分配存储器堆空间,当预先分配的存储器堆空间已被使用时,以存储器堆空间的一个Page为单位再申请空闲空间,并保证对象头存储空间的连续性。
6.如权利要求5所述的方法,其特征在于预先分配的存储器堆空间根据JAVA卡需要创建的JAVA卡对象的多少来确定。
7.如权利要求2或3所述的方法,其特征在于创建对象头时,顺序检查Page管理信息,确定本Page中是否有未被使用的对象头存储空间,如果有,则将该对象头存储空间分配给JAVA卡对象的对象头,并设置该对象头存储空间所对应的Page标识信息为‘I’;如果没有,以存储器堆空间的一个Page为单位申请空闲空间,并分配一个对象头存储空间给JAVA卡对象的对象头。
8.如权利要求2或3所述的方法,其特征在于当JAVA卡对象被删除后,回收JAVA卡对象的对象头空间时,直接将对象头对应的bit位置O。
9.根据权利要求I所述的方法,其特征在于对象头引用的表示方式为存储器堆空间的Page编号和对象头在该Page中的块编号,其中Page编号为该Page起始地址除以每个Page的大小。
10.根据权利要求I或9所述的方法,其特征在于JAVA卡对象定位对象头的方式为存储器堆空间的Page编号XPage大小+对象头在该Page中的块编号X每个对象头所占块的大小。
全文摘要
本发明涉及JAVA卡对象管理方法,包括以下内容JAVA卡对象由对象头和对象体共同组成,对象头与对象体在堆中采用分离地方式存储;所有类型的对象头都固定占用8字节长度,对象体则根据对象的具体内容而占用不同大小的存储空间;根据JAVA卡的设计需求,预先分配一定的page块作为对象头空间。本发明所提供的JAVA卡对象管理方法将提高对象创建、访问效率,并有利于对象JAVA智能卡的有限存储空间的更合理的应用。
文档编号G06F17/30GK102799660SQ20121023625
公开日2012年11月28日 申请日期2012年7月4日 优先权日2012年7月4日
发明者刘宏梅, 芦蓉, 崔炳荣 申请人:北京中电华大电子设计有限责任公司