CN103116518B - 一种基于java卡虚拟机中对象管理的方法 - Google Patents
一种基于java卡虚拟机中对象管理的方法 Download PDFInfo
- Publication number
- CN103116518B CN103116518B CN201310031158.0A CN201310031158A CN103116518B CN 103116518 B CN103116518 B CN 103116518B CN 201310031158 A CN201310031158 A CN 201310031158A CN 103116518 B CN103116518 B CN 103116518B
- Authority
- CN
- China
- Prior art keywords
- index value
- address
- virtual machine
- java card
- storage space
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Fee Related
Links
- 238000000034 method Methods 0.000 title claims abstract description 73
- 239000012634 fragment Substances 0.000 claims abstract description 24
- 239000003550 marker Substances 0.000 claims abstract description 9
- 238000012217 deletion Methods 0.000 claims description 13
- 230000037430 deletion Effects 0.000 claims description 13
- 238000011084 recovery Methods 0.000 claims description 5
- 238000004364 calculation method Methods 0.000 claims description 3
- 238000007689 inspection Methods 0.000 claims description 2
- 238000007726 management method Methods 0.000 description 10
- 238000010586 diagram Methods 0.000 description 6
- 238000004458 analytical method Methods 0.000 description 2
- 230000006870 function Effects 0.000 description 2
- 230000003068 static effect Effects 0.000 description 2
- 208000034423 Delivery Diseases 0.000 description 1
- 239000008186 active pharmaceutical agent Substances 0.000 description 1
- 230000007812 deficiency Effects 0.000 description 1
- 238000005516 engineering process Methods 0.000 description 1
- 238000004321 preservation Methods 0.000 description 1
- 238000012163 sequencing technique Methods 0.000 description 1
- 238000012384 transportation and delivery Methods 0.000 description 1
- 239000002699 waste material Substances 0.000 description 1
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开一种基于java卡虚拟机中对象管理的方法,包括:java卡虚拟机在运行过程中检测到创建对象操作,将创建对象的基本信息填入到第二存储空间中,获得将要创建对象的偏移地址并将其存储到子对象表的空表项中,计算将要创建对象的索引值用其更新存储的第一索引值;检测到删除CAP镜像操作,将第一存储空间中的与删除CAP镜像ID对应的CAP镜像标记为碎片,依次检测第一存储空间中组件的类型,如为子对象表则将子对象表向高地址方向移动,修改存储在主对象表中子对象表的偏移地址,如为CAP镜像则将CAP镜像向高地址方向移动,更新CAP镜像的地址。本发明采用主对象表和子对象表来管理对象,简单方便,且能节省资源。
Description
技术领域
本发明涉及对象管理领域,尤其涉及一种基于java卡虚拟机中对象管理的方法。
背景技术
Java卡中使用对象来保存一些数据,对象包括对象头和数据域,对象头和数据域可以分开存储,也可以连续存储。永久性对象的对象头和数据域顺序排列的存储在EEPROM中;临时对象的对象头和数据域是分开存储的,其中对象头在EEPROM中,而数据域在RAM中。永久性对象和临时对象的对象头在eeprom中按创建的先后顺序排列。
现有技术中,对象每次被调用时,都需要引用该对象的地址,占用较大的空间;且在进行垃圾回收时,如果移动了一个对象,则该对象的偏移地址就会改变,相应的就需要把每个引用该对象的偏移地址改一遍。现有技术中对象管理较繁琐,而且浪费资源和时间。
发明内容
本发明的目的是为了克服现有技术的不足,提供一种基于java卡虚拟机中对象管理的方法。
本发明提供一种基于java卡虚拟机中对象管理的方法,包括:
步骤S1:java卡虚拟机在java卡程序运行过程中检测将要进行的操作,如是进行创建对象操作,则执行步骤S2;如是进行删除CAP镜像操作则执行步骤S7;
步骤S2:所述java卡虚拟机在第二存储空间中申请将要创建对象的空间,填入所述将要创建对象的基本信息,获得所述将要创建对象的偏移地址;
步骤S3:所述java卡虚拟机判断子对象表中是否有空表项,是则将所述空表项所在子对象表作为当前子对象表,执行步骤S6,否则执行步骤S4;
步骤S4:所述java卡虚拟机判断主对象表中是否有空表项,是则执行步骤S5,否则报错,返回步骤S1;
步骤S5:所述java卡虚拟机根据子对象表的长度从第一存储空间中申请空间建立新子对象表,并获取所述新子对象表的偏移地址,将所述新子对象表的偏移地址存储到所述主对象表的空表项中,将所述新子对象表作为当前子对象表并获取其第一个空表项,执行步骤S6;
步骤S6:java卡虚拟机将所述将要创建对象的偏移地址存储到当前子对象表的空表项中,计算所述将要创建对象的索引值并将其存储到操作栈中,并用所述将要创建对象的索引值更新存储的第一索引值,返回步骤S1;
步骤S7:所述java卡虚拟机将所述第一存储空间中的与删除CAP镜像ID对应的CAP镜像标记为碎片,获取所述第一存储空间中的地址最大的组件作为当前组件;
步骤S8:所述java卡虚拟机将所述第一存储空间中最高地址与当前组件地址之间的碎片大小加到第一存储空间的总碎片大小上,检测当前组件的类型,如为子对象表则执行步骤S9,如为CAP镜像则执行步骤S10;所述第一存储空间的总碎片大小初始值为0;
步骤S9:所述java卡虚拟机在所述第一存储空间中将所述子对象表向高地址方向移动所述第一存储空间的总碎片大小,修改存储在主对象表中所述子对象表的偏移地址,执行步骤S11;
步骤S10:所述java卡虚拟机在所述第一存储空间中将所述CAP镜像向高地址方向移动所述第一存储空间的总碎片大小,更新所述CAP镜像的地址,执行步骤S11;
步骤S11:所述java卡虚拟机判断在所述第一存储空间中是否存在地址较小的当前组件的相邻组件,是则将所述相邻组件作为当前组件,返回步骤S8,否则返回步骤S1。
进一步地,所述步骤S1中当所述java卡虚拟机在运行过程中检测将要进行垃圾回收操作时执行步骤S12;当所述java卡虚拟机在运行过程中检测将要进行修改对象操作时执行步骤S17;
步骤S12:所述java卡虚拟机扫描所述第二存储空间,合并碎片,判断是否有需要回收的对象,是则执行步骤S13,否则执行步骤S15;
步骤S13:所述java卡虚拟机将需要回收对象的大小加到第二存储空间的总碎片大小上,清空所述子对象表中存储所述需要回收对象的偏移地址的表项;所述第二存储空间的总碎片大小初始值为0;
步骤S14:所述java卡虚拟机判断所述需要回收对象的索引值是否小于存储的第一索引值,是则用所述需要回收对象的索引值更新所述第一索引值,返回步骤S12,否则返回步骤S12;
步骤S15:所述java卡虚拟机判断所述第二存储空间的总碎片大小是否为0,是则返回步骤S1,否则执行步骤S16;
步骤S16:所述java卡虚拟机根据所述第二存储空间的总碎片大小移动需要回收对象之后的对像,并更新所述子对象表中存储的移动对像的偏移地址,返回步骤S1;
步骤S17:所述java卡虚拟机从所述操作栈中取出要修改对象的索引值及修改参数,检查所述修改参数的有效性,如所述修改参数无效则报错,返回步骤S1;如所述修改参数有效则根据所述要修改对象的索引值获取对应的对象,并修改所述对象的数据域,返回步骤S1。
其中,所述步骤S1具体为:
当所述java卡虚拟机在java卡程序运行过程中检测到预设字符时,则进行创建对象操作;
当所述java卡虚拟机在所述java卡程序运行过程中接收到预设APDU命令时,则根据所述APDU命令中的删除CAP镜像ID进行删除对应CAP镜像的操作;
当所述java卡虚拟机在所述java卡程序运行过程中检测到固定接口函数时,则在本条命令结束时进行垃圾回收操作;
当所述java卡虚拟机在java卡程序运行过程中检测到有赋值的对象时,则进行修改对象操作。
其中,所述步骤S3-步骤S4具体包括:
步骤a1:所述java卡虚拟机根据存储的第一索引值计算得到子对象表的表项索引值和主对象表的表项索引值;
步骤a2:所述java卡虚拟机判断所述主对象表的表项索引值是否大于所述主对象表的长度,是则报错,返回步骤S1,否则执行步骤a3;
步骤a3:所述java卡虚拟机根据所述主对象表的表项索引值从主对象表的对应表项中获取子对象表的偏移地址;
步骤a4:所述java卡虚拟机判断所述子对象表的偏移地址是否为空,是则执行步骤S5,否则执行步骤a5;
步骤a5:所述java卡虚拟机根据所述子对象表的表项索引值获取对应表项,并判断所述对应表项是否为空,是则执行步骤S6,否则所述子对象表的表项索引值自加1,执行步骤a6;
步骤a6:所述java卡虚拟机判断所述子对象表的表项索引值是否大于所述子对象表的长度,是则所述主对象表的表项索引值自加1,返回步骤a2;否则执行步骤a5。
其中,所述步骤a1具体为:所述java卡虚拟机用所述第一索引值除以子对象表的长度,商为所述主对象表的表项索引值,余数为所述子对象表的表项索引值。
其中,所述步骤S6中计算所述将要创建对象的索引值,具体为:用主对象表的表项索引值乘以子对象表的长度,再加上当前子对象表的表项索引值得到所述将要创建对象的索引值。
其中,所述步骤S7-步骤S11包括:
步骤b1:所述java卡虚拟机解析接收到的预设APDU命令得到所述删除CAP镜像ID,将所述第一存储空间中的与删除CAP镜像ID对应的CAP镜像标记为碎片;
步骤b2:所述java卡虚拟机获取所述第一存储空间的最高地址并将其作为当前地址;
步骤b3:所述java卡虚拟机判断当前地址是否大于第一存储空间中已使用空间的起始地址,是则执行步骤b4,否则执行步骤b5;
步骤b4:所述java卡虚拟机判断所述第一存储空间中是否有地址较小的相邻组件,是则第一存储空间的总碎片大小自加当前地址与所述相邻组件地址之间的碎片大小,执行步骤b6,否则第一存储空间的总碎片大小自加当前地址与第一存储空间中已使用空间的起始地址之间的碎片大小,执行步骤b5;所述第一存储空间的总碎片大小初始值为0;
步骤b5:所述java卡虚拟机判断所述第一存储空间的总碎片大小是否为0,是则返回步骤S1,否则将所述第一存储空间中已使用空间的起始地址向高地址移方向动第一存储空间的总碎片大小,返回步骤S1;
步骤b6:所述java卡虚拟机判断所述相邻组件是否为子对象表,是则执行步骤b7,否则相邻组件为CAP镜像,执行步骤b9;
步骤b7:所述java卡虚拟机将所述子对象表的地址作为当前地址,判断所述第一存储空间的总碎片大小是否为0,是则返回步骤b3,否则执行步骤b8;
步骤b8:所述java卡虚拟机在所述第一存储空间中将所述子对象表向高地址方向移动所述第一存储空间的总碎片大小,修改存储在主对象表中的所述子对象表的偏移地址,返回步骤b3;
步骤b9:所述java卡虚拟机将所述CAP镜像的地址作为当前地址,判断所述第一存储空间的总碎片大小是否为0,是则返回步骤b3,否则执行步骤b10;
步骤b10:所述java卡虚拟机在所述第一存储空间中将所述CAP镜像向高地址方向移动所述第一存储空间的总碎片大小,更新所述CAP镜像的地址,返回步骤b3。
其中,所述步骤b4中,
所述当前地址与相邻组件的地址之间的碎片大小具体为:当前地址与相邻组件的地址加上相邻组件长度之和的差值;所述当前地址与第一存储空间中已使用空间的起始地址之间的碎片大小为:当前地址与所述第一存储空间中已使用空间的起始地址的差值。
其中,所述步骤S12-步骤S16包括:
步骤c1:所述java卡虚拟机获取所述第二存储空间中的最低地址将其作为当前地址;
步骤c2:所述java卡虚拟机判断当前地址是否小于第二存储空间已使用空间的末地址,是则执行步骤c3,否则执行步骤c12;
步骤c3:所述java卡虚拟机根据当前地址获取当前对象的索引值,并判断当前对象的索引值是否为空,是则执行步骤c4,否则执行步骤c7;
步骤c4:所述java卡虚拟机获取地址较大的相邻对象的索引值,并判断所述相邻对象的索引值是否为空,是则执行步骤c5,否执行步骤c6;
步骤c5:所述java卡虚拟机获取所述第二存储空间中已使用空间的末地址与当前地址之间的碎片大小,并加到所述第二存储空间的总碎片大小上,执行步骤c12;
步骤c6:所述java卡虚拟机获取所述相邻对象的地址与当前地址之间的碎片大小,并加在所述第二存储空间的总碎片大小上,将所述相邻对象作为当前对象,将所述相邻对象的地址作为当前地址,执行步骤c7;
步骤c7:所述java卡虚拟机获取当前对象大小,并判断当前对象是否需要回收,是则执行步骤c8;否则执行步骤c9;
步骤c8:所述java卡虚拟机将所述当前对象大小加到所述第二存储空间的总碎片大小上,并清空子对象表中存储当前对象的偏移地址的表项,判断当前对象的索引值是否小于存储的第一索引值,是则用当前对象的索引值更新所述第一索引值,执行步骤c11,否则执行步骤c11;
步骤c9:所述java卡虚拟机判断所述第二存储空间的总碎片大小是否为0,是则执行步骤c11,否则执行步骤c10;
步骤c10:所述java卡虚拟机将当前对象向低地址方向移动所述第二存储空间的总碎片大小,并更新存储在所述子对象表中的当前对象的偏移地址,执行步骤c11;
步骤c11:所述java卡虚拟机将当前地址自加当前对象大小,返回步骤c2;
步骤c12:所述java卡虚拟机判断所述第二存储空间总碎片大小是否为0,是则返回步骤S1,否则将所述第二存储空间已使用空间的末地址向低地址方向移动所述第二存储空间的总碎片大小,返回步骤S1。
其中,所述步骤c7中判断当前对象是否需要回收具体为:所述java卡虚拟机判断当前对象是否被调用,是则不需要回收,否则需要回收。
其中,所述步骤c3中根据当前地址获取当前对象的索引值,具体为:
根据当前地址计算当前对象偏移地址,遍历对象表,如找到存储所述当前对象偏移地址的子对象表的表项和存储所述子对象表偏移地址的主对象表的表项,则根据主对象表的表项索引值和子对象表的表项索引值计算对象的索引值,计算方法具体为:主对象表的表项索引值与子对象表的长度的乘积加上子对象表的表项索引值得到当前对象的索引值;如果遍历完对象表,未找到当前对象偏移地址,则将当前对象的索引值赋为空。
其中,所述步骤c4具体包括:
步骤c4-1:搜索主对象表和子对象表,按照所述主对象表的表项索引值从大到小的顺序,在各个与所述主对象表的表项索引值对应的子对象表中逆序查找最后一个非空表项并获取所述非空表项的索引值;
步骤c4-2:根据所述子对象表的所述非空表项的索引值和主对象表中存储对应子对象表偏移地址的表项的索引值计算最大索引值,所述最大索引值所对应的对象为存储在所述子对象表中最后一个非空表项中的对象,将相邻对象的索引值赋值为0,将临时对象索引值赋值为0,根据当前地址计算当前偏移地址;
步骤c4-3:判断所述临时对象索引值是否大于所述最大索引值,如大于则判断当前对象的索引值是否为空,是则执行步骤c5,否则执行步骤c6;如不大于则执行步骤c4-4;
步骤c4-4:根据所述临时对象的索引值获取临时对象的偏移地址;
步骤c4-5:判断所述临时对象的偏移地址是否大于所述当前偏移地址,是则用所述临时对象的索引值更新所述相邻对象的索引值,将所述临时对象偏移地址作为所述相邻对象的偏移地址,所述临时对象索引值自加1,执行步骤c4-6,否则所述临时对象的索引值自加1,返回步骤c4-3;
步骤c4-6:判断所述临时对象索引值是否大于所述最大索引值,如大于则判断当前对象的索引值是否为空,是则执行步骤c5,否则执行步骤c6;如不大于则执行步骤c4-7;
步骤c4-7:根据所述临时对象索引值获取临时对象的偏移地址;
步骤c4-8:判断所述临时对象的偏移地址是否大于所述当前偏移地址,是则执行步骤c4-9,否则所述临时对象的索引值自加1,返回步骤c4-6;
步骤c4-9:判断所述临时对象的偏移地址是否小于所述相邻对象的偏移地址,是则用所述临时对象的索引值更新所述相邻对象的索引值,用所述临时对象的偏移地址更新所述相邻对象的偏移地址,所述临时对象索引值自加1,返回步骤c4-6,否则所述临时对象的索引值自加1,返回步骤c4-6。
其中,所述步骤S17包括:
步骤S17-1:所述java卡虚拟机从所述操作栈中取出要修改对象的索引值及修改的参数;
步骤S17-2:所述java卡虚拟机根据所述要修改对象的索引值计算得到主对象表中存储子对象表偏移地址的表项和子对象表中存储所述要修改对象偏移地址的表项,根据所述子对象表的偏移地址获取对应子对象表,从所述对应子对象表中存储的所述要修改对象偏移地址的表项中获取要修改对象的偏移地址;
步骤S17-3:所述java卡虚拟机检查修改参数的有效性,如所述修改参数无效则报错,返回步骤S1;如所述修改参数有效则根据所述要修改对象偏移地址获取对象,并修改所述对象的数据域,返回步骤S1。
本发明与现有技术相比,具有以下优点:
本发明实现方案中采用主对象表和子对象表,主对象表中存放各个子对象表的偏移地址,子对象中存放对象的偏移地址,对于每个引用对象的地方,只需填入对象的索引值,节省空间;且在进行垃圾回收操作时,在扫描第二存储空间的过程中如对象被移动,则只需修改存储在子对象表中的该对象的偏移地址,不需要在每个引用该对象的地方修改对象偏移地址,操作简单,用时较短,如果在删除CAP镜像过程中,扫描第一存储空间时将被标记为碎片的CAP镜像的空间回收时子对象表被移动了,则修改存储在主对象表中的该子对象表的偏移地址即可。
附图说明
图1为本发明实施例一提供的一种基于java卡虚拟机中对象管理的方法流程图;
图2为本发明实施例二提供的一种基于java卡虚拟机中对象管理的方法流程图;
图3为本发明实施例二的步骤111中java卡虚拟机扫描第一存储空间,合并碎片的方法流程图;
图4为本发明实施例二的步骤112中java卡虚拟机扫描第二存储空间,合并碎片的方法流程图;
图5为本发明实施例二的步骤112中步骤112-4的具体实现过程流程图;
图6a-6g为本发明实施例二的子对象表和主对象表的关系示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
实施例一
本发明实施例一提供了一种基于java卡虚拟机中对象管理的方法,包括子对象表和主对象表,其中子对象表的表项中存储对象的偏移地址,主对象表的表项中存储子对象表的偏移地址,第一存储空间中存储有CAP镜像和/或子对象表,第二存储空间中存储有对象,第一存储空间和第二存储空间均在EEPROM中,本实施例中的CAP镜像是CAP文件下载到java卡的过程中静态链接的镜像,如图1所示,本实施例的方法包括:
步骤S1:java卡虚拟机在java卡程序运行过程中检测将要进行的操作,如是进行创建对象操作,则执行步骤S2;如是进行删除CAP镜像操作则执行步骤S7;
本实施例中的步骤S1具体为:
当java卡虚拟机在java卡程序运行过程中检测到预设字符时,则进行创建对象操作;
当java卡虚拟机在java卡程序运行过程中接收到预设APDU命令时,则根据APDU命令中的删除CAP镜像ID进行删除对应CAP镜像的操作;
步骤S2:java卡虚拟机在第二存储空间中申请将要创建对象的空间,填入将要创建对象的基本信息,获得将要创建对象的偏移地址;
步骤S3:java卡虚拟机判断子对象表中是否有空表项,是则将空表项所在子对象表作为当前子对象表,执行步骤S6,否则执行步骤S4;
步骤S4:java卡虚拟机判断主对象表中是否有空表项,是则执行步骤S5,否则报错,返回步骤S1;
步骤S5:java卡虚拟机根据子对象表的长度从第一存储空间中申请空间建立新子对象表,并获取新子对象表的偏移地址,将新子对象表的偏移地址存储到主对象表的空表项中,将新子对象表作为当前子对象表并获取其第一个空表项,执行步骤S6;
步骤S6:java卡虚拟机将将要创建对象的偏移地址存储到当前子对象表的空表项中,计算将要创建对象的索引值并将其存储到操作栈中,并用将要创建对象的索引值更新存储的第一索引值,返回步骤S1;
步骤S7:java卡虚拟机将第一存储空间中的与删除CAP镜像ID对应的CAP镜像标记为碎片,获取第一存储空间中的地址最大的组件作为当前组件;
步骤S8:java卡虚拟机将第一存储空间中最高地址与当前组件地址之间的碎片大小加到第一存储空间的总碎片大小上,检测当前组件的类型,如为子对象表则执行步骤S9,如为CAP镜像则执行步骤S10;
第一存储空间的总碎片大小初始值为0;
步骤S9:java卡虚拟机在第一存储空间中将子对象表向高地址方向移动第一存储空间的总碎片大小,修改存储在主对象表中子对象表的偏移地址,执行步骤S11;
步骤S10:java卡虚拟机在第一存储空间中将CAP镜像向高地址方向移动第一存储空间的总碎片大小,更新CAP镜像的地址,执行步骤S11;
步骤S11:java卡虚拟机判断在第一存储空间中是否存在地址较小的相邻组件,是则将相邻组件作为当前组件,返回步骤S8,否则返回步骤S1。
本实施例的方法还包括:步骤S1中当java卡虚拟机在运行过程中检测将要进行垃圾回收操作时执行步骤S12;当java卡虚拟机在运行过程中检测将要进行修改对象操作时执行步骤S17;
步骤S12:java卡虚拟机扫描第二存储空间,合并碎片,判断是否有需要回收的对象,是则执行步骤S13,否则执行步骤S15;
步骤S13:java卡虚拟机将需要回收对象的大小加到第二存储空间的总碎片大小上,清空子对象表中存储需要回收对象的偏移地址的表项;第二存储空间的总碎片大小初始值为0;
步骤S14:java卡虚拟机判断需要回收对象的索引值是否小于存储的第一索引值,是则用需要对象的索引值更新第一索引值,返回步骤S12,否则返回步骤S12;
步骤S15:java卡虚拟机判断第二存储空间的总碎片大小是否为0,是则返回步骤S1,否则执行步骤S16;
步骤S16:java卡虚拟机根据第二存储空间的总碎片大小移动需要回收对象之后的对像,并更新子对象表中存储的移动对像的偏移地址,返回步骤S1;
步骤S17:java卡虚拟机从操作栈中取出要修改对象的索引值及修改参数,检查修改参数的有效性,如修改参数无效则报错,返回步骤S1;如修改参数有效则根据要修改对象的索引值获取对应的对象,并修改对象的数据域,返回步骤S1;
具体的,在本实施例中,当java卡虚拟机在java卡程序运行过程中检测到固定接口函数时,则在本条命令结束时进行垃圾回收操作;当java卡虚拟机在java卡程序运行过程中检测到有赋值的对象时,则进行修改对象操作。
实施例二
本发明实施例二提供了一种基于java卡虚拟机中对象管理的方法,包括子对象表和主对象表,其中子对象表的表项中存储对象的偏移地址,主对象表的表项中存储子对象表的偏移地址,第一存储空间中存储有CAP镜像和/或子对象表,第二存储空间中存储有对象,第一存储空间和第二存储空间均在EEPROM中,本实施例中的CAP镜像是CAP文件下载到java卡的过程中静态链接的镜像,如图2所示,本实施例的方法包括:
步骤101:java卡虚拟机在java卡程序运行过程中检测将要进行的操作,如是进行创建对象操作,则执行步骤102;如是进行删除CAP镜像操作则执行步骤111;如是进行垃圾回收操作则执行步骤112;如是进行修改对象操作则执行步骤113;
本实施例中,当虚拟机在其上的java卡程序运行过程中当检测到预设字符时,则进行创建对象操作;例如,本实施例中的预设字符为new;
当java卡虚拟机在java卡程序运行过程中检测到固定API(JCSystem.requestObjectDeletion())时,在本条APDU命令结束前进行垃圾回收操作;
当虚拟机在java卡程序运行过程中检测到有赋值的对象时,则进行修改对象操作;
当虚拟机在java卡程序运行过程中接收预设APDU命令时,则根据预设APDU命令中的CAP镜像ID进行删除对应CAP镜像的操作;
步骤102:java卡虚拟机在第二存储空间中申请将要创建对象的空间,填入该对象的基本信息,获得将要创建对象的偏移地址;
步骤103:java卡虚拟机根据存储的第一索引值计算得到子对象表的表项索引值和主对象表的表项索引值;
本实施例中,存储的第一索引值为创建对象过程中保存的索引值或者是删除对象过程中保存的索引值;
本实施例中使用0表示空;
具体的,本实施例的计算过程为:用第一索引值除以子对象表的长度,商即为主对象表的表项索引值,余数即为子对象表的表项索引值;
本实施例中还可以将第一个主对象表作为当前主对象表,将第一个子对象表作为当前子对象表;
步骤104:java卡虚拟机判断主对象表的表项索引值是否大于主对象表的长度,是则表示寻找空表项失败,报错,返回步骤101,否则执行步骤105;
步骤105:java卡虚拟机根据主对象表的表项索引值从主对象表的对应表项中获取子对象表的偏移地址;
本实施例中,用数组形式表示主对象表,数组下标就为主对象表的表项索引值,获取子对象表的偏移地址的方法即为数组的读取方法;
步骤106:java卡虚拟机判断子对象表的偏移地址是否为空,是则执行步骤109,否则执行步骤107;
本实施例中,判断子对象表的偏移地址是否为0,是则为空,否则不为空;
步骤107:java卡虚拟机根据子对象表的表项索引值找到对应的表项,并判断该表项是否为空,是则执行步骤110,否则子对象表的表项索引值自加1,执行步骤108;
本实施例中,用数组形式表示子对象表,数组下标就为子对象表的表项索引值,读取子对象表表项的方法即为读取数组的方法;
本实施例中,如该表项中的内容为0则表示空;
步骤108:java卡虚拟机判断子对象表索引值是否大于子对象表的长度,是则主对象表的表项索引值自加1,子对象表的表项索引值初始化为0,返回步骤104;否则返回步骤107;
步骤109:java卡虚拟机从第一存储空间中申请固定大小的空间建立子对象表,并获取子对象表的偏移地址,将该子对象表的偏移地址存储到主对象表的表项索引值所指向的表项中,并将新申请的子对象表作为当前子对象表,子对象表的表项索引值为0,执行步骤110;
本实施例中子对象表的大小具体为128字节,主对象表的大小具体为64字节,即主对象表可以存储64个子对象表的偏移地址,每个子对象表可以存储128个对象的偏移地址,总共可以管理64×128个对象;具体的,本实施例中的固定大小具体为对象数据域所占空间大小+对象头的大小,例如数组的对象头包括对象类型标识、对象的上下文、对象的长度,对象的对象头包含类型标识、对象的上下文、类偏移、包ID、添补标识;
本实施例中主对象表中的表项编号即为主对象表索引值;
步骤110:java卡虚拟机将创建对象的偏移地址存储到当前子对象表索引值指向的表项中,计算将创建对象的索引值并将其存储到操作栈中,并用将创建对象的索引值更新存储的第一索引值,返回步骤101;
本实施例中,计算将创建对象的索引值具体为:用主对象表的表项索引值乘以子对象表的长度,再加上子对象表的表项索引值;
步骤111:java卡虚拟机解析接收到的预设APDU命令,根据解析结果中的删除CAP镜像ID将第一存储空间中的对应的CAP镜像标记为碎片,并扫描第一存储空间,合并碎片,返回步骤101;
本实施例中,根据解析结果中的删除CAP镜像ID将第一存储空间中的对应的CAP镜像标记为碎片,包括:
根据删除CAP镜像ID将第一存储空间中CAP镜像信息列表中的对应的CAP镜像信息删除,在扫描第一存储空间的过程中,如第一存储空间中的CAP镜像信息在CAP镜像信息列表里查不到,则表示该CAP镜像为碎片;具体的,本实施例中扫描第一存储空间,合并碎片的方法如图3所示,包括:
步骤111-1:java卡虚拟机获取第一存储空间的最高地址并将其作为当前地址;
本实施例中,第一存储空间中存储的组件为子对象表和/或CAP镜像,第一存储空间从高地址向低地址使用;
步骤111-2:java卡虚拟机判断当前地址是否大于第一存储空间中已使用空间的起始地址,是则执行步骤111-3;否则执行步骤111-4;
本实施例中的第一存储空间中已使用空间的起始地址为上次操作完成后保存的最后一个组件的地址或者java卡上电后初始化的地址;
步骤111-3:java卡虚拟机判断第一存储空间中是否有地址较小的相邻组件,是则第一存储空间的总碎片大小自加当前地址与相邻组件地址之间的碎片大小,执行步骤111-5,否则第一存储空间的总碎片大小自加当前地址与第一存储空间中已用空间起始地址之间的碎片大小,执行步骤111-4;
本实施例中的第一存储空间的总碎片大小初始值为0;
具体的,在本实施例中,当前地址与相邻组件的地址之间的碎片大小=当前地址-(相邻组件的首地址+相邻组件长度);当前地址与第一存储空间中已用空间起始地址之间的碎片大小=当前地址-第一存储空间中已用空间起始地址;
步骤111-4:java卡虚拟机判断第一存储空间的总碎片大小是否为0,是则返回步骤101,否则将第一存储空间中已使用空间起始地址向高地址方向移动第一存储空间的总碎片大小,返回步骤101;
步骤111-5:java卡虚拟机判断相邻组件是否为子对象表,是则执行步骤111-6,否则相邻组件为CAP镜像,执行步骤111-8;
本实施例中,该步骤的相邻组件为子对象表或CAP镜像;
步骤111-6:java卡虚拟机将子对象表的地址作为当前地址,判断第一存储空间的总碎片大小是否为0,是则返回步骤111-2,否则执行步骤111-7;
步骤111-7:java卡虚拟机在第一存储空间中将子对象表向高地址方向移动第一存储空间的总碎片大小,修改存储在在主对象表中的该子对象表的偏移地址,返回步骤111-2;
具体的,本实施例中在步骤111-7之后,该子对象表的偏移地址即为该子对象表的原来偏移地址+第一存储空间总碎片大小;
步骤111-8:java卡虚拟机将CAP镜像的地址作为当前地址,判断第一存储空间的总碎片大小是否为0,是则返回步骤111-2,否则执行步骤111-9;
步骤111-9:java卡虚拟机在第一存储空间中将CAP镜像向高地址方向移动第一存储空间的总碎片大小,更新CAP镜像的地址,返回步骤111-2;
步骤112:java卡虚拟机扫描第二存储空间,合并碎片,返回步骤101;
本实施例中扫描第二存储空间,合并碎片的具体实现方法如图4所示,包括:
步骤112-1:java卡虚拟机获取第二存储空间中的最低地址将其作为当前地址;
本实施例中,第二存储空间是从低地址向高地址使用;
步骤112-2:java卡虚拟机判断当前地址是否小于第二存储空间已使用空间的末地址,是则执行步骤112-3;否则执行步骤112-13;
步骤112-3:java卡虚拟机根据当前地址获取当前对象的索引值,并判断当前对象的索引值是否为空,是则执行步骤112-4,否则执行步骤112-8;
本实施例中,如索引值为0x00则表示对象的索引值为空,如对象的索引值为空,则表明存储该对象的地址是碎片;
java卡虚拟机根据当前地址获取对象的索引值具体为:根据当前地址计算当前对象的偏移地址,遍历对象表,如找到存储当前对象偏移地址的子对象表的表项和存储该子对象表偏移地址的主对象表的表项,则根据主对象表的表项索引值和子对象表的表项索引值计算当前对象的索引值,计算方法具体为:对象偏移地址=对象的地址–java虚拟机使用的基地址,当前对象的索引值=主对象表的表项索引值×子对象表的长度+子对象表的表项索引值;如果遍历完对象表,未找到当前对象的偏移地址,则当前对象的索引值赋为空;
步骤112-4:java卡虚拟机获取地址较大的相邻对象的索引值;
如图5所示,java卡虚拟机获取地址较大的相邻对象具体为:
步骤p1:搜索主对象表和子对象表,按照主对象表的表项索引值从大到小的顺序,在各个与主对象表的表项索引值对应的子对象表中逆序查找最后一个非空表项并获取该非空表项的索引值;
例如,主对象表的长度为4,主对象表的长度为3,按照第4个子对象表的第3表项、第2表项、第1表项,第3个子对象表的第3表项、第2表项、第1表项,第2个子对象表的第3表项、第2表项、第1表项,第1个子对象表的第3表项、第2表项、第1表项的顺序查找最后一个非空表项;
步骤p2:根据子对象表的非空表项的索引值和主对象表中存储该子对象表偏移地址的表项的索引值计算最大索引值,该最大索引值所对应的对象为存储在子对象表中最后一个非空表项中的对象,将相邻对象的索引值赋值为0,将临时对象索引值赋值为0,根据当前地址计算当前偏移地址;
本实施例中,计算最大索引值=主对象表的表项索引值×子对象表的长度+子对象表的表项索引值;
本实施例中,根据当前地址计算当前偏移地址具体为:用当前地址减去java虚拟机使用的基地址;
步骤p3:判断临时对象索引值是否大于最大索引值,是则执行步骤112-5,否则执行步骤p4;
在本实施例中,如步骤p3中的临时对象索引值大于最大索引值,则相邻对象索引值为0;
步骤p4:根据临时对象的索引值获取临时对象的偏移地址;
本实施例中,步骤p4具体为:用临时对象的索引值除以子对象表长度,商为主对象表的表项索引值,余数为子对象表的表项索引值,根据主对象表的表项索引值获取子对象表的偏移地址,根据子对象表的表项索引值和子对象表的偏移地址找到对应的子对象表的表项,获取该表项存储的临时对象的偏移地址;
步骤p5:判断临时对象的偏移地址是否大于当前偏移地址,是则用临时对象索引值更新相邻对象的索引值,将临时对象偏移地址作为相邻对象的偏移地址,临时对象索引值自加1,执行步骤p6,否则临时对象索引值自加1,返回步骤p3;
步骤p6:判断临时对象索引值是否大于最大索引值,是则执行步骤112-5,否则执行步骤p7;
步骤p7:根据临时对象索引值获取临时对象的偏移地址;
本实施例中该步骤的获取方法与步骤p4中的相同,在此不再赘述;
步骤p8:判断临时对象的偏移地址是否大于当前偏移地址,是则执行步骤p9,否则临时对象的索引值自加1,返回步骤p6;
步骤p9:判断临时对象的偏移地址是否小于相邻对象偏移地址,是则用临时对象索引值更新相邻对象的索引值,用临时对象的偏移地址更新相邻对象的偏移地址,临时对象索引值自加1,返回步骤p6,否则临时对象索引值自加1,返回步骤p6;
步骤112-5:java卡虚拟机判断相邻对象的索引值是否为空,是则执行步骤112-6,否执行步骤112-7;
本实施例中,步骤112-5具体为:判断相邻对象的索引值是否为0,是则为空,否则不为空;
步骤112-6:java卡虚拟机获取第二存储空间中已使用空间的末地址与当前地址之间的碎片大小,并加到第二存储空间的总碎片大小上,执行步骤112-13;
本实施例中的第二存储空间的总碎片大小初始值为0;
步骤112-7:java卡虚拟机获取相邻对象的地址与当前地址之间的碎片大小,并加在第二存储空间的总碎片大小上,将相邻对象作为当前对象,相邻对象的地址作为当前地址,执行步骤112-8;
具体的,在本实施例中,相邻对象的地址与当前地址之间的碎片大小具体为:相邻对象的地址与当前地址的差值;
步骤112-8:java卡虚拟机获取当前对象大小,并判断当前对象是否需要回收,是则执行步骤112-9;否则执行步骤112-10;
具体的,在本实施例中,当前对象为永久对象时其大小为对象头和数据域所占空间总和,当前对象为临时对象时其大小为对象头的大小;
本实施例中,java卡虚拟机判断对象是否被调用,是则不需要回收,否则需要回收;
步骤112-9:java卡虚拟机将当前对象大小加到第二存储空间总碎片大小上,并清空该子对象表中存储当前对象的偏移地址的表项,判断当前对象的索引值是否小于存储的第一索引值,是则用当前对象的索引值更新存储的第一索引值,执行步骤112-12,否则执行步骤112-12;
步骤112-10:java卡虚拟机判断第二存储空间总碎片大小是否为0,是则执行步骤112-12,否则执行步骤112-11;
步骤112-11:java卡虚拟机将当前对象向低地址方向移动第二存储空间总碎片大小,并更新存储在子对象表中的当前对象的偏移地址,执行步骤112-12;
具体的,本实施例中在步骤112-11之后,当前对象的地址变为对象原来的地址-第二存储空间总碎片大小;
步骤112-12:java卡虚拟机将当前地址自加当前对象大小,返回步骤112-2;
步骤112-13:java卡虚拟机判断第二存储空间的总碎片大小是否为0,是则返回步骤101;否则将第二存储空间已使用空间的末地址向低地址方向移动第二存储空间总碎片大小,返回步骤101;
步骤113:java卡虚拟机从操作栈中取出要修改对象的索引值及修改的参数,根据要修改对象的索引值计算得到主对象表中存储子对象表偏移地址的表项和子对象表中存储要修改对象偏移地址的表项;
本实施例中根据要修改对象的索引值计算得到主对象表中存储子对象表偏移地址的表项和子对象表中存储要修改对象偏移地址的表项具体为:
用要修改对象的索引值除以子对象表长度,商即为主对象表中存储子对象表偏移地址的表项编号;余数即为子对象表中存储要修改对象偏移地址的表项编号;
步骤114:java卡虚拟机根据子对象表的偏移地址获取对应子对象表,从对应子对象表中存储的所述要修改对象偏移地址的表项中获取要修改对象的偏移地址,检查修改参数的有效性,如参数无效则报错,返回步骤101;如参数有效则根据要修改对象偏移地址获取对象,并修改其数据域,返回步骤101;
例如,在本实施例中,要修改对象的索引值为25,子对象表长度为10,则用25除以10,商2,余5,则在主对象表中获取第3个表项,从该表项中获取子对象表的偏移地址(如0x1c),再从该子对象表中获取第6个表项,从该表项中获取将要修改对象的偏移地址。
下面,以具体实例来详述本发明实施例二的实现过程;
如图6a-6c所示,为创建对象的实现过程。其中图6a中的主对象表中有空表项,子对象表中也有空表项,则可以直接将创建的对象8的偏移地址存储到子对象表的空表项中;图6b中的主对象表中有空表项,子对象表中没有空表项,则需从第一存储区申请一固定大小的空间建立新的子对象表3(参见图6c),并将创建的对象8的偏移地址存储在子对象表3中的第一个空表项中。
java虚拟机在进行删除CAP镜像时需回收该CAP镜像所占的空间,可能会引起子对象表的移动,如图6d所示,主对象表长度为3,子对象长度为10,子对象表1的偏移地址是0x50,子对象表2的偏移地址是0x10,基地址为0x00;子对象表1和子对象表2之间有一个CAP镜像,CAP镜像的偏移地址是0x20,大小为0x30。在CAP镜像未标记为碎片之前,主对象的第一个表项存储的是子对象表1的偏移地址0x50,第二个表项存储的是子对象表2的偏移地址0x10。当CAP镜像标记为碎片回收之后需要移动子对象表2,使子对象表2的偏移地址变成0x40,此时需要更新主对象表的第二个表项存储的内容为0x40(参见图6e)。
如图6f-6g所示,为虚拟机在进行垃圾回收时的实现过程,其中,主对象表长度为3,子对象长度为4、基地址是0x00。对象a的地址是0x40,大小是0x40,索引值是0;碎片的地址是0x80,碎片大小是0x20;对象b的地址是0xA0,大小是0x20,索引值是1,参见图6f。清除碎片后将对象b移动到0x80中。由于对象b的索引值是1,1对4取模得0,1对4取余得1。主对象表和子对象表中的表项均是从0开始编号,所以对象b的新偏移地址0x80存储在第1个子对象表的第2个表项里,第1个子对象表的偏移地址存储在主对象的第1个表项里。具体子对象表和主对象表中存储内容的变化如图6g。
本发明中实现方案中采用主对象表和子对象表,主对象表中存放各个子对象表的首地址,子对象中存放对象的偏移地址,对于每个引用对象的地方,只需填入对象的索引值,节省空间;且在进行垃圾回收操作时,在扫描第二存储空间的过程中如对象被移动,则只需修改存储在子对象表中的该对象的偏移地址,不需要在每个引用该对象的地方修改对象偏移地址,操作简单,用时较短,如果在删包后合并第一存储空间碎片过程中子对象表被移动了,则修改存储在主对象表中的该子对象表的偏移地址即可。
以上所述,仅为本发明较佳的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明公开的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应该以权利要求的保护范围为准。
Claims (12)
1.一种基于java卡虚拟机中对象管理的方法,其特征在于,包括:
步骤S1:java卡虚拟机在java卡程序运行过程中检测将要进行的操作,如是进行创建对象操作,则执行步骤S2;如是进行删除CAP镜像操作则执行步骤S7;如是进行垃圾回收操作,则执行步骤S12;如是进行修改对象操作,则执行步骤S17;
步骤S2:所述java卡虚拟机在第二存储空间中申请将要创建对象的空间,填入所述将要创建对象的基本信息,获得所述将要创建对象的偏移地址;
步骤S3:所述java卡虚拟机判断子对象表中是否有空表项,是则将所述空表项所在子对象表作为当前子对象表,执行步骤S6,否则执行步骤S4;
步骤S4:所述java卡虚拟机判断主对象表中是否有空表项,是则执行步骤S5,否则报错,返回步骤S1;
步骤S5:所述java卡虚拟机根据子对象表的长度从第一存储空间中申请空间建立新子对象表,并获取所述新子对象表的偏移地址,将所述新子对象表的偏移地址存储到所述主对象表的空表项中,将所述新子对象表作为当前子对象表并获取其第一个空表项,执行步骤S6;
步骤S6:java卡虚拟机将所述将要创建对象的偏移地址存储到当前子对象表的空表项中,计算所述将要创建对象的索引值并将其存储到操作栈中,并用所述将要创建对象的索引值更新存储的第一索引值,返回步骤S1;
步骤S7:所述java卡虚拟机将所述第一存储空间中的与删除CAP镜像ID对应的CAP镜像标记为碎片,获取所述第一存储空间中的地址最大的组件作为当前组件;
步骤S8:所述java卡虚拟机将所述第一存储空间中最高地址与当前组件地址之间的碎片大小加到第一存储空间的总碎片大小上,检测当前组件的类型,如为子对象表则执行步骤S9,如为CAP镜像则执行步骤S10;所述第一存储空间的总碎片大小初始值为0;
步骤S9:所述java卡虚拟机在所述第一存储空间中将所述子对象表向高地址方向移动所述第一存储空间的总碎片大小,修改存储在主对象表中所述子对象表的偏移地址,执行步骤S11;
步骤S10:所述java卡虚拟机在所述第一存储空间中将所述CAP镜像向高地址方向移动所述第一存储空间的总碎片大小,更新所述CAP镜像的地址,执行步骤S11;
步骤S11:所述java卡虚拟机判断在所述第一存储空间中是否存在地址较小的当前组件的相邻组件,是则将所述相邻组件作为当前组件,返回步骤S8,否则返回步骤S1;
步骤S12:所述java卡虚拟机扫描所述第二存储空间,合并碎片,判断是否有需要回收的对象,是则执行步骤S13,否则执行步骤S15;
步骤S13:所述java卡虚拟机将需要回收对象的大小加到第二存储空间的总碎片大小上,清空所述子对象表中存储所述需要回收对象的偏移地址的表项;所述第二存储空间的总碎片大小初始值为0;
步骤S14:所述java卡虚拟机判断所述需要回收对象的索引值是否小于存储的第一索引值,是则用所述需要回收对象的索引值更新所述第一索引值,返回步骤S12,否则返回步骤S12;
步骤S15:所述java卡虚拟机判断所述第二存储空间的总碎片大小是否为0,是则返回步骤S1,否则执行步骤S16;
步骤S16:所述java卡虚拟机根据所述第二存储空间的总碎片大小移动需要回收对象之后的对像,并更新所述子对象表中存储的移动对像的偏移地址,返回步骤S1;
步骤S17:所述java卡虚拟机从所述操作栈中取出要修改对象的索引值及修改参数,检查所述修改参数的有效性,如所述修改参数无效则报错,返回步骤S1;如所述修改参数有效则根据所述要修改对象的索引值获取对应的对象,并修改所述对象的数据域,返回步骤S1。
2.如权利要求1所述的方法,其特征在于,所述步骤S1具体为:
当所述java卡虚拟机在java卡程序运行过程中检测到预设字符时,则进行创建对象操作;
当所述java卡虚拟机在所述java卡程序运行过程中接收到预设APDU命令时,则根据所述APDU命令中的删除CAP镜像ID进行删除对应CAP镜像的操作;
当所述java卡虚拟机在所述java卡程序运行过程中检测到固定接口函数时,则在本条命令结束时进行垃圾回收操作;
当所述java卡虚拟机在java卡程序运行过程中检测到有赋值的对象时,则进行修改对象操作。
3.如权利要求1所述的方法,其特征在于,所述步骤S3-步骤S4具体包括:
步骤a1:所述java卡虚拟机根据存储的第一索引值计算得到子对象表的表项索引值和主对象表的表项索引值;
步骤a2:所述java卡虚拟机判断所述主对象表的表项索引值是否大于所述主对象表的长度,是则报错,返回步骤S1,否则执行步骤a3;
步骤a3:所述java卡虚拟机根据所述主对象表的表项索引值从主对象表的对应表项中获取子对象表的偏移地址;
步骤a4:所述java卡虚拟机判断所述子对象表的偏移地址是否为空,是则执行步骤S5,否则执行步骤a5;
步骤a5:所述java卡虚拟机根据所述子对象表的表项索引值获取对应表项,并判断所述对应表项是否为空,是则执行步骤S6,否则所述子对象表的表项索引值自加1,执行步骤a6;
步骤a6:所述java卡虚拟机判断所述子对象表的表项索引值是否大于所述子对象表的长度,是则所述主对象表的表项索引值自加1,返回步骤a2;否则执行步骤a5。
4.如权利要求3所述的方法,其特征在于,所述步骤a1具体为:所述java卡虚拟机用所述第一索引值除以子对象表的长度,商为所述主对象表的表项索引值,余数为所述子对象表的表项索引值。
5.如权利要求1所述的方法,其特征在于,所述步骤S6中计算所述将要创建对象的索引值,具体为:用主对象表的表项索引值乘以子对象表的长度,再加上当前子对象表的表项索引值得到所述将要创建对象的索引值。
6.如权利要求1所述的方法,其特征在于,所述步骤S7-步骤S11包括:
步骤b1:所述java卡虚拟机解析接收到的预设APDU命令得到所述删除CAP镜像ID,将所述第一存储空间中的与删除CAP镜像ID对应的CAP镜像标记为碎片;
步骤b2:所述java卡虚拟机获取所述第一存储空间的最高地址并将其作为当前地址;
步骤b3:所述java卡虚拟机判断当前地址是否大于第一存储空间中已使用空间的起始地址,是则执行步骤b4,否则执行步骤b5;
步骤b4:所述java卡虚拟机判断所述第一存储空间中是否有地址较小的相邻组件,是则第一存储空间的总碎片大小自加当前地址与所述相邻组件地址之间的碎片大小,执行步骤b6,否则第一存储空间的总碎片大小自加当前地址与第一存储空间中已使用空间的起始地址之间的碎片大小,执行步骤b5;所述第一存储空间的总碎片大小初始值为0;
步骤b5:所述java卡虚拟机判断所述第一存储空间的总碎片大小是否为0,是则返回步骤S1,否则将所述第一存储空间中已使用空间的起始地址向高地址方向移动第一存储空间的总碎片大小,返回步骤S1;
步骤b6:所述java卡虚拟机判断所述相邻组件是否为子对象表,是则执行步骤b7,否则相邻组件为CAP镜像,执行步骤b9;
步骤b7:所述java卡虚拟机将所述子对象表的地址作为当前地址,判断所述第一存储空间的总碎片大小是否为0,是则返回步骤b3,否则执行步骤b8;
步骤b8:所述java卡虚拟机在所述第一存储空间中将所述子对象表向高地址方向移动所述第一存储空间的总碎片大小,修改存储在主对象表中的所述子对象表的偏移地址,返回步骤b3;
步骤b9:所述java卡虚拟机将所述CAP镜像的地址作为当前地址,判断所述第一存储空间的总碎片大小是否为0,是则返回步骤b3,否则执行步骤b10;
步骤b10:所述java卡虚拟机在所述第一存储空间中将所述CAP镜像向高地址方向移动所述第一存储空间的总碎片大小,更新所述CAP镜像的地址,返回步骤b3。
7.如权利要求6所述的方法,其特征在于,所述步骤b4中,
所述当前地址与相邻组件的地址之间的碎片大小具体为:当前地址与相邻组件的地址加上相邻组件长度之和的差值;所述当前地址与第一存储空间中已使用空间的起始地址之间的碎片大小为:当前地址与所述第一存储空间中已使用空间的起始地址的差值。
8.如权利要求1所述的方法,其特征在于,所述步骤S12-步骤S16包括:
步骤c1:所述java卡虚拟机获取所述第二存储空间中的最低地址将其作为当前地址;
步骤c2:所述java卡虚拟机判断当前地址是否小于第二存储空间已使用空间的末地址,是则执行步骤c3,否则执行步骤c12;
步骤c3:所述java卡虚拟机根据当前地址获取当前对象的索引值,并判断当前对象的索引值是否为空,是则执行步骤c4,否则执行步骤c7;
步骤c4:所述java卡虚拟机获取地址较大的相邻对象的索引值,并判断所述相邻对象的索引值是否为空,是则执行步骤c5,否执行步骤c6;
步骤c5:所述java卡虚拟机获取所述第二存储空间中已使用空间的末地址与当前地址之间的碎片大小,并加到所述第二存储空间的总碎片大小上,执行步骤c12;
步骤c6:所述java卡虚拟机获取所述相邻对象的地址与当前地址之间的碎片大小,并加在所述第二存储空间的总碎片大小上,将所述相邻对象作为当前对象,将所述相邻对象的地址作为当前地址,执行步骤c7;
步骤c7:所述java卡虚拟机获取当前对象大小,并判断当前对象是否需要回收,是则执行步骤c8;否则执行步骤c9;
步骤c8:所述java卡虚拟机将所述当前对象大小加到所述第二存储空间的总碎片大小上,并清空子对象表中存储当前对象的偏移地址的表项,判断当前对象的索引值是否小于存储的第一索引值,是则用当前对象的索引值更新所述第一索引值,执行步骤c11,否则执行步骤c11;
步骤c9:所述java卡虚拟机判断所述第二存储空间的总碎片大小是否为0,是则执行步骤c11,否则执行步骤c10;
步骤c10:所述java卡虚拟机将当前对象向低地址方向移动所述第二存储空间的总碎片大小,并更新存储在所述子对象表中的当前对象的偏移地址,执行步骤c11;
步骤c11:所述java卡虚拟机将当前地址自加当前对象大小,返回步骤c2;
步骤c12:所述java卡虚拟机判断所述第二存储空间总碎片大小是否为0,是则返回步骤S1,否则将所述第二存储空间已使用空间的末地址向低地址方向移动所述第二存储空间的总碎片大小,返回步骤S1。
9.如权利要求8所述的方法,其特征在于,所述步骤c7中判断当前对象是否需要回收具体为:所述java卡虚拟机判断当前对象是否被调用,是则不需要回收,否则需要回收。
10.如权利要求8所述的方法,其特征在于,所述步骤c3中根据当前地址获取当前对象的索引值,具体为:
根据当前地址计算当前对象偏移地址,遍历对象表,如找到存储所述当前对象偏移地址的子对象表的表项和存储所述子对象表偏移地址的主对象表的表项,则根据主对象表的表项索引值和子对象表的表项索引值计算对象的索引值,计算方法具体为:主对象表的表项索引值与子对象表的长度的乘积加上子对象表的表项索引值得到当前对象的索引值;如果遍历完对象表,未找到当前对象偏移地址,则将当前对象的索引值赋为空。
11.如权利要求8所述的方法,其特征在于,所述步骤c4具体包括:
步骤c4-1:搜索主对象表和子对象表,按照所述主对象表的表项索引值从大到小的顺序,在各个与所述主对象表的表项索引值对应的子对象表中逆序查找最后一个非空表项并获取所述非空表项的索引值;
步骤c4-2:根据所述子对象表的所述非空表项的索引值和主对象表中存储对应子对象表偏移地址的表项的索引值计算最大索引值,所述最大索引值所对应的对象为存储在所述子对象表中最后一个非空表项中的对象,将相邻对象的索引值赋值为0,将临时对象索引值赋值为0,根据当前地址计算当前偏移地址;
步骤c4-3:判断所述临时对象索引值是否大于所述最大索引值,如大于则判断当前对象的索引值是否为空,是则执行步骤c5,否则执行步骤c6;如不大于则执行步骤c4-4;
步骤c4-4:根据所述临时对象的索引值获取临时对象的偏移地址;
步骤c4-5:判断所述临时对象的偏移地址是否大于所述当前偏移地址,是则用所述临时对象的索引值更新所述相邻对象的索引值,将所述临时对象偏移地址作为所述相邻对象的偏移地址,所述临时对象索引值自加1,执行步骤c4-6,否则所述临时对象的索引值自加1,返回步骤c4-3;
步骤c4-6:判断所述临时对象索引值是否大于所述最大索引值,如大于则判断当前对象的索引值是否为空,是则执行步骤c5,否则执行步骤c6;如不大于则执行步骤c4-7;
步骤c4-7:根据所述临时对象索引值获取临时对象的偏移地址;
步骤c4-8:判断所述临时对象的偏移地址是否大于所述当前偏移地址,是则执行步骤c4-9,否则所述临时对象的索引值自加1,返回步骤c4-6;
步骤c4-9:判断所述临时对象的偏移地址是否小于所述相邻对象的偏移地址,是则用所述临时对象的索引值更新所述相邻对象的索引值,用所述临时对象的偏移地址更新所述相邻对象的偏移地址,所述临时对象索引值自加1,返回步骤c4-6,否则所述临时对象的索引值自加1,返回步骤c4-6。
12.如权利要求1所述的方法,其特征在于,所述步骤S17包括:
步骤S17-1:所述java卡虚拟机从所述操作栈中取出要修改对象的索引值及修改的参数;
步骤S17-2:所述java卡虚拟机根据所述要修改对象的索引值计算得到主对象表中存储子对象表偏移地址的表项和子对象表中存储所述要修改对象偏移地址的表项,根据所述子对象表的偏移地址获取对应子对象表,从所述对应子对象表中存储的所述要修改对象偏移地址的表项中获取要修改对象的偏移地址;
步骤S17-3:所述java卡虚拟机检查修改参数的有效性,如所述修改参数无效则报错,返回步骤S1;如所述修改参数有效则根据所述要修改对象偏移地址获取对象,并修改所述对象的数据域,返回步骤S1。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310031158.0A CN103116518B (zh) | 2013-01-28 | 2013-01-28 | 一种基于java卡虚拟机中对象管理的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310031158.0A CN103116518B (zh) | 2013-01-28 | 2013-01-28 | 一种基于java卡虚拟机中对象管理的方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN103116518A CN103116518A (zh) | 2013-05-22 |
CN103116518B true CN103116518B (zh) | 2015-09-23 |
Family
ID=48414902
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201310031158.0A Expired - Fee Related CN103116518B (zh) | 2013-01-28 | 2013-01-28 | 一种基于java卡虚拟机中对象管理的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN103116518B (zh) |
Families Citing this family (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103559076B (zh) * | 2013-11-04 | 2016-09-28 | 飞天诚信科技股份有限公司 | 一种使用寄生对象管理对象堆的方法和装置 |
CN103955395B (zh) * | 2014-04-28 | 2017-02-22 | 飞天诚信科技股份有限公司 | 一种可进行高效对象管理的方法及装置 |
CN110287695B (zh) * | 2019-06-25 | 2020-12-25 | 恒宝股份有限公司 | 一种Java卡及其临时对象的管理方法 |
CN115309766B (zh) * | 2022-10-12 | 2023-03-24 | 北京奥星贝斯科技有限公司 | 一种数据库业务执行的方法及装置 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101221535B (zh) * | 2008-01-25 | 2010-06-09 | 中兴通讯股份有限公司 | Java虚拟机的垃圾回收移动通信终端及回收方法 |
CN102253854A (zh) * | 2011-07-26 | 2011-11-23 | 华为技术有限公司 | 业务处理方法和Java虚拟机 |
CN102521094A (zh) * | 2011-11-28 | 2012-06-27 | 飞天诚信科技股份有限公司 | 一种对java卡进行初始化的方法和java卡 |
-
2013
- 2013-01-28 CN CN201310031158.0A patent/CN103116518B/zh not_active Expired - Fee Related
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101221535B (zh) * | 2008-01-25 | 2010-06-09 | 中兴通讯股份有限公司 | Java虚拟机的垃圾回收移动通信终端及回收方法 |
CN102253854A (zh) * | 2011-07-26 | 2011-11-23 | 华为技术有限公司 | 业务处理方法和Java虚拟机 |
CN102521094A (zh) * | 2011-11-28 | 2012-06-27 | 飞天诚信科技股份有限公司 | 一种对java卡进行初始化的方法和java卡 |
Also Published As
Publication number | Publication date |
---|---|
CN103116518A (zh) | 2013-05-22 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN103116518B (zh) | 一种基于java卡虚拟机中对象管理的方法 | |
CN102521145B (zh) | Java卡系统及其空间分配处理方法 | |
US7630998B2 (en) | Performing a deletion of a node in a tree data storage structure | |
US7480782B2 (en) | Reference-updating using per-chunk referenced-address ranges in a compacting garbage collector | |
US6757890B1 (en) | Methods and apparatus for enabling local Java object allocation and collection | |
CN105550123B (zh) | 电子装置及其存储空间管理方法 | |
US10372601B2 (en) | Managing memory in a computer system | |
US20020087589A1 (en) | Methods and apparatus for optimizing garbage collection | |
CN102567427B (zh) | 一种对象数据处理方法及装置 | |
US7412466B1 (en) | Offset-based forward address calculation in a sliding-compaction garbage collector | |
CN101840373B (zh) | 数据操作方法及装置 | |
CN103188097A (zh) | 一种实现补丁管理的方法、装置及系统 | |
CN103412825B (zh) | 一种内存释放方法及装置 | |
EP4012568A1 (en) | System and method for dynamically selecting a garbage collection algorithm based on the contents of heap regions | |
US20090030959A1 (en) | Associative references in a garbage collected programming environment | |
CN105786538A (zh) | 基于安卓系统的软件升级方法和装置 | |
EP3504628A1 (en) | Memory management method and device | |
CN1139032C (zh) | 减少存储器需求的程序代码执行装置和方法 | |
US6721865B2 (en) | Elimination of coloring during object creation for concurrent garbage collection | |
CN106708507A (zh) | 一种基于Android系统优化开机应用安装时间的方法 | |
CN102065192B (zh) | 一种话单排重方法和装置 | |
CN103559076A (zh) | 一种使用寄生对象管理对象堆的方法和装置 | |
US6636866B1 (en) | System and method for object representation in an object-oriented programming language | |
CN113821300A (zh) | 一种虚拟机管理方法和相关装置 | |
CN104808968A (zh) | 全局数据的存储、上报方法与装置和系统 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20150923 |