一种内存管理方法_2

文档序号:8543746阅读:来源:国知局
骤S107:将所述第一类程序引用的活动对象移动至所述目标区域,并将所述第一类程序引用的活动对象在移动之前所占内存释放。
[0041]具体的,在选出所述目标区域之后,终端可以将第一类程序引用的活动对象填充到所述目标区域中。
[0042]具体实现中,终端可以按照从低地址到高地址的顺序连续填充所述目标区域。例如,目标区域为地址“0X0000-0X00FF”的存储区域,则终端可将待移动的活动对象从低地址“0X0000”处开始填充。具体实现中,终端还可以按照从高地址到低地址的顺序连续填充所述目标区域,这里不作限制。
[0043]具体实现中,在所述第一类程序引用的活动对象中,终端可以按照地址高低顺序选择待移动的活动对象。例如,所述目标区域外的存储空间“0X0000-0X0020”中从低至高依次存储有对象A和对象B,则终端可以先移动对象A,再移动对象B。
[0044]具体实现中,在所述预设内存中,如果存在预设容量的内存片段中只有所述第一类程序引用的活动对象,则终端优先移动该预设容量的内存片段中的所述第一类程序引用的活动对象,以实现在预设内存中高效率的腾出一段连续的可分配内存片段。例如,如果所述预设内存中存在I兆内存片段中只有所述第一类程序引用的活动对象,则终端优先移动该I兆存储区域中的所述第一类程序引用的活动对象。
[0045]进一步的,在执行步骤S107之前,终端还可以判断所述目标区域中是否包含所述第一类程序引用的活动对象,若是,则将所述目标区域中的所述第一类程序引用的活动对象移动至所述目标区域的一端,用以连续的填充所述目标区域。具体实现中,终端可以将所述目标区域中的所述第一类程序引用的活动对象移动至所述目标区域的高地址端,也可以将所述目标区域中的所述第一类程序引用的活动对象移动至所述目标区域的低地址端,这里不作限制。
[0046]另外,在执行步骤SlOl之后,终端还可以释放所述预设内存中的垃圾对象所占内存。
[0047]具体实现中,终端可以使用引用计数方法对所述预设内存中的垃圾对象进行管理。例如在引用计数收集器中,获取每个对象的计数值等,将计数为O的对象进行回收。对于所述预设内存中的一个对象,当有其他变量被赋值为这个对象的引用时,其计数加I ;当这个对象的引用超过了生存期或被设置为新的值,其计数减I;当其计数为O时,该对象被认为是垃圾对象,将被回收。
[0048]具体实现中,终端还可以使用跟踪方法对所述预设内存中的垃圾对象进行管理。例如,在追踪收集器中,将未标记的内存对象进行回收。示例仅仅是本发明实施例的一种实现方式,实际使用中可以不同,不应构成限定。
[0049]参见图2,是本发明实施例提供的内存管理方法的第二实施例的流程图,该方法包括:
[0050]步骤S201:接收清理指令。
[0051]具体的,可参见图1实施例的步骤SlOl中的内容,这里不再赘述。
[0052]步骤S203:响应所述清理指令,在所述预设内存中,分析出第一类程序引用的活动对象和第二类程序引用的活动对象。
[0053]具体的,可参见图1实施例的步骤S103中的内容,这里不再赘述。
[0054]步骤S205:遍历所述预设内存中的大小等于所述目标区域的容量的内存片段。
[0055]具体的,所述目标区域的容量大于或等于所述预设内存中的全部活动对象所占内存。所述目标区域的容量小于所述预设内存的容量。
[0056]具体实现中,如图2A所示,所述预设内存包含连续N个字节(Byte),所述目标区域包含连续M个字节(Byte),其中,N和M均为正整数,N大于M。可理解的,如果遍历步长为I个字节,则图示连续N个字节中包含有(N-M+1)个图示连续M个字节的内存片段。也就是说,终端需要遍历所述预设内存中的(N-M+1)个内存片段。
[0057]需要说明的,在遍历所述预设内存时,终端也可以选取两个字节作为遍历步长。也就是说,终端需要遍历所述预设内存中的(N-M+l)/2个内存片段。例如,第I个字节至第M个字节为第I个内存片段,第3个字节至第M+2个字节为第2个内存片段。实际应用中,在遍历所述预设内存时,终端还可以选取其他大小的遍历步长,这里不作限制。
[0058]步骤S207:各自计算出所述内存片段中包含的所述第二类程序引用的活动对象的个数。
[0059]具体的,对于所述预设内存中包含的大小等于所述目标区域的内存片段,例如,图2A所示的(N-M+1)个内存片段,终端可分别计算出每一个所述内存片段中包含的所述第二类程序引用的活动对象的个数。例如,如图2A所示,终端可以分别计算出(N-M+1)个内存片段中各自包含的所述第二类程序引用的活动对象的个数。
[0060]步骤S209:将包含有第二类程序引用的活动对象的个数最多的内存片段选定为所述目标区域。
[0061]具体的,举例来说,如图2A所示,如果所述(N-M+1)个内存片段中的第I个内存片段中包含的第二类程序引用的活动对象的个数最多,则将所述(N-M+1)个内存片段中的第I个内存片段选定为所述目标区域。可理解的,选定的目标区域中包含的第二类程序引用的活动对象越多,目标区域外的第二类程序引用的活动对象则越少,在所述第一类程序引用的活动对象被移动到目标区域中之后,目标区域外的内存碎片越少。
[0062]步骤S211:将所述第一类程序引用的活动对象移动至所述目标区域,并将所述第一类程序引用的活动对象在移动之前所占内存释放。
[0063]具体的,可参见图1实施例的步骤S107中的内容,这里不再赘述。
[0064]步骤S213:监测运行在所述目标区域内的所述第二类程序是否变成所述第一类程序。
[0065]可理解的,根据前述步骤S205至步骤S209可知,所述目标区域中包含有所述第二类程序引用的活动对象,所述第二类程序引用的活动对象会将所述目标区域分隔成离散的内存碎片。基于程序的运行状态是动态的,当运行在所述目标区域中的所述第二类程序的用户交互程度降低至低于预先设置的交互度阈值时,终端可判定运行在所述目标区域中的所述第二类程序变成了所述第一类程序。
[0066]具体的,当运行在所述目标区域中的所述第二类程序变成了所述第一类程序时,可执行步骤S215,否则,可执行步骤S217,实际应用中,还可以重复执行步骤S213,这里不作限制。
[0067]步骤S215:将转变成所述第一类程序的所述第二类程序所引用的活动对象移动至所述目标区域的一端。
[0068]具体的,当运行在所述目标区域中的所述第二类程序变成了所述第一类程序时,则将变成所述第一类程序的所述第二类程序所引用的活动对象移动至所述目标区域的一端,用以整理所述目标区域中的内存碎片,形成连续的空白存储空间。所述目标区域中整理出来的连续空白存储空间可用于连续地存储所述目标区域外的待移动的活动对象。
[0069]步骤S217:监测运行在所述目标区域外的所述第二类程序是否变成所述第一类程序。
[0070]可理解的,程序的运行状态是动态的。当运行在所述目标区域外的所述第二类程序的用户交互程度降低至低于预先设置的交互度阈值时,终端可判定所述运行在所述目标区域外的所述第二类程序变成了所述第一类程序。
[0071]具体的,当运行在所述目标区域外的所述第二类程序变成了所述第一类程序时,可执行步骤S219,用以进一步的整理所述目标区域外的内存碎片,否则,可重复执行步骤S217,实际应用中,还可以执行其他操作,这里不作限制。
[0072]步骤S219:将转变成所述第一类程序的所述第二类程序所引用的活动对象移动至所述目标区域。
[0073]具体的,当终端监测到有运行在所述预设内存外的所述第二类程序变成了所述第一类程序,则终端可以将变成了所述第一类程序引用的活动对象移动至所述目标区域的一端,用以进一步的整理所述目标区域外的内存碎片。对于其移动方式,可参见步骤S107中的内容,这里不再赘述。
[0074]需要说明的,终端也可以先执行步骤S
当前第2页1 2 3 4 5 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1