CN103955395B - 一种可进行高效对象管理的方法及装置 - Google Patents
一种可进行高效对象管理的方法及装置 Download PDFInfo
- Publication number
- CN103955395B CN103955395B CN201410174222.5A CN201410174222A CN103955395B CN 103955395 B CN103955395 B CN 103955395B CN 201410174222 A CN201410174222 A CN 201410174222A CN 103955395 B CN103955395 B CN 103955395B
- Authority
- CN
- China
- Prior art keywords
- offset address
- heap
- address
- initial value
- virtual machine
- 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
- 230000004048 modification Effects 0.000 claims abstract description 113
- 238000012986 modification Methods 0.000 claims abstract description 113
- 239000012634 fragment Substances 0.000 claims description 64
- 238000011084 recovery Methods 0.000 claims description 38
- 230000008569 process Effects 0.000 claims description 21
- 230000000630 rising effect Effects 0.000 claims description 5
- 230000008859 change Effects 0.000 claims description 4
- 230000005611 electricity Effects 0.000 claims description 4
- 230000005540 biological transmission Effects 0.000 claims description 3
- 238000007726 management method Methods 0.000 description 13
- 238000010586 diagram Methods 0.000 description 3
- 230000003068 static effect Effects 0.000 description 2
- 230000000712 assembly Effects 0.000 description 1
- 238000000429 assembly Methods 0.000 description 1
- 230000000295 complement effect Effects 0.000 description 1
- 238000013500 data storage Methods 0.000 description 1
- 230000007812 deficiency Effects 0.000 description 1
- 238000009795 derivation Methods 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 238000005516 engineering process Methods 0.000 description 1
- 238000011423 initialization method Methods 0.000 description 1
- 230000008439 repair process Effects 0.000 description 1
- 238000012163 sequencing technique Methods 0.000 description 1
Landscapes
- Debugging And Monitoring (AREA)
- Stored Programmes (AREA)
Abstract
本发明公开一种可进行高效对象管理的方法和装置,包括:S1:java卡虚拟机接收来自当前应用程序的指令,若是创建对象指令则执行S2,若是修改对象指令则执行S5;S2:根据创建对象指令获取当前应用实例、对象大小、对象类型和对象地址位置;S3:从系统信息中获取对象堆的剩余空间的起始偏移地址;S4:按照对象大小和对象类型创建对象,更新对象堆的剩余空间的起始偏移地址,将创建的对象的偏移地址存入当前应用实例中,返回S1;S5:根据修改对象指令获取对象偏移地址、修改位置和修改内容;S6:将对象偏移地址上的对象的所述修改位置上的数据修改为所述修改内容,返回S1。
Description
技术领域
本发明涉及java卡技术领域,尤其涉及一种可进行高效对象管理的方法及装置。
背景技术
java卡中使用对象来保存一些数据,对象包括对象头和数据域,对象头和数据域可以分开存储,也可以连续存储。永久性对象的对象头和数据域顺序排列的存储在EEPROM中;临时对象的对象头和数据域是分开存储的,其中对象头存储在EEPROM中,而数据域存储在RAM中。永久性对象和临时对象的对象头在EEPROM中按创建的先后顺序排列。java卡运行时需要创建新对象,然后对这些对象进行管理。
目前,java卡虚拟机中基于对象表的对象管理方法中,java卡虚拟机中包括子对象表和主对象表,其中子对象表的表项中存储对象的偏移地址,主对象表的表项中存储子对象表的偏移地址,在对对象进行操作时,首先根据对象的主对象表索引值在主对象表中查找对应的子对象表的偏移地址,再根据对象的子对象表索引值在子对象表中查找对象的偏移地址,根据查找到的对象的偏移地址计算对象的绝对地址,之后再对象进行操作;在垃圾回收过程中,也需要根据被回收对象的主对象表索引值在主对象表中查找对应的子对象表的偏移地址,再根据被回收对象的子对象表索引值在子对象表中查找被回收对象的偏移地址,将查找到的偏移地址清空。因此,java卡虚拟机中基于对象表的对象管理方法中,java卡虚拟机需要进行两次查表操作,操作流程复杂,效率低,耗时多。
发明内容
本发明的目的是为了克服现有技术的不足,提供一种可进行高效对象管理的方法及装置,在对对象进行操作时不需查找子对象表和主对象表,简化了java卡虚拟机的操作流程,提高java卡虚拟机工作效率。
本发明提供的一种可进行高效对象管理的方法,包括:
步骤S1:java卡虚拟机接收来自当前应用程序的指令,判断所述指令的类型,若是创建对象指令则执行步骤S2,若是修改对象指令则执行步骤S5;
步骤S2:所述java卡虚拟机根据所述创建对象指令获取与所述当前应用程序对应的应用实例的偏移地址,将所述偏移地址上的应用实例作为当前应用实例,根据所述创建对象指令获取对象大小、对象类型和对象地址位置;
步骤S3:所述java卡虚拟机从系统信息中获取对象堆的剩余空间的起始偏移地址;
步骤S4:所述java卡虚拟机将所述对象堆的剩余空间的起始偏移地址作为创建的对象的偏移地址,按照所述对象大小和所述对象类型创建对象,根据所述对象大小更新所述系统信息中的所述对象堆的剩余空间的起始偏移地址,根据当前应用实例的偏移地址将所述创建的对象的偏移地址存入到当前应用实例中与所述对象地址位置对应的位置中,返回步骤S1;
步骤S5:所述java卡虚拟机根据所述修改对象指令获取对象地址位置,根据所述对象地址位置从当前应用实例中获取对象偏移地址,根据所述修改对象指令获取修改位置和修改内容;
步骤S6:所述java卡虚拟机根据所述对象偏移地址和所述修改位置,将所述对象偏移地址上的对象中所述修改位置上的数据修改为所述修改内容,返回步骤S1。
所述步骤S1之前还包括:所述java卡虚拟机接收用户发送的选择应用指令,根据所述选择应用指令获取应用ID,根据所述应用ID查找对应的应用程序,并判断是否查找到与所述应用ID对应的应用程序,是则将查找到的所述应用程序作为当前应用程序,执行步骤S1,否则提示错误,结束。
所述步骤S2具体为:所述java卡虚拟机对所述创建对象指令进行编译,得到第一编译指令,根据所述第一编译指令获取与所述当前应用程序对应的应用实例的偏移地址,将所述偏移地址上的应用实例作为当前应用实例,根据所述第一编译指令获取对象大小、对象类型和对象地址位置。
所述步骤S2中根据所述创建对象指令获取对象大小为:所述java卡虚拟机从所述创建对象指令中获取所述对象大小。
所述步骤S2中根据所述创建对象指令获取对象大小为:所述java卡虚拟机从所述创建对象指令中获取存储区的偏移地址和数据在存储区中的位置,根据所述存储区的偏移地址,在存储区中根据所述数据在存储区中的位置获取数据,将获取到的数据作为所述对象大小。
所述步骤S3与步骤S4之间包括:所述java卡虚拟机从所述系统信息中获取对象堆大小,根据所述对象堆大小和所述对象堆的剩余空间的起始偏移地址得到对象堆的剩余空间大小,判断所述对象堆的剩余空间大小是否大于所述对象大小,是则执行步骤S4,否则提示错误,返回步骤S1。
所述步骤S5具体为:所述java卡虚拟机对所述修改对象指令进行编译,得到第二编译指令,根据所述第二编译指令获取对象地址位置,根据所述对象地址位置从当前应用实例中获取对象偏移地址,根据所述第二编译指令获取修改位置和修改内容。
所述步骤S5中根据所述修改对象指令获取修改内容为:所述java卡虚拟机从所述修改对象指令中获取所述修改内容。
所述步骤S5中根据所述修改对象指令获取修改内容为:所述java卡虚拟机从所述修改对象指令中获取存储区的偏移地址和数据在存储区中的位置,根据所述存储区的偏移地址,在存储区中根据所述数据在存储区中的位置获取数据,将获取到的数据作为所述修改内容。
所述步骤S1中判断所述指令的类型,还包括,若是删包指令则执行步骤S7;
步骤S7:所述java卡虚拟机扫描包堆,根据所述包堆中的组件的偏移地址计算出包堆碎片,对所述包堆碎片进行合并,执行步骤S8;
步骤S8:所述java卡虚拟机扫描对象堆,将对象堆中需要被回收的对象作为对象堆碎片进行合并,并将合并过程中的对象偏移地址的初值、对象偏移地址的终值和对象堆碎片大小记录到系统信息中,返回步骤S1。
所述步骤S7具体为:
步骤S7-1:所述java卡虚拟机获取所述包堆的最高偏移地址,并将其作为当前偏移地址;
步骤S7-2:所述java卡虚拟机判断所述当前偏移地址是否大于包堆剩余空间的起始偏移地址,是则执行步骤S7-3;否则执行步骤S7-8;
步骤S7-3:所述java卡虚拟机在所述包堆中查找偏移地址小于当前偏移地址的组件,判断是否查找到偏移地址小于当前偏移地址的组件,是则执行步骤S7-4,否则执行步骤S7-7;
步骤S7-4:所述java卡虚拟机在查找到的所述组件中获取偏移地址最大的组件作为当前组件的相邻组件,根据当前偏移地址与所述相邻组件的偏移地址之间的碎片大小更新包堆碎片大小,执行步骤S7-5;
步骤S7-5:所述java卡虚拟机根据所述相邻组件的偏移地址更新当前偏移地址,根据当前偏移地址更新当前组件,判断所述包堆碎片大小是否为0,是则返回步骤S7-2,否则执行步骤S7-6;
步骤S7-6:所述java卡虚拟机根据所述包堆碎片大小,将当前组件向高地址方向移动,返回步骤S7-2;
步骤S7-7:所述java卡虚拟机根据当前偏移地址与所述包堆剩余空间的起始偏移地址之间的碎片大小更新所述包堆碎片大小,执行步骤S7-8;
步骤S7-8:所述java卡虚拟机判断所述包堆碎片大小是否为0,是则执行步骤S8,否则根据所述包堆碎片大小更新所述包堆剩余空间的起始偏移地址,执行步骤S8。
所述步骤S8具体为:
步骤S8-1:所述java卡虚拟机初始化所述系统信息中的对象偏移地址的初值、对象偏移地址的终值和对象堆碎片大小,获取对象堆剩余空间的起始偏移地址;
步骤S8-2:所述java卡虚拟机判断所述对象偏移地址的初值是否小于所述对象堆剩余空间的起始偏移地址,是则执行步骤S8-3,否则执行步骤S8-8;
步骤S8-3:所述java卡虚拟机记录所述对象偏移地址的初值的位置上的对象的大小,判断所述对象偏移地址的初值的位置上的对象是否需要回收,是则执行步骤S8-4,否则执行步骤S8-5;
步骤S8-4:所述java卡虚拟机根据记录的所述对象的大小更新所述系统信息中的所述对象堆碎片大小,将所述对象堆中使用所述对象偏移地址的初值的位置设置为空,执行步骤S8-7;
步骤S8-5:所述java卡虚拟机判断所述对象堆碎片大小是否为0,是则执行步骤S8-7,否则执行步骤S8-6;
步骤S8-6:所述java卡虚拟机根据所述对象偏移地址的初值和所述对象堆碎片大小更新所述系统信息中的所述对象偏移地址的终值,将所述对象偏移地址的初值的位置上的对象移动到所述对象偏移地址的终值的位置上,将所述对象堆中使用的所述对象偏移地址的初值更新为所述记录的对象偏移地址的终值,执行步骤S8-7;
步骤S8-7:所述java卡虚拟机根据记录的所述对象的大小更新所述记录的对象偏移地址的初值,返回步骤S8-2;
步骤S8-8:所述java卡虚拟机判断所述对象堆碎片大小是否为0,是则执行步骤S8-10,否则执行步骤S8-9;
步骤S8-9:所述java卡虚拟机根据所述对象堆碎片大小更新所述对象堆剩余空间的起始偏移地址,执行步骤S8-10;
步骤S8-10:所述java卡虚拟机清空所述系统信息中的所述对象偏移地址的初值、所述对象偏移地址的终值和所述对象堆碎片大小,返回步骤S1。
所述步骤S5与步骤S6之间包括:所述java卡虚拟机判断获取到的所述对象偏移地址是否为空,是则提示错误,返回步骤S1,否则执行步骤S6。
所述步骤S1中判断所述指令的类型,还包括,若是垃圾回收指令则执行步骤S9;
步骤S9:所述java卡虚拟机扫描对象堆,将所述对象堆中需要被回收的对象作为对象堆碎片进行合并,并将合并过程中的对象偏移地址的初值、对象偏移地址的终值和对象堆碎片大小记录到系统信息中,返回步骤S1。
所述步骤S9具体为:
步骤S9-1:所述java卡虚拟机初始化所述系统信息中的对象偏移地址的初值、对象偏移地址的终值和对象堆碎片大小,获取对象堆剩余空间的起始偏移地址;
步骤S9-2:所述java卡虚拟机判断所述对象偏移地址的初值是否小于所述对象堆剩余空间的起始偏移地址,是则执行步骤S9-3,否则执行步骤S9-8;
步骤S9-3:所述java卡虚拟机记录所述对象偏移地址的初值的位置上的对象的大小,判断所述对象偏移地址的初值的位置上的对象是否需要回收,是则执行步骤S9-4,否则执行步骤S9-5;
步骤S9-4:所述java卡虚拟机根据记录的所述对象的大小更新所述系统信息中的所述对象堆碎片大小,将所述对象堆中使用所述对象偏移地址的初值的位置设置为空,执行步骤S9-7;
步骤S9-5:所述java卡虚拟机判断所述对象堆碎片大小是否为0,是则执行步骤S9-7,否则执行步骤S9-6;
步骤S9-6:所述java卡虚拟机根据所述对象偏移地址的初值和所述对象堆碎片大小更新所述系统信息中的所述对象偏移地址的终值,将所述对象偏移地址的初值的位置上的对象移动到所述对象偏移地址的终值的位置上,将所述对象堆中使用的所述对象偏移地址的初值更新为所述对象偏移地址的终值,执行步骤S9-7;
步骤S9-7:所述java卡虚拟机根据记录的所述对象的大小更新所述记录的对象偏移地址的初值,返回步骤S9-2;
步骤S9-8:所述java卡虚拟机判断所述对象堆碎片大小是否为0,是则执行步骤S9-10,否则执行步骤S9-9;
步骤S9-9:所述java卡虚拟机根据所述对象堆碎片大小更新所述对象堆剩余空间的起始偏移地址,执行步骤S9-10;
步骤S9-10:所述java卡虚拟机清空所述系统信息中的所述对象偏移地址的初值、所述对象偏移地址的终值和所述对象堆碎片大小,返回步骤S1。
所述步骤S5与步骤S6之间包括:所述java卡虚拟机判断获取到的所述对象偏移地址是否为空,是则提示错误,返回步骤S1,否则执行步骤S6。
所述步骤S1之前包括:
步骤S0:所述java卡虚拟机根据系统信息中在对象堆碎片进行合并过程中记录的所述对象堆碎片大小判断是否需要进行掉电恢复,是则执行步骤S10,否则执行步骤S1;
步骤S10:所述java卡虚拟机根据系统信息中在对象堆碎片进行合并过程中记录的所述对象偏移地址的初值和所述对象偏移地址的终值进行掉电恢复后,执行步骤S1。
所述步骤S10包括:
步骤S10-1:所述java卡虚拟机获取所述系统信息中在对象堆碎片进行合并过程中记录的所述对象偏移地址的初值和所述对象偏移地址的终值;
步骤S10-2:所述java卡虚拟机扫描对象堆,将所述对象堆中使用的所述对象偏移地址的初值更新为记录的所述对象偏移地址的终值,获取所述对象堆的尾地址;
步骤S10-3:所述java卡虚拟机根据所述记录的对象偏移地址的终值的位置上的对象的大小更新记录的对象偏移地址的初值,判断所述记录的对象偏移地址的初值是否小于所述对象堆剩余空间的起始偏移地址,是则执行步骤S10-4,否则执行步骤S10-6;
步骤S10-4:所述java卡虚拟机根据所述记录的对象偏移地址的初值和所述对象堆碎片大小更新所述记录的对象偏移地址的终值,将所述记录的对象偏移地址的初值的位置上的对象移动到所述记录的对象偏移地址的终值的位置上;
步骤S10-5:所述java卡虚拟机将所述对象堆中使用的所述对象偏移地址的初值更新为所述记录的对象偏移地址的终值,返回步骤S10-3;
步骤S10-6:所述java卡虚拟机根据所述对象堆碎片大小更新所述系统信息中的所述对象堆剩余空间的起始偏移地址,清空所述系统信息中记录的对象偏移地址的初值、所述对象偏移地址的终值和所述对象堆碎片大小,执行步骤S1。
一种可进行高效对象管理的装置,包括:接收模块、第一判断模块、第一获取模块、第二获取模块、创建模块、第三获取模块和修改模块;
所述接收模块,用于接收来自当前应用程序的指令;
所述第一判断模块,用于判断所述接收模块接收到的所述指令的类型;
所述第一获取模块,用于在所述第一判断模块判断所述指令的类型为创建对象指令时,根据所述创建对象指令获取与所述当前应用程序对应的应用实例的偏移地址,将所述偏移地址上的应用实例作为当前应用实例,根据所述创建对象指令获取对象大小、对象类型和对象地址位置;
所述第二获取模块,用于从系统信息中获取对象堆的剩余空间的起始偏移地址;
所述创建模块,用于将所述第二获取模块获取到的所述对象堆的剩余空间的起始偏移地址作为创建的对象的偏移地址,按照所述第一获取模块获取到的所述对象大小和所述对象类型创建对象,根据所述对象大小更新所述系统信息中的所述对象堆的剩余空间的起始偏移地址,根据当前应用实例的偏移地址将所述创建的对象的偏移地址存入到当前应用实例中与所述对象地址位置对应的位置中;
所述第三获取模块,用于在所述第一判断模块判断所述指令的类型为修改对象指令时,根据所述修改对象指令获取对象地址位置,根据所述对象地址位置从当前应用实例中获取对象偏移地址,根据所述修改对象指令获取修改位置和修改内容;
所述修改模块,用于根据所述第三获取模块获取到的所述对象偏移地址和所述修改位置,将所述对象偏移地址上的对象中所述修改位置上的数据修改为所述第三获取模块获取到的所述修改内容。
所述接收模块还用于接收用户发送的选择应用指令;
所述装置还包括查找模块和提示模块;
所述查找模块,用于根据所述接收模块接收到的所述选择应用指令获取应用ID,根据所述应用ID查找对应的应用程序,并判断是否查找到与所述应用ID对应的应用程序,是则将查找到的所述应用程序作为当前应用程序;
所述提示模块,用于在所述查找模块未查找到与所述应用ID对应的应用程序时,提示错误;
所述接收模块还用于在所述查找模块查找到与所述应用ID对应的应用程序时,进行工作。
所述第一获取模块包括:第一编译单元和第一获取单元;
所述第一编译单元,用于对所述创建对象指令进行编译,得到第一编译指令;
所述第一获取单元,用于根据所述第一编译单元编译得到的所述第一编译指令获取与所述当前应用程序对应的应用实例的偏移地址,将所述偏移地址上的应用实例作为当前应用实例,根据所述第一编译单元编译得到的所述第一编译指令获取对象大小、对象类型和对象地址位置。
所述第一获取模块具体用于在所述第一判断模块判断所述指令的类型为创建对象指令时,根据所述创建对象指令获取与所述当前应用程序对应的应用实例的偏移地址,将所述偏移地址上的应用实例作为当前应用实例,从所述创建对象指令中获取所述对象大小,根据所述创建对象指令获取对象类型和对象地址位置。
所述第一获取模块具体用于在所述第一判断模块判断所述指令的类型为创建对象指令时,根据所述创建对象指令获取与所述当前应用程序对应的应用实例的偏移地址,将所述偏移地址上的应用实例作为当前应用实例,从所述创建对象指令中获取存储区的偏移地址和数据在存储区中的位置,根据所述存储区的偏移地址,在存储区中根据所述数据在存储区中的位置获取数据,将获取到的数据作为所述对象大小,根据所述创建对象指令获取对象类型和对象地址位置。
所述装置还包括第四获取模块、第二判断模块和提示模块;
所述第四获取模块,用于从所述系统信息中获取对象堆大小,根据所述对象堆大小和所述对象堆的剩余空间的起始偏移地址得到对象堆的剩余空间大小;
所述第二判断模块,用于判断所述对象堆的剩余空间大小是否大于所述对象大小;
所述提示模块,用于在所述第二判断模块判断为否时,提示错误;
所述创建模块还用于在所述第二判断模块判断为是时,进行工作。
所述第三获取模块包括:第二编译单元和第二获取单元;
所述第二编译单元,用于对所述修改对象指令进行编译,得到第二编译指令;
所述第二获取单元,用于根据所述第二编译单元编译得到的所述第二编译指令获取对象地址位置,根据所述对象地址位置从当前应用实例中获取对象偏移地址,根据所述第二编译指令获取修改位置和修改内容。
所述第三获取模块具体用于在所述第一判断模块判断所述指令的类型为修改对象指令时,根据所述修改对象指令获取对象地址位置,根据所述对象地址位置从当前应用实例中获取对象偏移地址,从所述修改对象指令中获取所述修改内容,根据所述修改对象指令获取修改位置。
所述第三获取模块具体用于在所述第一判断模块判断所述指令的类型为修改对象指令时,根据所述修改对象指令获取对象地址位置,根据所述对象地址位置从当前应用实例中获取对象偏移地址,从所述修改对象指令中获取存储区的偏移地址和数据在存储区中的位置,根据所述存储区的偏移地址,在存储区中根据所述数据在存储区中的位置获取数据,将获取到的数据作为所述修改内容,根据所述修改对象指令获取修改位置。
所述装置还包括第一合并模块和第二合并模块;
所述第一合并模块,用于在所述第一判断模块判断所述指令的类型为删包指令时,扫描包堆,根据所述包堆中的组件的偏移地址计算出包堆碎片,对所述包堆碎片进行合并;
所述第二合并模块,用于在所述第一合并模块对所述包堆碎片进行合并后,扫描对象堆,将对象堆中需要被回收的对象作为对象堆碎片进行合并,并将合并过程中的对象偏移地址的初值、对象偏移地址的终值和对象堆碎片大小记录到系统信息中。
所述第一合并模块包括:第三获取单元、第一判断单元、查找单元、第四获取单元、第一更新单元、第二判断单元、第一移动单元、第二更新单元和第三更新单元;
所述第三获取单元,用于在所述第一判断模块判断所述指令的类型为删包指令时,获取所述包堆的最高偏移地址,并将其作为当前偏移地址;
所述第一判断单元,用于判断所述当前偏移地址是否大于包堆剩余空间的起始偏移地址;
所述查找单元,用于当所述第一判断单元判断当前偏移地址大于包堆剩余空间的起始偏移地址时,在所述包堆中查找偏移地址小于当前偏移地址的组件,判断是否查找到偏移地址小于当前偏移地址的组件;
所述第四获取单元,用于当所述查找单元查找到偏移地址小于当前偏移地址的组件时,在查找到的所述组件中获取偏移地址最大的组件作为当前组件的相邻组件,根据当前偏移地址与所述相邻组件的偏移地址之间的碎片大小更新包堆碎片大小;
所述第一更新单元,用于根据所述第四获取单元获取到的所述相邻组件的偏移地址更新当前偏移地址,根据当前偏移地址更新当前组件;
所述第二判断单元,用于判断所述包堆碎片大小是否为0;
所述第一移动单元,用于当所述第二判断单元判断为否时,根据所述包堆碎片大小,将当前组件向高地址方向移动;
所述第二更新单元,用于当所述查找单元查找不到偏移地址小于当前偏移地址的组件时,根据当前偏移地址与所述包堆剩余空间的起始偏移地址之间的碎片大小更新所述包堆碎片大小;
所述第三更新单元,用于根据所述包堆碎片大小更新所述包堆剩余空间的起始偏移地址。
所述第二合并模块包括:第五获取单元、第三判断单元、第一记录单元、第四判断单元、第四更新单元、第一设置单元、第五判断单元、第五更新单元、第二移动单元、第六更新单元、第七更新单元、第八更新单元和第一清除单元;
所述第五获取单元,用于初始化所述系统信息中的对象偏移地址的初值、对象偏移地址的终值和对象堆碎片大小,获取对象堆剩余空间的起始偏移地址;
所述第三判断单元,用于判断所述对象偏移地址的初值是否小于所述对象堆剩余空间的起始偏移地址;
所述第一记录单元,用于当所述第三判断单元判断为是时,记录所述对象偏移地址的初值的位置上的对象的大小;
所述第四判断单元,用于判断所述对象偏移地址的初值的位置上的对象是否需要回收;
所述第四更新单元,用于当所述第四判断单元判断为是时,根据记录的所述对象的大小更新所述系统信息中的所述对象堆碎片大小;
所述第一设置单元,用于当所述第四判断单元判断为是时,将所述对象堆中使用所述对象偏移地址的初值的位置设置为空;
所述第五判断单元,用于判断所述对象堆碎片大小是否为0;
所述第五更新单元,用于当所述第五判断单元判断为否时,根据所述对象偏移地址的初值和所述对象堆碎片大小更新所述系统信息中的所述对象偏移地址的终值;
所述第二移动单元,用于当第五更新单元更新所述对象偏移地址的终值后,将所述对象偏移地址的初值的位置上的对象移动到所述对象偏移地址的终值的位置上;
所述第六更新单元,用于当所述第二移动单元移动对象后,将所述对象堆中使用的所述对象偏移地址的初值更新为所述对象偏移地址的终值;
所述第七更新单元,用于当所述第五判断单元判断为否时,或当所述第一设置模块将所述对象堆中使用所述对象偏移地址的初值的位置设置为空后,或当所述第六更新单元将所述对象堆中使用的所述对象偏移地址的初值更新为所述对象偏移地址的终值后,根据记录的所述对象的大小更新所述系统信息中的所述对象偏移地址的初值;
所述第八更新单元,用于根据所述对象堆碎片大小更新所述对象堆剩余空间的起始偏移地址;
所述第一清除单元,用于清空所述系统信息中的所述对象偏移地址的初值、所述对象偏移地址的终值和所述对象堆碎片大小。
所述装置还包括:第三判断模块和提示模块;
所述第三判断模块,用于在所述第三获取模块获取到所述对象偏移地址后,判断获取到的所述对象偏移地址是否为空;
所述提示模块,用于在所述第三判断模块判断为是时,提示错误;
所述修改模块还用于在所述第三判断模块判断为否时,进行工作。
所述装置还包括第三合并模块;
所述第三合并模块,用于在所述第一判断模块判断所述指令的类型为垃圾回收时,扫描对象堆,将所述对象堆中需要被回收的对象作为对象堆碎片进行合并,并将合并过程中的对象偏移地址的初值、对象偏移地址的终值和对象堆碎片大小记录到系统信息中。
所述第三合并模块包括:第六获取单元、第六判断单元、第二记录单元、第七判断单元、第九更新单元、第二设置单元、第八判断单元、第十更新单元、第三移动单元、第十一更新单元、第十二更新单元、第十三更新单元和第二清除单元;
所述第六获取单元,用于初始化所述系统信息中的对象偏移地址的初值、对象偏移地址的终值和对象堆碎片大小,获取对象堆剩余空间的起始偏移地址;
所述第六判断单元,用于判断所述对象偏移地址的初值是否小于所述对象堆剩余空间的起始偏移地址;
所述第二记录单元,用于当所述第六判断单元判断为是时,记录所述对象偏移地址的初值的位置上的对象的大小;
所述第七判断单元,用于判断所述对象偏移地址的初值的位置上的对象是否需要回收;
所述第九更新单元,用于当所述第七判断单元判断为是时,根据记录的所述对象的大小更新所述系统信息中的所述对象堆碎片大小;
所述第二设置单元,用于当所述第七判断单元判断为是时,将所述对象堆中使用所述对象偏移地址的初值的位置设置为空;
所述第八判断单元,用于判断所述对象堆碎片大小是否为0;
所述第十更新单元,用于当所述第八判断单元判断为否时,根据所述对象偏移地址的初值和所述对象堆碎片大小更新所述系统信息中的所述对象偏移地址的终值;
所述第三移动单元,用于当第十更新单元更新所述对象偏移地址的终值后,将所述对象偏移地址的初值的位置上的对象移动到所述对象偏移地址的终值的位置上;
所述第十一更新单元,用于当所述第三移动单元移动对象后,将所述对象堆中使用的所述对象偏移地址的初值更新为所述对象偏移地址的终值;
所述第十二更新单元,用于当所述第八判断单元判断为否时,或当所述第二设置模块将所述对象堆中使用所述对象偏移地址的初值的位置设置为空后,或当所述第十一更新单元将所述对象堆中使用的所述对象偏移地址的初值更新为所述对象偏移地址的终值后,根据记录的所述对象的大小更新所述系统信息中的所述对象偏移地址的初值;
所述第十三更新单元,用于根据所述对象堆碎片大小更新所述对象堆剩余空间的起始偏移地址;
所述第二清除单元,用于清空所述系统信息中的所述对象偏移地址的初值、所述对象偏移地址的终值和所述对象堆碎片大小。
所述装置还包括:第四判断模块和提示模块;
所述第四判断模块,用于在所述第三获取模块获取到所述对象偏移地址后,判断获取到的所述对象偏移地址是否为空;
所述提示模块,用于在所述第四判断模块判断为是时,提示错误;
所述修改模块还用于在所述第四判断模块判断为否时,进行工作。
所述装置还包括第五判断模块和掉电恢复模块;
所述第五判断模块,用于根据系统信息中在对象堆碎片进行合并过程中记录的所述对象堆碎片大小判断是否需要进行掉电恢复;
所述掉电恢复模块,用于在所述第五判断模块判断为是时,根据系统信息中在对象堆碎片进行合并过程中记录的所述对象偏移地址的初值和所述对象偏移地址的终值进行掉电恢复;
所述接收模块还用于在所述第六判断模块判断为否时,或所述掉电恢复模块进行掉电恢复后,进行工作。
所述掉电恢复模块包括:第七获取单元、第十四更新单元、第八获取单元、第十五更新单元、第九判断单元、第十六更新单元、第四移动单元、第十七更新单元和第十八更新单元;
所述第七获取单元,用于获取所述系统信息中在对象堆碎片进行合并过程中记录的所述对象偏移地址的初值和所述对象偏移地址的终值;
所述第十四更新单元,用于在所述第七获取单元获取到所述对象偏移地址的初值和所述对象偏移地址的终值后,扫描对象堆,将所述对象堆中使用的所述对象偏移地址的初值更新为记录的所述对象偏移地址的终值;
所述第八获取单元,用于在所述第七获取单元获取到所述对象偏移地址的初值和所述对象偏移地址的终值后,获取所述对象堆的尾地址;
所述第十五更新单元,用于根据所述记录的对象偏移地址的终值的位置上的对象的大小更新记录的对象偏移地址的初值;
所述第九判断单元,用于在所述第十五更新单元更新所述记录的对象偏移地址的初值后,判断所述记录的对象偏移地址的初值是否小于所述对象堆剩余空间的起始偏移地址;
所述第十六更新单元,用于在所述第十三判断单元判断为是时,根据所述记录的对象偏移地址的初值和所述对象堆碎片大小更新所述记录的对象偏移地址的终值;
所述第四移动单元,用于在所述第十六更新单元更新所述记录的对象偏移地址的终值后,将所述记录的对象偏移地址的初值的位置上的对象移动到所述记录的对象偏移地址的终值的位置上;
所述第十七更新单元,用于在所述第四移动单元移动对象后,将所述对象堆中使用的所述对象偏移地址的初值更新为所述记录的对象偏移地址的终值;
所述第十八更新单元,用于在所述第十三判断单元判断为否时,根据所述对象堆碎片大小更新所述系统信息中的所述对象堆剩余空间的起始偏移地址,清空系统信息中记录的所述对象偏移地址的初值、所述对象偏移地址的终值和所述对象堆碎片大小。
本发明与现有技术相比,具有以下优点:
本专利提出一种可进行高效对象管理的方法及装置,在对对象进行操作时不需查找子对象表和主对象表,简化了java卡虚拟机的操作流程,提高java卡虚拟机工作效率。
附图说明
图1为本发明实施例一提供的一种可进行高效对象管理的方法的流程图;
图2为本发明实施例二提供的一种可进行高效对象管理的方法的流程图;
图3为本发明实施例二提供的NewObj应用实例的示意图;
图4为本发明实施例三提供的扫描包堆,根据包堆中的组件的偏移地址计算出包堆碎片,对包堆碎片进行合并的方法的流程图;
图5为本发明实施例四提供的扫描对象堆,将对象堆中需要被回收的对象作为对象堆碎片进行合并,并将合并过程中的对象第一偏移地址的初值、对象第二偏移地址的终值和对象堆碎片大小记录到系统信息中的方法的流程图;
图6、图7和图8为本发明实施例四提供的对象堆的示意图。
图9为本发明实施例五提供的根据系统信息中在对象堆碎片进行合并过程中记录的对象偏移地址的初值和对象偏移地址的终值进行掉电恢复的方法的流程图;
图10和图11为本发明实施例五提供的对象堆的示意图;
图12为本发明实施例六提供的一种可进行高效对象管理的装置的模块图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
java卡应用的开发过程为:开发者写一个或多个java类,用java编译器编译源码,产生一个或多个class文件;java卡虚拟机指令是以操作码与操作数的形式描述的;每一个操作码都有一个助记符作为它的名字;在java卡虚拟机指令执行时,通过隐式地从操作数栈中取指令的操作数,即操作数在运行时被计算,操作数由操作栈提供;
java卡应用程序准备被下载到java卡虚拟机上时,使用java卡Converter将包含了java卡应用的class文件转换成CAP(converted applet)文件;java卡Converted是对组成一个包的所有java API类文件进行预处理的软件,它将一个包转换成CAP文件;CAP文件包含将被安装在java卡虚拟机上的一个包的类的二进制表达,用于在java卡虚拟机上执行包的类;CAP文件由12个组件组成,具体为:头组件、目录组件、应用组件、导入组件、常量池组件、类组件、方法组件、静态域组件、位置引用组件、导出组件、描述符组件、调试组件;其中,常量池组件由条目组成,条目为被该CAP文件的方法组件中的元素引用的每一个类、方法以及域的引用;在java卡虚拟机中,java卡应用程序以字节码的形式被执行;
例如,NewObj应用程序中有数组对象obj1和4个方法,4个方法分别是install、register、selectingApplet和process,则生成的常量池为:
第0个位置为NewObj应用程序的数组对象obj1的条目,第1个位置为NewObj应用程序的数组对象obj2的条目,第2个位置为NewObj应用程序引用的包的静态初始化方法条目,第7个位置为NewObj应用实例的条目,第3、4、5、6个位置为NewObj应用程序调用到的方法的条目。
实施例1
本发明的实施例1提供一种可进行高效对象管理的方法,如图1所示,该方法包括:
步骤S1:java卡虚拟机接收来自当前应用程序的指令,判断指令的类型,若是创建对象指令则执行步骤S2,若是修改对象指令则执行步骤S5;
步骤S2:java卡虚拟机根据创建对象指令获取与当前应用程序对应的应用实例的偏移地址,将偏移地址上的应用实例作为当前应用实例,根据创建对象指令获取对象大小、对象类型和对象地址位置;
步骤S3:java卡虚拟机从系统信息中获取对象堆的剩余空间的起始偏移地址;
步骤S4:java卡虚拟机将对象堆的剩余空间的起始偏移地址作为创建的对象的偏移地址,按照对象大小和对象类型创建对象,根据对象大小更新系统信息中的对象堆的剩余空间的起始偏移地址,根据当前应用实例的偏移地址将创建的对象的偏移地址存入到当前应用实例中与对象地址位置对应的位置中,返回步骤S1;
步骤S5:java卡虚拟机根据修改对象指令获取对象地址位置,根据对象地址位置从当前应用实例中获取对象偏移地址,根据修改对象指令获取修改位置和修改内容;
步骤S6:java卡虚拟机根据对象偏移地址和修改位置,将对象偏移地址上的对象中修改位置上的数据修改为修改内容,返回步骤S1。
实施例2
本发明的实施例2提供一种可进行高效对象管理的方法,如图2所示,该方法包括:
步骤101:java卡虚拟机接收来自当前应用程序的指令,判断指令的类型,若是创建对象指令则执行步骤102,若是修改对象指令则执行步骤106,若是删包指令则执行步骤109,若是垃圾回收指令则执行步骤110;
具体地,该步骤之前还包括:java卡虚拟机接收用户发送的选择应用指令,根据选择应用指令获取应用ID,根据应用ID查找对应的应用程序,并判断是否查找到与应用ID对应的应用程序,是则将查找到的应用程序作为当前应用程序,执行步骤101,否则提示错误,结束;
步骤102:java卡虚拟机根据创建对象指令获取与当前应用程序对应的应用实例的偏移地址,将该偏移地址上的应用实例作为当前应用实例,根据创建对象指令获取对象大小、对象类型和对象地址位置;
具体地,java卡虚拟机对创建对象指令进行编译,得到第一编译指令,根据第一编译指令获取与当前应用程序对应的应用实例的偏移地址,将该偏移地址上的应用实例作为当前应用实例,根据第一编译指令获取对象大小、对象类型和对象地址位置;
优选地,根据创建对象指令获取对象大小为:java卡虚拟机从创建对象指令中直接获取对象大小;除此之外,还可以为:java卡虚拟机从创建对象指令中获取存储区的偏移地址和数据在存储区中的位置,根据存储区的偏移地址,在存储区中根据数据存储区中的位置获取数据,将获取到的数据作为对象大小;
步骤103:java卡虚拟机从系统信息中获取对象堆大小和对象堆的剩余空间的起始偏移地址,根据对象堆大小和对象堆的剩余空间的起始偏移地址得到对象堆的剩余空间大小;
步骤104:java卡虚拟机判断对象堆的剩余空间大小是否大于对象大小,是则执行步骤105,否则提示错误,返回步骤101;
具体地,本实施例中,对象堆是指java卡虚拟机中的一块EEPROM,专门用来存储对象,并且从低地址向高地址使用对象堆;
例如,java卡虚拟机创建大小为0x40的对象,若java卡虚拟机根据对象堆大小和对象堆的剩余空间的起始偏移地址得到的对象堆的剩余空间大小为0x30,0x30小于0x40,则对象堆剩余空间不足以存放创建的对象,创建对象失败,提示错误,返回步骤101;若java卡虚拟机根据对象堆大小和对象堆的剩余空间的起始偏移地址得到的对象堆的剩余空间为0x80,0x80大于0x40,则对象堆剩余空间可以存放创建的对象,则执行步骤105;
步骤105:java卡虚拟机将对象堆的剩余空间的起始偏移地址作为创建的对象的偏移地址,按照获取的对象大小和对象类型创建对象,根据对象大小更新系统信息中的对象堆的剩余空间的起始偏移地址,根据当前应用实例的偏移地址将创建的对象的偏移地址存入到当前应用实例中与对象地址位置对应的位置中,返回步骤101;
具体地,本实施例中,java卡虚拟机中记录对象堆的起始地址、对象堆的剩余空间的起始偏移地址及对象堆大小;由于对象堆是从低地址向高地址使用,所以对象堆剩余空间的起始偏移地址是对象堆剩余空间的最低地址;该步骤中,java卡虚拟机在对象堆中的最后一个对象之后,即对象堆的剩余空间的起始位置处,创建对象;java卡虚拟机根据对象大小更新系统信息中的对象堆的剩余空间的起始偏移地址具体为将对象堆剩余空间的起始偏移地址加上对象大小;对象地址位置为对象的偏移地址在当前应用实例的数据域中的位置;
例如,java卡虚拟机的系统信息中存储的对象堆的起始地址为“0x1111”,对象堆剩余空间的起始偏移地址为“0x0100”,对象堆的大小为“0x400”;对象大小为“0x0A”,则在对象堆的起始地址“0x1111”加上对象堆剩余空间的起始偏移地址“0x0100”,即“0x1211”处创建新对象;创建的对象的绝对地址为“0x1211”,创建的对象的偏移地址为“0x0100”,将对象堆剩余空间的起始偏移地址更新为“0x0100”加上对象大小为“0x0A”,即“0x010A”;
在java卡虚拟机中,当应用程序被安装后,会产生对应的应用实例,应用实例即该应用程序的对象,在创建对象后,java卡虚拟机把创建的对象的偏移地址放入应用实例中;
例如,本实施例中,对象堆中存在应用实例NewObj,包括对象头和数据域,对象头保存了NewObj应用实例的基本信息,数据域中的内容为对象的偏移地址,NewObj应用实例如图3所示,NewObj应用实例需要创建2个对象,分别是对象obj1和对象obj2;对象obj1的偏移地址在NewObj应用实例的数据域的第0个位置,对象obj2的偏移地址在NewObj应用实例的数据域的第1个位置;对象obj1在应用程序安装时被创建,其偏移地址为“0x0011”,则NewObj应用实例的数据域的第0个位置存储“0x0011”,此时,未创建对象obj2,则对象obj2的偏移地址为“0x0000”,在NewObj应用实例的数据域的第1个位置存储“0x0000”;当java卡虚拟机接收到创建对象指令obj2=new byte[4]时,在对象堆中创建对象obj2,对象obj2的偏移地址为“0x0100”,则将obj2的偏移地址“0x0100”存入NewObj应用实例的数据域的第1个位置;
例如,创建对象指令为“obj1[]=new byte[18];”,则java卡虚拟机对创建对象指令“obj1[]=new byte[18];”进行编译,得到第一编译指令,即字节码为:
aload_0;
bspush18;
newarray11;
putfield_a0;//reference newObj/NewObj.obj1
java卡虚拟机首先执行“aload_0”,获取NewObj应用实例的偏移地址,将NewObj应用实例的偏移地址放入java卡虚拟机的操作栈中,然后执行“bspush18”,获取对象大小“18”,将byte型数据18放到java卡虚拟机的操作栈中,此时,java卡虚拟机的操作栈为“18NewObj应用实例的偏移地址”,再执行“newarray11”,获取对象类型“11”,11代表byte型,将对象大小“18”从操作栈中取出,java卡虚拟机创建一个byte型数组对象,其中将创建的数组对象的偏移地址放入java卡虚拟机的操作栈中,此时,java卡虚拟机的操作栈为“创建的数组对象的偏移地址NewObj应用实例的偏移地址”,最后执行“putfield_a0”,获取对象地址位置“0”,将创建的数组对象的偏移地址和NewObj应用实例的偏移地址从操作栈中取出,将创建的数组对象的偏移地址写入NewObj应用实例的数据域的第0个位置,完成创建对象;
再如,创建对象指令为“obj2=new byte[(short)(buf[5])];”,存储区buf存储用户发来的数组,则java卡虚拟机对创建对象指令“obj2=newbyte[(short)(buf[5])];”进行编译,得到第一编译指令,即字节码为:
aload_0;
aload_2;
sconst_5;
baload;
newarray11;
putfield_a1;//reference newObj/NewObj.obj2
java卡虚拟机首先执行“aload_0”,获取NewObj应用实例的偏移地址,将NewObj应用实例的偏移地址放入java卡虚拟机的操作栈中,然后执行“aload_2”,获取存储区buf的偏移地址,将存储区buf的偏移地址放入java卡虚拟机的操作栈中,执行“sconst_5”,获取存储区中的位置“5”,将short型常数5放入java卡虚拟机的操作栈中,执行“baload”,将存储区buf的偏移地址和常数5从操作栈中弹出,获取存储区buf的第5个元素作为对象大小放入操作栈中,再执行“newarray11”,获取对象类型“11”,11代表byte型,将操作栈中的对象大小从操作栈中取出,java卡虚拟机创建一个byte型数组对象,将创建的数组对象的偏移地址放入java卡虚拟机的操作栈中,此时,java卡虚拟机的操作栈为“创建的数组对象的偏移地址NewObj应用实例的偏移地址”,最后执行“putfield_a1”,获取对象地址位置“1”,将创建的数组对象的偏移地址和NewObj应用实例的偏移地址从操作栈中取出,将创建的数组对象的偏移地址写入NewObj应用实例的数据域的第1个位置,完成创建对象;
步骤106:java卡虚拟机根据修改对象指令获取对象地址位置,根据对象地址位置从当前应用实例中获取对象偏移地址,根据修改对象指令获取修改位置和修改内容;
具体地,java卡虚拟机对修改对象指令进行编译,得到第二编译指令,根据第二编译指令获取对象地址位置,根据对象地址位置从当前应用实例中获取对象偏移地址,根据第二编译指令获取修改位置和修改内容;
优选地,根据修改对象指令获取修改内容为:java卡虚拟机从修改对象指令中直接获取修改内容;除此之外,还可以为:java卡虚拟机从修改对象指令中获取存储区的偏移地址和数据在存储区中的位置,根据存储区的偏移地址,在存储区中根据数据在存储区中的位置获取数据,将获取到的数据作为修改内容;
步骤107:java卡虚拟机判断获取到的对象偏移地址是否为空,是则提示错误,返回步骤101,否则执行步骤108;
步骤108:java卡虚拟机根据对象偏移地址和修改位置,将对象偏移地址上的对象中修改位置上的数据修改为修改内容,返回步骤101;
例如,修改对象指令为“obj1[(short)0]=(byte)0xAA;”,则java卡虚拟机对修改对象指令“obj1[(short)0]=(byte)0xAA;”进行编译,得到第二编译指令,即字节码为:
getfield_a_this0;//reference newObj/NewObj.obj1
sconst_0;
bspush-86;
bastore;
java卡虚拟机首先执行“getfield_a_this0”,获取对象地址位置“0”,将NewObj应用实例的数据域的第0个位置的值取出,即取出obj1的偏移地址,然后执行“sconst_0”,获取修改位置“0”,将short类型变量0压入操作栈中,再执行“bspush-86”,获取修改内容“-86”,将byte类型变量0xAA(即-86)压入操作栈中,此时操作栈为“0xAA0obj1的偏移地址”;最后执行“bastore”,将“0xAA、0、obj1的偏移地址”都从操作栈中取出,将0xAA存入对象obj1的数据域的第0个位置,完成赋值;
又如,修改对象指令为“obj2[(short)0]=buf[5];”,存储区buf存储用户发来的数组,则java卡虚拟机对修改对象指令“obj2[(short)0]=buf[5];”进行编译,得到第二编译指令,即字节码为:
getfield_a_this1;//reference newObj/NewObj.obj2
sconst_0;
aload_2;
sconst_5;
baload;
bastore;
java卡虚拟机首先执行“getfield_a_this1”,获取对象地址位置“1”,将NewObj应用实例的数据域的第1个位置的值取出,即取出obj2的偏移地址,然后执行“sconst_0”,获取修改位置“0”,将short类型变量0压入操作栈中,再执行“aload_2”,获取存储区的偏移地址“2”,将存储区buf的偏移地址压入操作栈中,执行“sconst_5”,获取存储区中的位置“5”,将常数5放入操作栈中,执行“baload”,将存储区buf的地址和常数5从栈中弹出,获取存储区buf的第5个元素作为修改内容放入操作栈中,最后执行“bastore”,将操作栈中的“修改内容、0、obj1的偏移地址”都从操作栈中取出,将修改内容存入对象obj2的数据域的第0个位置,完成赋值;
步骤109:java卡虚拟机扫描包堆,根据包堆中的组件的偏移地址计算出包堆碎片,对包堆碎片进行合并,执行步骤110;
具体地,本实施例中,包是指下载到java卡虚拟机中的cap文件;java卡虚拟机将下载的cap文件进行安装后,才能运行相应的java应用;包堆是指java卡虚拟机中的一块EEPROM,专门用来存储包,并且从高地址向低地址使用包堆;碎片存在于包堆和对象堆中,在包堆中,包堆碎片是由于移动包引起的包堆中的存储空间;
步骤110:java卡虚拟机扫描对象堆,将对象堆中需要被回收的对象作为对象堆碎片进行合并,并将合并过程中的对象偏移地址的初值、对象偏移地址的终值和对象堆碎片大小记录到系统信息中,返回步骤101;
具体地,java卡虚拟机扫描对象堆,通过移动对象堆中的对象使对象堆中已创建的对象连续排列,将对象堆中需要被回收的对象作为对象堆碎片进行合并,将不同对象之间的对象堆碎片集合成一个连续的存储空间;
本实施例中,下载到java卡虚拟机中的CAP文件存储在包堆中;包堆由包组成;碎片存在于包堆和对象堆中,在对象堆中,碎片是需要删除的对象,或者是由于移动对象引起的对象堆中的存储空间;在包堆中,碎片是由于移动包引起的包堆中的存储空间;
本实施例中,步骤101之前还包括:
步骤100:java卡虚拟机上电,根据系统信息中在对象堆碎片进行合并过程中记录的对象堆碎片大小判断是否需要进行掉电恢复,是则执行步骤111,否则执行步骤101;
具体地,java卡虚拟机判断对象堆碎片大小是否为0,是则表示垃圾回收操作中没有发生过掉电,不需要进行掉电恢复,否则表示垃圾回收操作中发生过掉电,需要进行掉电恢复;
步骤111:java卡虚拟机根据系统信息中在对象堆碎片进行合并过程中记录的对象偏移地址的初值和对象偏移地址的终值进行掉电恢复后,执行步骤101;
本发明实施例2提供的一种可进行高效对象管理的方法,在对对象进行操作时不需查找子对象表和主对象表,简化了java卡虚拟机的操作流程,提高java卡虚拟机工作效率。
实施例3
本发明的实施例3在实施例2的基础上提供一种扫描包堆,根据包堆中的组件的偏移地址计算出包堆碎片,对包堆碎片进行合并的方法,如图4所示,该方法包括:
步骤109-1:java卡虚拟机获取包堆的最高偏移地址,并将其作为当前偏移地址;
本实施例中,包堆中的组件为包,包堆从高地址向低地址使用;当前偏移地址上的组件为当前组件,当前偏移地址减去当前组件的大小为当前组件的偏移首地址;
步骤109-2:java卡虚拟机判断当前偏移地址是否大于包堆剩余空间的起始偏移地址,是则执行步骤109-3;否则执行步骤109-8;
本实施例中的包堆剩余空间的起始偏移地址为系统信息中记录的最后一个组件的偏移地址或者java卡上电后初始化的组件的偏移地址;由于包堆是从高地址向低地址使用,所以包堆的剩余空间是从高地址到低地址,剩余空间的起始偏移地址为剩余空间的最高地址;
步骤109-3:java卡虚拟机在包堆中查找偏移地址小于当前偏移地址的组件,判断是否查找到偏移地址小于当前偏移地址的组件,是则执行步骤109-4,否则执行步骤109-7;
步骤109-4:java卡虚拟机在查找到的组件中获取偏移地址最大的组件作为当前组件的相邻组件,根据当前偏移地址与相邻组件的偏移地址之间的碎片大小更新包堆碎片大小,执行步骤109-5;
本实施例中的包堆碎片大小初始值为0;
具体地,根据当前偏移地址与相邻组件的偏移地址之间的碎片大小更新包堆碎片大小具体为:包堆碎片大小+[当前组件的偏移首地址-(相邻组件的偏移首地址+相邻组件的大小)];
步骤109-5:java卡虚拟机更新当前偏移地址和当前组件,判断包堆碎片大小是否为0,是则返回步骤109-2,否则执行步骤109-6;
具体地,java卡虚拟机将当前偏移地址更新为相邻组件的偏移地址,则当前组件更新为当前偏移地址上的组件;
步骤109-6:java卡虚拟机将当前组件向高地址方向移动,返回步骤109-2;
具体地,当前组件移动的长度为包堆碎片大小;
步骤109-7:java卡虚拟机根据当前偏移地址与包堆剩余空间的起始偏移地址之间的碎片大小更新包堆碎片大小,执行步骤109-8;
本实施例中的包堆碎片大小初始值为0;
具体地,根据当前偏移地址与包堆剩余空间的起始偏移地址之间的碎片大小更新包堆碎片大小具体为:包堆碎片大小+(当前组件的偏移首地址-包堆剩余空间的起始偏移地址);
步骤109-8:java卡虚拟机判断包堆碎片大小是否为0,是则执行步骤110,否则更新包堆剩余空间的起始偏移地址,执行步骤110;
具体地,将包堆剩余空间的起始偏移地址更新为包堆剩余空间的起始偏移地址加上包堆碎片大小。
实施例4
本发明的实施例4在实施例2的基础上提供一种扫描对象堆,将对象堆中需要被回收的对象作为对象堆碎片进行合并,并将合并过程中的对象第一偏移地址的初值、对象第二偏移地址的终值和对象堆碎片大小记录到系统信息中的方法,如图5所示,对象堆中包括与应用程序对应的应用实例和应用程序创建的对象,本实施例中,与应用程序对应的应用实例和应用程序创建的对象均属于对象堆中的对象,该方法包括:
步骤110-1:java卡虚拟机初始化系统信息中的对象偏移地址的初值、对象偏移地址的终值和对象堆碎片大小,获取对象堆剩余空间的起始偏移地址;
具体地,java卡虚拟机将系统信息中的对象偏移地址的初值初始化为对象堆中第一个对象的偏移地址,即为0,将系统信息中的对象偏移地址的终值和对象堆碎片大小初始化为0;
例如,java卡虚拟机中对象堆的起始地址为“0x1111”,对象堆剩余空间的起始偏移地址为“0x010A”,对象偏移地址的初值和对象偏移地址的终值初始化为“0x0000”,对象堆碎片大小为0,如图6所示;
步骤110-2:java卡虚拟机判断对象偏移地址的初值是否小于对象堆剩余空间的起始偏移地址,是则执行步骤110-3,否则执行步骤110-8;
步骤110-3:java卡虚拟机记录对象偏移地址的初值的位置上的对象的大小,判断对象偏移地址的初值的位置上的对象是否需要回收,是则执行步骤110-4,否则执行步骤110-5;
例如,对象偏移地址的初值是“0x0000”,对象偏移地址的初值的位置上的对象为对象obj1,对象obj1被标记,不需要删除;
例如,对象偏移地址的初值是“0x0014”,对象偏移地址的初值的位置上的对象为对象obj2,对象obj2没有被标记,需要删除;
步骤110-4:java卡虚拟机根据记录的对象的大小更新系统信息中的对象堆碎片大小,将对象堆中使用对象偏移地址的初值的位置设置为空,执行步骤110-7;
具体地,该步骤中,java卡虚拟机将系统信息中的对象堆碎片大小更新为对象堆碎片大小加上记录的对象的大小;对象堆中使用对象偏移地址的初值的位置存在于对象堆中的应用实例和对象中;
例如,如图7所示,若对象偏移地址的初值是“0x0014”,即对象偏移地址的初值的位置上的对象为对象obj2,对象obj2的大小是100,对象堆碎片大小加上100,即java卡虚拟机系统信息中记录的对象堆碎片大小更新为100;由于对象obj2被对象obj1引用,则将对象obj1的数据域中存储的对象偏移地址的初值“0x0014”的位置设置为空“0x0000”;
步骤110-5:java卡虚拟机判断对象堆碎片大小是否为0,是则执行步骤110-7,否则执行步骤110-6;
步骤110-6:java卡虚拟机根据对象偏移地址的初值和对象堆碎片大小更新系统信息中的对象偏移地址的终值,将对象偏移地址的初值的位置上的对象移动到对象偏移地址的终值的位置上,将对象堆中使用的对象偏移地址的初值更新为记录的对象偏移地址的终值,执行步骤110-7;
具体地,该步骤中,java卡虚拟机将系统信息中的对象偏移地址的终值更新为对象偏移地址的初值减去对象堆碎片大小;对象堆中使用对象偏移地址的初值的位置存在于对象堆中的应用实例和对象中;
例如,如图7所示,若对象偏移地址的初值为“0x00DC”,即对象偏移地址的初值上的对象为对象obj4,对象堆碎片大小是200,则对象obj4需要向低地址方向移动200个字节,则系统信息中的对象偏移地址的终值更新为对象偏移地址的初值“0x00DC”减去对象堆碎片大小200,即系统信息中记录的对象偏移地址的终值更新为“0x0014”,对象obj1引用了对象obj4,将对象obj1的数据域中存储的对象偏移地址的初值“0x00DC”修改为对象偏移地址的终值“0x0014”;移动后的对象obj4如图8所示;
步骤110-7:java卡虚拟机根据记录的对象的大小更新记录的对象偏移地址的初值,返回步骤110-2;
具体地,java卡虚拟机将记录的对象偏移地址的初值更新为对象偏移地址的初值加上记录的对象的大小;
例如,对象偏移地址的初值是“0x00DC”,记录的对象的大小为对象obj4的大小30,则记录的对象偏移地址的初值更新为“0x00DC”加上30,即为“0x00FA”;
步骤110-8:java卡虚拟机判断对象堆碎片大小是否为0,是则执行步骤110-10,否则执行步骤110-9;
步骤110-9:java卡虚拟机根据对象堆碎片大小更新对象堆剩余空间的起始偏移地址,执行步骤110-10;
具体地,java卡虚拟机将对象堆剩余空间的起始偏移地址更新为对象堆剩余空间的起始偏移地址减去对象堆碎片大小的差;
步骤110-10:java卡虚拟机清空系统信息中的对象偏移地址的初值、对象偏移地址的终值和对象堆碎片大小,垃圾回收结束,返回步骤101;
优选地,java卡虚拟机将系统信息中的对象偏移地址的初值、对象偏移地址的终值和对象堆碎片大小设置为0。
实施例5
本发明的实施例5在实施例2的基础上提供一种根据系统信息中的在对象堆碎片进行合并过程中所记录的对象偏移地址的初值和对象偏移地址的终值进行掉电恢复的方法,如图9所示,该方法包括:
步骤111-1:java卡虚拟机获取系统信息中在对象堆碎片进行合并过程中记录的对象偏移地址的初值和对象偏移地址的终值;
例如,java卡虚拟机的系统信息中在对象堆碎片进行合并过程中记录的对象偏移地址的初值为“0x00DC”,对象偏移地址的终值为“0x0014”,对象堆碎片大小为200;
步骤111-2:java卡虚拟机扫描对象堆,将对象堆中使用的对象偏移地址的初值更新为记录的对象偏移地址的终值,获取对象堆的尾地址;
例如,如图10和图11所示,若java卡虚拟机的系统信息中存储的对象偏移地址的初值为0x00DC,对象偏移地址的终值为0x0014,对象堆碎片大小为200;对象堆的起始地址为0x1111,对象堆剩余空间的起始偏移地址为“0x010A”;对象堆中从低地址向高地址分别是偏移地址为0x0000的对象obj1,对象obj1的大小为20,偏移地址为0x0014的对象obj3-2,对象obj3-2的大小为30,偏移地址为0x032的对象堆碎片,对象堆碎片大小为200,对象堆碎片中包含偏移地址为0x00DC的对象obj3-1,对象obj3-1的大小为30,偏移地址为0x00FA的对象obj4,对象obj4的大小为16;其中对象obj3-1和对象obj3-2是同一个对象,对象obj3-2是对象obj3-1移动之后的对象,对象obj1是一个应用实例,引用了对象obj3-1;在上一次垃圾回收操作中,将对象obj3-1移动至对象obj3-2的位置后,发生掉电,出现对象obj3-1被移动,但是引用了该对象的对象还没有被修改的情况,本次上电时,需要进行掉电恢复;java卡虚拟机扫描对象堆,将对象堆中使用的对象obj3-1的偏移地址,即对象偏移地址的初值0x00DC,更新为对象obj3-2的偏移地址,即对象偏移地址的终值0x0014(参见图11);
步骤111-3:java卡虚拟机更新记录的对象偏移地址的初值,判断记录的对象偏移地址的初值是否小于对象堆剩余空间的起始偏移地址,是则执行步骤111-4,否则执行步骤111-6;
本实施例中,java卡虚拟机将记录的对象偏移地址的初值更新为对象偏移地址的初值与对象偏移地址的终值上的对象的大小之和;例如,对象偏移地址的初值为0x00DC,对象偏移地址的终值上的对象为对象obj3-2,对象obj3-2的大小为30,则记录的对象偏移地址的初值更新为对象偏移地址的初值0x00DC加上对象obj3-2的大小0x001E,即为0x00FA;
步骤111-4:java卡虚拟机根据记录的对象偏移地址的初值和对象堆碎片大小更新记录的对象偏移地址的终值,将记录的对象偏移地址的初值的位置上的对象移动到记录的对象偏移地址的终值的位置上;
具体地,java卡虚拟机将记录的对象偏移地址的终值更新为记录的对象偏移地址的初值减去对象堆碎片大小;
例如,对象偏移地址的初值是0x00FA,对象堆碎片大小是200,则记录的对象偏移地址的终值更新为对象偏移地址的初值0x00FA减去碎片大小200,即为0x0032;
步骤111-5:java卡虚拟机将对象堆中使用的对象偏移地址的初值更新为记录的对象偏移地址的终值,返回步骤111-3;
步骤111-6:java卡虚拟机根据对象堆碎片大小更新系统信息中的对象堆剩余空间的起始偏移地址,清空系统信息中记录的对象偏移地址的初值、对象偏移地址的终值和对象堆碎片大小,掉电恢复结束,执行步骤101;
具体地,java卡虚拟机将系统信息中记录的对象堆剩余空间的起始偏移地址更新为对象堆剩余空间的起始偏移地址减去对象堆碎片大小的值。
实施例6
本发明的实施例6提供一种可进行高效对象管理的装置,如图12所示,该装置包括:接收模块101、第一判断模块102、第一获取模块103、第二获取模块104、创建模块105、第三获取模块106和修改模块107;
接收模块101,用于接收来自当前应用程序的指令;
第一判断模块102,用于判断接收模块101接收到的指令的类型;
第一获取模块103,用于在第一判断模块102判断指令的类型为创建对象指令时,根据创建对象指令获取与当前应用程序对应的应用实例的偏移地址,将偏移地址上的应用实例作为当前应用实例,根据创建对象指令获取对象大小、对象类型和对象地址位置;
第二获取模块104,用于从系统信息中获取对象堆的剩余空间的起始偏移地址;
创建模块105,用于将第二获取模块104获取到的对象堆的剩余空间的起始偏移地址作为创建的对象的偏移地址,按照第一获取模块103获取到的对象大小和对象类型创建对象,根据对象大小更新系统信息中的对象堆的剩余空间的起始偏移地址,根据当前应用实例的偏移地址将创建的对象的偏移地址存入到当前应用实例中与对象地址位置对应的位置中;
第三获取模块106,用于在第一判断模块102判断指令的类型为修改对象指令时,根据修改对象指令获取对象地址位置,根据对象地址位置从当前应用实例中获取对象偏移地址,根据修改对象指令获取修改位置和修改内容;
修改模块107,用于根据第三获取模块106获取到的对象偏移地址和修改位置,将对象偏移地址上的对象中修改位置上的数据修改为第三获取模块106获取到的修改内容。
接收模块101还用于接收用户发送的选择应用指令;
装置还包括查找模块和提示模块;
查找模块,用于根据接收模块101接收到的选择应用指令获取应用ID,根据应用ID查找对应的应用程序,并判断是否查找到与应用ID对应的应用程序,是则将查找到的应用程序作为当前应用程序;
提示模块,用于在查找模块未查找到与应用ID对应的应用程序时,提示错误;
接收模块101还用于在查找模块查找到与应用ID对应的应用程序时,进行工作。
第一获取模块103包括:第一编译单元和第一获取单元;
第一编译单元,用于对创建对象指令进行编译,得到第一编译指令;
第一获取单元,用于根据第一编译单元编译得到的第一编译指令获取与当前应用程序对应的应用实例的偏移地址,将偏移地址上的应用实例作为当前应用实例,根据第一编译单元编译得到的第一编译指令获取对象大小、对象类型和对象地址位置。
第一获取模块103具体用于在第一判断模块102判断指令的类型为创建对象指令时,根据创建对象指令获取与当前应用程序对应的应用实例的偏移地址,将偏移地址上的应用实例作为当前应用实例,从创建对象指令中获取对象大小,根据创建对象指令获取对象类型和对象地址位置。
第一获取模块103具体用于在第一判断模块102判断指令的类型为创建对象指令时,根据创建对象指令获取与当前应用程序对应的应用实例的偏移地址,将偏移地址上的应用实例作为当前应用实例,从创建对象指令中获取存储区的偏移地址和数据在存储区中的位置,根据存储区的偏移地址,在存储区中根据数据在存储区中的位置获取数据,将获取到的数据作为对象大小,根据创建对象指令获取对象类型和对象地址位置。
装置还包括第四获取模块、第二判断模块和提示模块;
第四获取模块,用于从系统信息中获取对象堆大小,根据对象堆大小和对象堆的剩余空间的起始偏移地址得到对象堆的剩余空间大小;
第二判断模块,用于判断对象堆的剩余空间大小是否大于对象大小;
提示模块,用于在第二判断模块判断为否时,提示错误;
创建模块105还用于在第二判断模块判断为是时,进行工作。
第三获取模块106包括:第二编译单元和第二获取单元;
第二编译单元,用于对修改对象指令进行编译,得到第二编译指令;
第二获取单元,用于根据第二编译单元编译得到的第二编译指令获取对象地址位置,根据对象地址位置从当前应用实例中获取对象偏移地址,根据第二编译指令获取修改位置和修改内容。
第三获取模块106具体用于在第一判断模块102判断指令的类型为修改对象指令时,根据修改对象指令获取对象地址位置,根据对象地址位置从当前应用实例中获取对象偏移地址,从修改对象指令中获取修改内容,根据修改对象指令获取修改位置。
第三获取模块106具体用于在第一判断模块102判断指令的类型为修改对象指令时,根据修改对象指令获取对象地址位置,根据对象地址位置从当前应用实例中获取对象偏移地址,从修改对象指令中获取存储区的偏移地址和数据在存储区中的位置,根据存储区的偏移地址,在存储区中根据所述数据在存储区中的位置获取数据,将获取到的数据作为修改内容。
装置还包括第一合并模块和第二合并模块;
第一合并模块,用于在第一判断模块判断指令的类型为删包指令时,扫描包堆,根据包堆中的组件的偏移地址计算出包堆碎片,对包堆碎片进行合并;
第二合并模块,用于在第一合并模块对包堆碎片进行合并后,扫描对象堆,将对象堆中需要被回收的对象作为对象堆碎片进行合并,并将合并过程中的对象偏移地址的初值、对象偏移地址的终值和对象堆碎片大小记录到系统信息中。
第一合并模块包括:第三获取单元、第一判断单元、查找单元、第四获取单元、第一更新单元、第二判断单元、第一移动单元、第二更新单元和第三更新单元;
第三获取单元,用于在第一判断模块判断指令的类型为删包指令时,获取包堆的最高偏移地址,并将其作为当前偏移地址;
第一判断单元,用于判断当前偏移地址是否大于包堆剩余空间的起始偏移地址;
查找单元,用于当第一判断单元判断当前偏移地址大于包堆剩余空间的起始偏移地址时,在包堆中查找偏移地址小于当前偏移地址的组件,判断是否查找到偏移地址小于当前偏移地址的组件;
第四获取单元,用于当查找单元查找到偏移地址小于当前偏移地址的组件时,在查找到的组件中获取偏移地址最大的组件作为当前组件的相邻组件,根据当前偏移地址与相邻组件的偏移地址之间的碎片大小更新包堆碎片大小;
第一更新单元,用于根据第四获取单元获取到的相邻组件的偏移地址更新当前偏移地址,根据当前偏移地址更新当前组件;
第二判断单元,用于判断包堆碎片大小是否为0;
第一移动单元,用于当第二判断单元判断为否时,根据包堆碎片大小,将当前组件向高地址方向移动;
第二更新单元,用于当查找单元查找不到偏移地址小于当前偏移地址的组件时,根据当前偏移地址与包堆剩余空间的起始偏移地址之间的碎片大小更新包堆碎片大小;
第三更新单元,用于根据包堆碎片大小更新包堆剩余空间的起始偏移地址。
第二合并模块包括:第五获取单元、第三判断单元、第一记录单元、第四判断单元、第四更新单元、第一设置单元、第五判断单元、第五更新单元、第二移动单元、第六更新单元、第七更新单元、第八判断单元和第一清除单元;
第五获取单元,用于初始化系统信息中的对象偏移地址的初值、对象偏移地址的终值和对象堆碎片大小,获取对象堆剩余空间的起始偏移地址;
第三判断单元,用于判断对象偏移地址的初值是否小于对象堆剩余空间的起始偏移地址;
第一记录单元,用于当第三判断单元判断为是时,记录对象偏移地址的初值的位置上的对象的大小;
第四判断单元,用于判断对象偏移地址的初值的位置上的对象是否需要回收;
第四更新单元,用于当第四判断单元判断为是时,根据记录的对象的大小更新系统信息中的对象堆碎片大小;
第一设置单元,用于当第四判断单元判断为是时,将对象堆中使用对象偏移地址的初值的位置设置为空;
第五判断单元,用于判断对象堆碎片大小是否为0;
第五更新单元,用于当第五判断单元判断为否时,根据对象偏移地址的初值和对象堆碎片大小更新系统信息中的对象偏移地址的终值;
第二移动单元,用于当第五更新单元更新对象偏移地址的终值后,将对象偏移地址的初值的位置上的对象移动到对象偏移地址的终值的位置上;
第六更新单元,用于当第二移动单元移动对象后,将对象堆中使用的对象偏移地址的初值更新为对象偏移地址的终值;
第七更新单元,用于当第五判断单元判断为否时,或当第一设置模块将对象堆中使用对象偏移地址的初值的位置设置为空后,或当第六更新单元将对象堆中使用的对象偏移地址的初值更新为对象偏移地址的终值后,根据记录的对象的大小更新系统信息中的对象偏移地址的初值;
第八更新单元,用于根据对象堆碎片大小更新对象堆剩余空间的起始偏移地址;
第一清除单元,用于清空系统信息中的对象偏移地址的初值、对象偏移地址的终值和对象堆碎片大小。
装置还包括:第三判断模块和提示模块;
第三判断模块,用于在第三获取模块获取到对象偏移地址后,判断获取到的对象偏移地址是否为空;
提示模块,用于在第三判断模块判断为是时,提示错误;
修改模块107还用于在第三判断模块判断为否时,进行工作。
装置还包括第三合并模块;
第三合并模块,用于在第一判断模块判断指令的类型为垃圾回收时,扫描对象堆,将对象堆中需要被回收的对象作为对象堆碎片进行合并,并将合并过程中的对象偏移地址的初值、对象偏移地址的终值和对象堆碎片大小记录到系统信息中。
第三合并模块包括:第六获取单元、第六判断单元、第二记录单元、第七判断单元、第九更新单元、第二设置单元、第八判断单元、第十更新单元、第三移动单元、第十一更新单元、第十二更新单元、第十三更新单元和第二清除单元;
第六获取单元,用于初始化系统信息中的对象偏移地址的初值、对象偏移地址的终值和对象堆碎片大小,获取对象堆剩余空间的起始偏移地址;
第六判断单元,用于判断对象偏移地址的初值是否小于对象堆剩余空间的起始偏移地址;
第二记录单元,用于当第六判断单元判断为是时,记录对象偏移地址的初值的位置上的对象的大小;
第七判断单元,用于判断对象偏移地址的初值的位置上的对象是否需要回收;
第九更新单元,用于当第七判断单元判断为是时,根据记录的对象的大小更新系统信息中的对象堆碎片大小;
第二设置单元,用于当第七判断单元判断为是时,将对象堆中使用对象偏移地址的初值的位置设置为空;
第八判断单元,用于判断对象堆碎片大小是否为0;
第十更新单元,用于当第八判断单元判断为否时,根据对象偏移地址的初值和对象堆碎片大小更新系统信息中的对象偏移地址的终值;
第三移动单元,用于当第十更新单元更新对象偏移地址的终值后,将对象偏移地址的初值的位置上的对象移动到对象偏移地址的终值的位置上;
第十一更新单元,用于当第三移动单元移动对象后,将对象堆中使用的对象偏移地址的初值更新为对象偏移地址的终值;
第十二更新单元,用于当第八判断单元判断为否时,或当第二设置模块将对象堆中使用对象偏移地址的初值的位置设置为空后,或当第十一更新单元将对象堆中使用的对象偏移地址的初值更新为对象偏移地址的终值后,根据记录的对象的大小更新系统信息中的对象偏移地址的初值;
第十三更新单元,用于根据对象堆碎片大小更新对象堆剩余空间的起始偏移地址;
第二清除单元,用于清空系统信息中的对象偏移地址的初值、对象偏移地址的终值和对象堆碎片大小。
装置还包括:第四判断模块和提示模块;
第四判断模块,用于在第三获取模块获取到对象偏移地址后,判断获取到的对象偏移地址是否为空;
提示模块,用于在第四判断模块判断为是时,提示错误;
修改模块107还用于在第四判断模块判断为否时,进行工作。
装置还包括第五判断模块和掉电恢复模块;
第五判断模块,用于根据系统信息中在对象堆碎片进行合并过程中记录的对象堆碎片大小判断是否需要进行掉电恢复;
掉电恢复模块,用于在第五判断模块判断为是时,根据系统信息中在对象堆碎片进行合并过程中记录的对象偏移地址的初值和对象偏移地址的终值进行掉电恢复;
接收模块101还用于在第五判断模块判断为否时,或掉电恢复模块进行掉电恢复后,进行工作。
掉电恢复模块包括:第七获取单元、第十四更新单元、第八获取单元、第十五更新单元、第九判断单元、第十六更新单元、第四移动单元、第十七更新单元和第十八更新单元;
第七获取单元,用于获取系统信息中在对象堆碎片进行合并过程中记录的对象偏移地址的初值和对象偏移地址的终值;
第十四更新单元,用于在第七获取单元获取到对象偏移地址的初值和对象偏移地址的终值后,扫描对象堆,将对象堆中使用的对象偏移地址的初值更新为记录的对象偏移地址的终值;
第八获取单元,用于在第七获取单元获取到对象偏移地址的初值和对象偏移地址的终值后,获取对象堆的尾地址;
第十五更新单元,用于根据记录的对象偏移地址的终值的位置上的对象的大小更新记录的对象偏移地址的初值;
第九判断单元,用于在第十五更新单元更新记录的对象偏移地址的初值后,判断记录的对象偏移地址的初值是否小于对象堆剩余空间的起始偏移地址;
第十六更新单元,用于在第十三判断单元判断为是时,根据记录的对象偏移地址的初值和对象堆碎片大小更新记录的对象偏移地址的终值;
第四移动单元,用于在第十六更新单元更新记录的对象偏移地址的终值后,将记录的对象偏移地址的初值的位置上的对象移动到记录的对象偏移地址的终值的位置上;
第十七更新单元,用于在第四移动单元移动对象后,将对象堆中使用的对象偏移地址的初值更新为记录的对象偏移地址的终值;
第十八更新单元,用于在第十三判断单元判断为否时,根据对象堆碎片大小更新系统信息中的对象堆剩余空间的起始偏移地址,清空系统信息中记录的对象偏移地址的初值、对象偏移地址的终值和对象堆碎片大小。
以上所述,仅为本发明较佳的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明公开的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应该以权利要求的保护范围为准。
Claims (36)
1.一种可进行高效对象管理的方法,其特征在于,所述方法包括:
步骤S1:java卡虚拟机接收来自当前应用程序的指令,判断所述指令的类型,若是创建对象指令则执行步骤S2,若是修改对象指令则执行步骤S5;
步骤S2:所述java卡虚拟机根据所述创建对象指令获取与所述当前应用程序对应的应用实例的偏移地址,将所述偏移地址上的应用实例作为当前应用实例,根据所述创建对象指令获取对象大小、对象类型和对象地址位置;
步骤S3:所述java卡虚拟机从系统信息中获取对象堆的剩余空间的起始偏移地址;
步骤S4:所述java卡虚拟机将所述对象堆的剩余空间的起始偏移地址作为创建的对象的偏移地址,按照所述对象大小和所述对象类型创建对象,根据所述对象大小更新所述系统信息中的所述对象堆的剩余空间的起始偏移地址,根据当前应用实例的偏移地址将所述创建的对象的偏移地址存入到当前应用实例中与所述对象地址位置对应的位置中,返回步骤S1;
步骤S5:所述java卡虚拟机根据所述修改对象指令获取对象地址位置,根据所述对象地址位置从当前应用实例中获取对象偏移地址,根据所述修改对象指令获取修改位置和修改内容;
步骤S6:所述java卡虚拟机根据所述对象偏移地址和所述修改位置,将所述对象偏移地址上的对象中所述修改位置上的数据修改为所述修改内容,返回步骤S1。
2.根据权利要求1所述的方法,其特征在于,所述步骤S1之前还包括:所述java卡虚拟机接收用户发送的选择应用指令,根据所述选择应用指令获取应用ID,根据所述应用ID查找对应的应用程序,并判断是否查找到与所述应用ID对应的应用程序,是则将查找到的所述应用程序作为当前应用程序,执行步骤S1,否则提示错误,结束。
3.根据权利要求1所述的方法,其特征在于,所述步骤S2具体为:所述java卡虚拟机对所述创建对象指令进行编译,得到第一编译指令,根据所述第一编译指令获取与所述当前应用程序对应的应用实例的偏移地址,将所述偏移地址上的应用实例作为当前应用实例,根据所述第一编译指令获取对象大小、对象类型和对象地址位置。
4.根据权利要求1所述的方法,其特征在于,所述步骤S2中根据所述创建对象指令获取对象大小为:所述java卡虚拟机从所述创建对象指令中获取所述对象大小。
5.根据权利要求1所述的方法,其特征在于,所述步骤S2中根据所述创建对象指令获取对象大小为:所述java卡虚拟机从所述创建对象指令中获取存储区的偏移地址和数据在存储区中的位置,根据所述存储区的偏移地址,在存储区中根据所述数据在存储区中的位置获取数据,将获取到的数据作为所述对象大小。
6.根据权利要求1所述的方法,其特征在于,所述步骤S3与步骤S4之间包括:所述java卡虚拟机从所述系统信息中获取对象堆大小,根据所述对象堆大小和所述对象堆的剩余空间的起始偏移地址得到对象堆的剩余空间大小,判断所述对象堆的剩余空间大小是否大于所述对象大小,是则执行步骤S4,否则提示错误,返回步骤S1。
7.根据权利要求1所述的方法,其特征在于,所述步骤S5具体为:所述java卡虚拟机对所述修改对象指令进行编译,得到第二编译指令,根据所述第二编译指令获取对象地址位置,根据所述对象地址位置从当前应用实例中获取对象偏移地址,根据所述第二编译指令获取修改位置和修改内容。
8.根据权利要求1所述的方法,其特征在于,所述步骤S5中根据所述修改对象指令获取修改内容为:所述java卡虚拟机从所述修改对象指令中获取所述修改内容。
9.根据权利要求1所述的方法,其特征在于,所述步骤S5中根据所述修改对象指令获取修改内容为:所述java卡虚拟机从所述修改对象指令中获取存储区的偏移地址和数据在存储区中的位置,根据所述存储区的偏移地址,在存储区中根据所述数据在存储区中的位置获取数据,将获取到的数据作为所述修改内容。
10.根据权利要求1所述的方法,其特征在于,所述步骤S1中判断所述指令的类型,还包括,若是删包指令则执行步骤S7;
步骤S7:所述java卡虚拟机扫描包堆,根据所述包堆中的组件的偏移地址计算出包堆碎片,对所述包堆碎片进行合并,执行步骤S8;
步骤S8:所述java卡虚拟机扫描对象堆,将对象堆中需要被回收的对象作为对象堆碎片进行合并,并将合并过程中的对象偏移地址的初值、对象偏移地址的终值和对象堆碎片大小记录到系统信息中,返回步骤S1。
11.根据权利要求10所述的方法,其特征在于,所述步骤S7具体为:
步骤S7-1:所述java卡虚拟机获取所述包堆的最高偏移地址,并将其作为当前偏移地址;
步骤S7-2:所述java卡虚拟机判断所述当前偏移地址是否大于包堆剩余空间的起始偏移地址,是则执行步骤S7-3;否则执行步骤S7-8;
步骤S7-3:所述java卡虚拟机在所述包堆中查找偏移地址小于当前偏移地址的组件,判断是否查找到偏移地址小于当前偏移地址的组件,是则执行步骤S7-4,否则执行步骤S7-7;
步骤S7-4:所述java卡虚拟机在查找到的所述组件中获取偏移地址最大的组件作为当前组件的相邻组件,根据当前偏移地址与所述相邻组件的偏移地址之间的碎片大小更新包堆碎片大小,执行步骤S7-5;
步骤S7-5:所述java卡虚拟机根据所述相邻组件的偏移地址更新当前偏移地址,根据当前偏移地址更新当前组件,判断所述包堆碎片大小是否为0,是则返回步骤S7-2,否则执行步骤S7-6;
步骤S7-6:所述java卡虚拟机根据所述包堆碎片大小,将当前组件向高地址方向移动,返回步骤S7-2;
步骤S7-7:所述java卡虚拟机根据当前偏移地址与所述包堆剩余空间的起始偏移地址之间的碎片大小更新所述包堆碎片大小,执行步骤S7-8;
步骤S7-8:所述java卡虚拟机判断所述包堆碎片大小是否为0,是则执行步骤S8,否则根据所述包堆碎片大小更新所述包堆剩余空间的起始偏移地址,执行步骤S8。
12.根据权利要求10所述的方法,其特征在于,所述步骤S8具体为:
步骤S8-1:所述java卡虚拟机初始化所述系统信息中的对象偏移地址的初值、对象偏移地址的终值和对象堆碎片大小,获取对象堆剩余空间的起始偏移地址;
步骤S8-2:所述java卡虚拟机判断所述对象偏移地址的初值是否小于所述对象堆剩余空间的起始偏移地址,是则执行步骤S8-3,否则执行步骤S8-8;
步骤S8-3:所述java卡虚拟机记录所述对象偏移地址的初值的位置上的对象的大小,判断所述对象偏移地址的初值的位置上的对象是否需要回收,是则执行步骤S8-4,否则执行步骤S8-5;
步骤S8-4:所述java卡虚拟机根据记录的所述对象的大小更新所述系统信息中的所述对象堆碎片大小,将所述对象堆中使用所述对象偏移地址的初值的位置设置为空,执行步骤S8-7;
步骤S8-5:所述java卡虚拟机判断所述对象堆碎片大小是否为0,是则执行步骤S8-7,否则执行步骤S8-6;
步骤S8-6:所述java卡虚拟机根据所述对象偏移地址的初值和所述对象堆碎片大小更新所述系统信息中的所述对象偏移地址的终值,将所述对象偏移地址的初值的位置上的对象移动到所述对象偏移地址的终值的位置上,将所述对象堆中使用的所述对象偏移地址的初值更新为所述记录的对象偏移地址的终值,执行步骤S8-7;
步骤S8-7:所述java卡虚拟机根据记录的所述对象的大小更新所述记录的对象偏移地址的初值,返回步骤S8-2;
步骤S8-8:所述java卡虚拟机判断所述对象堆碎片大小是否为0,是则执行步骤S8-10,否则执行步骤S8-9;
步骤S8-9:所述java卡虚拟机根据所述对象堆碎片大小更新所述对象堆剩余空间的起始偏移地址,执行步骤S8-10;
步骤S8-10:所述java卡虚拟机清空所述系统信息中的所述对象偏移地址的初值、所述对象偏移地址的终值和所述对象堆碎片大小,返回步骤S1。
13.根据权利要求12所述的方法,其特征在于,所述步骤S5与步骤S6之间包括:所述java卡虚拟机判断获取到的所述对象偏移地址是否为空,是则提示错误,返回步骤S1,否则执行步骤S6。
14.根据权利要求1所述的方法,其特征在于,所述步骤S1中判断所述指令的类型,还包括,若是垃圾回收指令则执行步骤S9;
步骤S9:所述java卡虚拟机扫描对象堆,将所述对象堆中需要被回收的对象作为对象堆碎片进行合并,并将合并过程中的对象偏移地址的初值、对象偏移地址的终值和对象堆碎片大小记录到系统信息中,返回步骤S1。
15.根据权利要求14所述的方法,其特征在于,所述步骤S9具体为:
步骤S9-1:所述java卡虚拟机初始化所述系统信息中的对象偏移地址的初值、对象偏移地址的终值和对象堆碎片大小,获取对象堆剩余空间的起始偏移地址;
步骤S9-2:所述java卡虚拟机判断所述对象偏移地址的初值是否小于所述对象堆剩余空间的起始偏移地址,是则执行步骤S9-3,否则执行步骤S9-8;
步骤S9-3:所述java卡虚拟机记录所述对象偏移地址的初值的位置上的对象的大小,判断所述对象偏移地址的初值的位置上的对象是否需要回收,是则执行步骤S9-4,否则执行步骤S9-5;
步骤S9-4:所述java卡虚拟机根据记录的所述对象的大小更新所述系统信息中的所述对象堆碎片大小,将所述对象堆中使用所述对象偏移地址的初值的位置设置为空,执行步骤S9-7;
步骤S9-5:所述java卡虚拟机判断所述对象堆碎片大小是否为0,是则执行步骤S9-7,否则执行步骤S9-6;
步骤S9-6:所述java卡虚拟机根据所述对象偏移地址的初值和所述对象堆碎片大小更新所述系统信息中的所述对象偏移地址的终值,将所述对象偏移地址的初值的位置上的对象移动到所述对象偏移地址的终值的位置上,将所述对象堆中使用的所述对象偏移地址的初值更新为所述对象偏移地址的终值,执行步骤S9-7;
步骤S9-7:所述java卡虚拟机根据记录的所述对象的大小更新所述记录的对象偏移地址的初值,返回步骤S9-2;
步骤S9-8:所述java卡虚拟机判断所述对象堆碎片大小是否为0,是则执行步骤S9-10,否则执行步骤S9-9;
步骤S9-9:所述java卡虚拟机根据所述对象堆碎片大小更新所述对象堆剩余空间的起始偏移地址,执行步骤S9-10;
步骤S9-10:所述java卡虚拟机清空所述系统信息中的所述对象偏移地址的初值、所述对象偏移地址的终值和所述对象堆碎片大小,返回步骤S1。
16.根据权利要求15所述的方法,其特征在于,所述步骤S5与步骤S6之间包括:所述java卡虚拟机判断获取到的所述对象偏移地址是否为空,是则提示错误,返回步骤S1,否则执行步骤S6。
17.根据权利要求10或14所述的方法,其特征在于,所述步骤S1之前包括:
步骤S0:所述java卡虚拟机根据系统信息中在对象堆碎片进行合并过程中记录的所述对象堆碎片大小判断是否需要进行掉电恢复,是则执行步骤S10,否则执行步骤S1;
步骤S10:所述java卡虚拟机根据系统信息中在对象堆碎片进行合并过程中记录的所述对象偏移地址的初值和所述对象偏移地址的终值进行掉电恢复后,执行步骤S1。
18.根据权利要求17所述的方法,其特征在于,所述步骤S10包括:
步骤S10-1:所述java卡虚拟机获取所述系统信息中在对象堆碎片进行合并过程中记录的所述对象偏移地址的初值和所述对象偏移地址的终值;
步骤S10-2:所述java卡虚拟机扫描对象堆,将所述对象堆中使用的所述对象偏移地址的初值更新为记录的所述对象偏移地址的终值,获取所述对象堆的尾地址;
步骤S10-3:所述java卡虚拟机根据所述记录的对象偏移地址的终值的位置上的对象的大小更新记录的对象偏移地址的初值,判断所述记录的对象偏移地址的初值是否小于所述对象堆剩余空间的起始偏移地址,是则执行步骤S10-4,否则执行步骤S10-6;
步骤S10-4:所述java卡虚拟机根据所述记录的对象偏移地址的初值和所述对象堆碎片大小更新所述记录的对象偏移地址的终值,将所述记录的对象偏移地址的初值的位置上的对象移动到所述记录的对象偏移地址的终值的位置上;
步骤S10-5:所述java卡虚拟机将所述对象堆中使用的所述对象偏移地址的初值更新为所述记录的对象偏移地址的终值,返回步骤S10-3;
步骤S10-6:所述java卡虚拟机根据所述对象堆碎片大小更新所述系统信息中的所述对象堆剩余空间的起始偏移地址,清空所述系统信息中记录的对象偏移地址的初值、所述对象偏移地址的终值和所述对象堆碎片大小,执行步骤S1。
19.一种可进行高效对象管理的装置,其特征在于,所述装置包括:接收模块、第一判断模块、第一获取模块、第二获取模块、创建模块、第三获取模块和修改模块;
所述接收模块,用于接收来自当前应用程序的指令;
所述第一判断模块,用于判断所述接收模块接收到的所述指令的类型;
所述第一获取模块,用于在所述第一判断模块判断所述指令的类型为创建对象指令时,根据所述创建对象指令获取与所述当前应用程序对应的应用实例的偏移地址,将所述偏移地址上的应用实例作为当前应用实例,根据所述创建对象指令获取对象大小、对象类型和对象地址位置;
所述第二获取模块,用于从系统信息中获取对象堆的剩余空间的起始偏移地址;
所述创建模块,用于将所述第二获取模块获取到的所述对象堆的剩余空间的起始偏移地址作为创建的对象的偏移地址,按照所述第一获取模块获取到的所述对象大小和所述对象类型创建对象,根据所述对象大小更新所述系统信息中的所述对象堆的剩余空间的起始偏移地址,根据当前应用实例的偏移地址将所述创建的对象的偏移地址存入到当前应用实例中与所述对象地址位置对应的位置中;
所述第三获取模块,用于在所述第一判断模块判断所述指令的类型为修改对象指令时,根据所述修改对象指令获取对象地址位置,根据所述对象地址位置从当前应用实例中获取对象偏移地址,根据所述修改对象指令获取修改位置和修改内容;
所述修改模块,用于根据所述第三获取模块获取到的所述对象偏移地址和所述修改位置,将所述对象偏移地址上的对象中所述修改位置上的数据修改为所述第三获取模块获取到的所述修改内容。
20.根据权利要求19所述的装置,其特征在于,所述接收模块还用于接收用户发送的选择应用指令;
所述装置还包括查找模块和提示模块;
所述查找模块,用于根据所述接收模块接收到的所述选择应用指令获取应用ID,根据所述应用ID查找对应的应用程序,并判断是否查找到与所述应用ID对应的应用程序,是则将查找到的所述应用程序作为当前应用程序;
所述提示模块,用于在所述查找模块未查找到与所述应用ID对应的应用程序时,提示错误;
所述接收模块还用于在所述查找模块查找到与所述应用ID对应的应用程序时,进行工作。
21.根据权利要求19所述的装置,其特征在于,所述第一获取模块包括:第一编译单元和第一获取单元;
所述第一编译单元,用于对所述创建对象指令进行编译,得到第一编译指令;
所述第一获取单元,用于根据所述第一编译单元编译得到的所述第一编译指令获取与所述当前应用程序对应的应用实例的偏移地址,将所述偏移地址上的应用实例作为当前应用实例,根据所述第一编译单元编译得到的所述第一编译指令获取对象大小、对象类型和对象地址位置。
22.根据权利要求19所述的装置,其特征在于,所述第一获取模块具体用于在所述第一判断模块判断所述指令的类型为创建对象指令时,根据所述创建对象指令获取与所述当前应用程序对应的应用实例的偏移地址,将所述偏移地址上的应用实例作为当前应用实例,从所述创建对象指令中获取所述对象大小,根据所述创建对象指令获取对象类型和对象地址位置。
23.根据权利要求19所述的装置,其特征在于,所述第一获取模块具体用于在所述第一判断模块判断所述指令的类型为创建对象指令时,根据所述创建对象指令获取与所述当前应用程序对应的应用实例的偏移地址,将所述偏移地址上的应用实例作为当前应用实例,从所述创建对象指令中获取存储区的偏移地址和数据在存储区中的位置,根据所述存储区的偏移地址,在存储区中根据所述数据在存储区中的位置获取数据,将获取到的数据作为所述对象大小,根据所述创建对象指令获取对象类型和对象地址位置。
24.根据权利要求19所述的装置,其特征在于,所述装置还包括第四获取模块、第二判断模块和提示模块;
所述第四获取模块,用于从所述系统信息中获取对象堆大小,根据所述对象堆大小和所述对象堆的剩余空间的起始偏移地址得到对象堆的剩余空间大小;
所述第二判断模块,用于判断所述对象堆的剩余空间大小是否大于所述对象大小;
所述提示模块,用于在所述第二判断模块判断为否时,提示错误;
所述创建模块还用于在所述第二判断模块判断为是时,进行工作。
25.根据权利要求19所述的装置,其特征在于,所述第三获取模块包括:第二编译单元和第二获取单元;
所述第二编译单元,用于对所述修改对象指令进行编译,得到第二编译指令;
所述第二获取单元,用于根据所述第二编译单元编译得到的所述第二编译指令获取对象地址位置,根据所述对象地址位置从当前应用实例中获取对象偏移地址,根据所述第二编译指令获取修改位置和修改内容。
26.根据权利要求19所述的装置,其特征在于,所述第三获取模块具体用于在所述第一判断模块判断所述指令的类型为修改对象指令时,根据所述修改对象指令获取对象地址位置,根据所述对象地址位置从当前应用实例中获取对象偏移地址,从所述修改对象指令中获取所述修改内容,根据所述修改对象指令获取修改位置。
27.根据权利要求19所述的装置,其特征在于,所述第三获取模块具体用于在所述第一判断模块判断所述指令的类型为修改对象指令时,根据所述修改对象指令获取对象地址位置,根据所述对象地址位置从当前应用实例中获取对象偏移地址,从所述修改对象指令中获取存储区的偏移地址和数据在存储区中的位置,根据所述存储区的偏移地址,在存储区中根据所述数据在存储区中的位置获取数据,将获取到的数据作为所述修改内容,根据所述修改对象指令获取修改位置。
28.根据权利要求19所述的装置,其特征在于,所述装置还包括第一合并模块和第二合并模块;
所述第一合并模块,用于在所述第一判断模块判断所述指令的类型为删包指令时,扫描包堆,根据所述包堆中的组件的偏移地址计算出包堆碎片,对所述包堆碎片进行合并;
所述第二合并模块,用于在所述第一合并模块对所述包堆碎片进行合并后,扫描对象堆,将对象堆中需要被回收的对象作为对象堆碎片进行合并,并将合并过程中的对象偏移地址的初值、对象偏移地址的终值和对象堆碎片大小记录到系统信息中。
29.根据权利要求28所述的装置,其特征在于,所述第一合并模块包括:第三获取单元、第一判断单元、查找单元、第四获取单元、第一更新单元、第二判断单元、第一移动单元、第二更新单元和第三更新单元;
所述第三获取单元,用于在所述第一判断模块判断所述指令的类型为删包指令时,获取所述包堆的最高偏移地址,并将其作为当前偏移地址;
所述第一判断单元,用于判断所述当前偏移地址是否大于包堆剩余空间的起始偏移地址;
所述查找单元,用于当所述第一判断单元判断当前偏移地址大于包堆剩余空间的起始偏移地址时,在所述包堆中查找偏移地址小于当前偏移地址的组件,判断是否查找到偏移地址小于当前偏移地址的组件;
所述第四获取单元,用于当所述查找单元查找到偏移地址小于当前偏移地址的组件时,在查找到的所述组件中获取偏移地址最大的组件作为当前组件的相邻组件,根据当前偏移地址与所述相邻组件的偏移地址之间的碎片大小更新包堆碎片大小;
所述第一更新单元,用于根据所述第四获取单元获取到的所述相邻组件的偏移地址更新当前偏移地址,根据当前偏移地址更新当前组件;
所述第二判断单元,用于判断所述包堆碎片大小是否为0;
所述第一移动单元,用于当所述第二判断单元判断为否时,根据所述包堆碎片大小,将当前组件向高地址方向移动;
所述第二更新单元,用于当所述查找单元查找不到偏移地址小于当前偏移地址的组件时,根据当前偏移地址与所述包堆剩余空间的起始偏移地址之间的碎片大小更新所述包堆碎片大小;
所述第三更新单元,用于根据所述包堆碎片大小更新所述包堆剩余空间的起始偏移地址。
30.根据权利要求28所述的装置,其特征在于,所述第二合并模块包括:第五获取单元、第三判断单元、第一记录单元、第四判断单元、第四更新单元、第一设置单元、第五判断单元、第五更新单元、第二移动单元、第六更新单元、第七更新单元、第八更新单元和第一清除单元;
所述第五获取单元,用于初始化所述系统信息中的对象偏移地址的初值、对象偏移地址的终值和对象堆碎片大小,获取对象堆剩余空间的起始偏移地址;
所述第三判断单元,用于判断所述对象偏移地址的初值是否小于所述对象堆剩余空间的起始偏移地址;
所述第一记录单元,用于当所述第三判断单元判断为是时,记录所述对象偏移地址的初值的位置上的对象的大小;
所述第四判断单元,用于判断所述对象偏移地址的初值的位置上的对象是否需要回收;
所述第四更新单元,用于当所述第四判断单元判断为是时,根据记录的所述对象的大小更新所述系统信息中的所述对象堆碎片大小;
所述第一设置单元,用于当所述第四判断单元判断为是时,将所述对象堆中使用所述对象偏移地址的初值的位置设置为空;
所述第五判断单元,用于判断所述对象堆碎片大小是否为0;
所述第五更新单元,用于当所述第五判断单元判断为否时,根据所述对象偏移地址的初值和所述对象堆碎片大小更新所述系统信息中的所述对象偏移地址的终值;
所述第二移动单元,用于当第五更新单元更新所述对象偏移地址的终值后,将所述对象偏移地址的初值的位置上的对象移动到所述对象偏移地址的终值的位置上;
所述第六更新单元,用于当所述第二移动单元移动对象后,将所述对象堆中使用的所述对象偏移地址的初值更新为所述对象偏移地址的终值;
所述第七更新单元,用于当所述第五判断单元判断为否时,或当所述第一设置模块将所述对象堆中使用所述对象偏移地址的初值的位置设置为空后,或当所述第六更新单元将所述对象堆中使用的所述对象偏移地址的初值更新为所述对象偏移地址的终值后,根据记录的所述对象的大小更新所述系统信息中的所述对象偏移地址的初值;
所述第八更新单元,用于根据所述对象堆碎片大小更新所述对象堆剩余空间的起始偏移地址;
所述第一清除单元,用于清空所述系统信息中的所述对象偏移地址的初值、所述对象偏移地址的终值和所述对象堆碎片大小。
31.根据权利要求30所述的装置,其特征在于,所述装置还包括:第三判断模块和提示模块;
所述第三判断模块,用于在所述第三获取模块获取到所述对象偏移地址后,判断获取到的所述对象偏移地址是否为空;
所述提示模块,用于在所述第三判断模块判断为是时,提示错误;
所述修改模块还用于在所述第三判断模块判断为否时,进行工作。
32.根据权利要求19所述的装置,其特征在于,所述装置还包括第三合并模块;
所述第三合并模块,用于在所述第一判断模块判断所述指令的类型为垃圾回收时,扫描对象堆,将所述对象堆中需要被回收的对象作为对象堆碎片进行合并,并将合并过程中的对象偏移地址的初值、对象偏移地址的终值和对象堆碎片大小记录到系统信息中。
33.根据权利要求32所述的装置,其特征在于,所述第三合并模块包括:第六获取单元、第六判断单元、第二记录单元、第七判断单元、第九更新单元、第二设置单元、第八判断单元、第十更新单元、第三移动单元、第十一更新单元、第十二更新单元、第十三更新单元和第二清除单元;
所述第六获取单元,用于初始化所述系统信息中的对象偏移地址的初值、对象偏移地址的终值和对象堆碎片大小,获取对象堆剩余空间的起始偏移地址;
所述第六判断单元,用于判断所述对象偏移地址的初值是否小于所述对象堆剩余空间的起始偏移地址;
所述第二记录单元,用于当所述第六判断单元判断为是时,记录所述对象偏移地址的初值的位置上的对象的大小;
所述第七判断单元,用于判断所述对象偏移地址的初值的位置上的对象是否需要回收;
所述第九更新单元,用于当所述第七判断单元判断为是时,根据记录的所述对象的大小更新所述系统信息中的所述对象堆碎片大小;
所述第二设置单元,用于当所述第七判断单元判断为是时,将所述对象堆中使用所述对象偏移地址的初值的位置设置为空;
所述第八判断单元,用于判断所述对象堆碎片大小是否为0;
所述第十更新单元,用于当所述第八判断单元判断为否时,根据所述对象偏移地址的初值和所述对象堆碎片大小更新所述系统信息中的所述对象偏移地址的终值;
所述第三移动单元,用于当第十更新单元更新所述对象偏移地址的终值后,将所述对象偏移地址的初值的位置上的对象移动到所述对象偏移地址的终值的位置上;
所述第十一更新单元,用于当所述第三移动单元移动对象后,将所述对象堆中使用的所述对象偏移地址的初值更新为所述对象偏移地址的终值;
所述第十二更新单元,用于当所述第八判断单元判断为否时,或当所述第二设置模块将所述对象堆中使用所述对象偏移地址的初值的位置设置为空后,或当所述第十一更新单元将所述对象堆中使用的所述对象偏移地址的初值更新为所述对象偏移地址的终值后,根据记录的所述对象的大小更新所述系统信息中的所述对象偏移地址的初值;
所述第十三更新单元,用于根据所述对象堆碎片大小更新所述对象堆剩余空间的起始偏移地址;
所述第二清除单元,用于清空所述系统信息中的所述对象偏移地址的初值、所述对象偏移地址的终值和所述对象堆碎片大小。
34.根据权利要求33所述的装置,其特征在于,所述装置还包括:第四判断模块和提示模块;
所述第四判断模块,用于在所述第三获取模块获取到所述对象偏移地址后,判断获取到的所述对象偏移地址是否为空;
所述提示模块,用于在所述第四判断模块判断为是时,提示错误;
所述修改模块还用于在所述第四判断模块判断为否时,进行工作。
35.根据权利要求28或32所述的装置,其特征在于,所述装置还包括第五判断模块和掉电恢复模块;
所述第五判断模块,用于根据系统信息中在对象堆碎片进行合并过程中记录的所述对象堆碎片大小判断是否需要进行掉电恢复;
所述掉电恢复模块,用于在所述第五判断模块判断为是时,根据系统信息中在对象堆碎片进行合并过程中记录的所述对象偏移地址的初值和所述对象偏移地址的终值进行掉电恢复;
所述接收模块还用于在所述第五判断模块判断为否时,或所述掉电恢复模块进行掉电恢复后,进行工作。
36.根据权利要求35所述的装置,其特征在于,所述掉电恢复模块包括:第七获取单元、第十四更新单元、第八获取单元、第十五更新单元、第九判断单元、第十六更新单元、第四移动单元、第十七更新单元和第十八更新单元;
所述第七获取单元,用于获取所述系统信息中在对象堆碎片进行合并过程中记录的所述对象偏移地址的初值和所述对象偏移地址的终值;
所述第十四更新单元,用于在所述第七获取单元获取到所述对象偏移地址的初值和所述对象偏移地址的终值后,扫描对象堆,将所述对象堆中使用的所述对象偏移地址的初值更新为记录的所述对象偏移地址的终值;
所述第八获取单元,用于在所述第七获取单元获取到所述对象偏移地址的初值和所述对象偏移地址的终值后,获取所述对象堆的尾地址;
所述第十五更新单元,用于根据所述记录的对象偏移地址的终值的位置上的对象的大小更新记录的对象偏移地址的初值;
所述第九判断单元,用于在所述第十五更新单元更新所述记录的对象偏移地址的初值后,判断所述记录的对象偏移地址的初值是否小于所述对象堆剩余空间的起始偏移地址;
所述第十六更新单元,用于在所述第九判断单元判断为是时,根据所述记录的对象偏移地址的初值和所述对象堆碎片大小更新所述记录的对象偏移地址的终值;
所述第四移动单元,用于在所述第十六更新单元更新所述记录的对象偏移地址的终值后,将所述记录的对象偏移地址的初值的位置上的对象移动到所述记录的对象偏移地址的终值的位置上;
所述第十七更新单元,用于在所述第四移动单元移动对象后,将所述对象堆中使用的所述对象偏移地址的初值更新为所述记录的对象偏移地址的终值;所述第十八更新单元,用于在所述第九判断单元判断为否时,根据所述对象堆碎片大小更新所述系统信息中的所述对象堆剩余空间的起始偏移地址,清空系统信息中记录的所述对象偏移地址的初值、所述对象偏移地址的终值和所述对象堆碎片大小。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410174222.5A CN103955395B (zh) | 2014-04-28 | 2014-04-28 | 一种可进行高效对象管理的方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410174222.5A CN103955395B (zh) | 2014-04-28 | 2014-04-28 | 一种可进行高效对象管理的方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN103955395A CN103955395A (zh) | 2014-07-30 |
CN103955395B true CN103955395B (zh) | 2017-02-22 |
Family
ID=51332671
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201410174222.5A Expired - Fee Related CN103955395B (zh) | 2014-04-28 | 2014-04-28 | 一种可进行高效对象管理的方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN103955395B (zh) |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107341049B (zh) * | 2017-07-03 | 2020-02-11 | 飞天诚信科技股份有限公司 | 一种事务处理的优化处理方法及装置 |
CN112230941B (zh) * | 2020-09-22 | 2024-03-29 | 成都融微软件服务有限公司 | 一种Java Card包及应用程序安装方法和工具 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101777061A (zh) * | 2009-12-31 | 2010-07-14 | 北京握奇数据系统有限公司 | 一种java卡对象管理方法及java卡 |
CN102253854A (zh) * | 2011-07-26 | 2011-11-23 | 华为技术有限公司 | 业务处理方法和Java虚拟机 |
CN102799660A (zh) * | 2012-07-04 | 2012-11-28 | 北京中电华大电子设计有限责任公司 | 一种java卡对象管理方法 |
CN103116518A (zh) * | 2013-01-28 | 2013-05-22 | 飞天诚信科技股份有限公司 | 一种基于java卡虚拟机中对象管理的方法 |
CN103559073A (zh) * | 2013-10-28 | 2014-02-05 | 飞天诚信科技股份有限公司 | 一种基于Java卡的数据管理方法 |
-
2014
- 2014-04-28 CN CN201410174222.5A patent/CN103955395B/zh not_active Expired - Fee Related
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101777061A (zh) * | 2009-12-31 | 2010-07-14 | 北京握奇数据系统有限公司 | 一种java卡对象管理方法及java卡 |
CN102253854A (zh) * | 2011-07-26 | 2011-11-23 | 华为技术有限公司 | 业务处理方法和Java虚拟机 |
CN102799660A (zh) * | 2012-07-04 | 2012-11-28 | 北京中电华大电子设计有限责任公司 | 一种java卡对象管理方法 |
CN103116518A (zh) * | 2013-01-28 | 2013-05-22 | 飞天诚信科技股份有限公司 | 一种基于java卡虚拟机中对象管理的方法 |
CN103559073A (zh) * | 2013-10-28 | 2014-02-05 | 飞天诚信科技股份有限公司 | 一种基于Java卡的数据管理方法 |
Also Published As
Publication number | Publication date |
---|---|
CN103955395A (zh) | 2014-07-30 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN102521145B (zh) | Java卡系统及其空间分配处理方法 | |
CN103150259B (zh) | 一种内存回收方法和装置 | |
US6275916B1 (en) | Object oriented program memory management system and method using fixed sized memory pools | |
CN103955395B (zh) | 一种可进行高效对象管理的方法及装置 | |
CN109408699B (zh) | 一种同步缓存zTree树实现树节点快速检索的方法 | |
CN1321377C (zh) | 智能卡存储环境的控制方法 | |
CN102722432B (zh) | 追踪内存访问的方法和装置 | |
CN101840373B (zh) | 数据操作方法及装置 | |
CN202041837U (zh) | 一种智能配电网操作票生成管理系统 | |
CN104462222A (zh) | 一种卡口车辆通行数据的分布式存储方法及系统 | |
CN106776342A (zh) | 一种对移动应用的内存对象进行分析的方法和装置 | |
CN104536773B (zh) | 基于内存扫描的嵌入式软件动态内存回收方法 | |
Di Janni | A monitor for complex CAD systems | |
US8176286B2 (en) | Memory recycling in computer systems | |
US8024374B2 (en) | Computer object conversion using an intermediate object | |
CN108090355A (zh) | 一种apk自动触发工具 | |
CN104317673B (zh) | 应用程序的回收方法、装置及其恢复方法、装置 | |
CN106293939A (zh) | 一种在内存垃圾收集器中动态重用对象的方法 | |
CN109815062A (zh) | 基于内存分析的安卓App历史屏恢复与取证系统 | |
CN109690485A (zh) | 基于数据结构的垃圾回收方法、计算机及存储介质 | |
Mohneu | Efficient compile-time garbage collection for arbitrary data structures | |
CN100382047C (zh) | 把无用方法收集到垃圾箱中的方法和系统 | |
CN103995741A (zh) | 一种Java虚拟机分代垃圾快速回收方法 | |
CN103853850B (zh) | 用户为中心的Android系统数据清除方法及系统 | |
CN111095311A (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 |
Granted publication date: 20170222 |
|
CF01 | Termination of patent right due to non-payment of annual fee |