一种基于生命期预测的内存分配和垃圾收集方法

文档序号:6548758阅读:155来源:国知局
一种基于生命期预测的内存分配和垃圾收集方法
【专利摘要】一种基于生命期预测的内存分配和垃圾收集方法,通过对分配对象的生命期长度进行预测,将生命期长的对象直接分配到年长区域,减少了从年幼区域到年长区域复制的数量,进而降低垃圾回收执行的时间。在年幼区域中,通过对年幼区域的进一步有效划分,实现一种对象分配和垃圾收集同时进行的非暂停模式,从而减少了程序运行过程中的暂停次数。年长区域采用lazy-buddy模式进行内存分配,保证内存分配速度,结合mark-sweep方法进行垃圾收集,既避免了大对象的复制操作,又控制了内存碎片的数量。
【专利说明】一种基于生命期预测的内存分配和垃圾收集方法
【技术领域】
[0001]本发明涉及一种内存自动管理方法,具体是指一种基于生命期预测的内存分配和垃圾收集方法。该方法可用于内存资源有限的开发环境,例如嵌入式虚拟机平台和语言编译环境。
【背景技术】
[0002]现代编程语言当中,例如java和C#,若程序为某个对象分配了内存,当一个对象不再被其它对象引用的时候,这个对象就成为“垃圾”对象,“垃圾”对象所占用的内存如果得不到及时释放,系统内存就会被逐步蚕食殆尽,从而导致应用系统崩溃。
[0003]为解决以上问题,系统需要提供垃圾收集机制。垃圾收集的精确定义是动态分配内存的自动管理机制。垃圾收集器会自动回收垃圾对象所占用的空间以便被后续的新对象使用。
[0004]目前,在成熟的虚拟机和运行平台上,例如SUN的Java虚拟机(JVM)和Microsoft公共语言运行时(CLI)等,垃圾回收器(GC)是必不可少的组成部分,它们普遍采用分代式的垃圾收集算法。分代算法基于对象生命长度差异的原理,将内存分为不同年龄的子堆。由于多数对象存在的时间比较短,垃圾收集器先从最年轻的子堆中收集这些对象,在垃圾收集器运行后存活下来的对象会被移到下一代的子堆中。因为老一代的子堆不会经常被回收,所以节省了时间。但是,传统的分代式GC的次级收集多采用标记-清扫、清扫-压缩或拷贝等基本算法。这些算法均属于“stop-the-worlcTGC模式,在收集期间仍然需要主程序的多次暂停。再者,年长空间收集带来的较长时间延迟对系统影响较为明显。在年长空间的收集方面,采用拷贝算法和火车算法会产生较大的对象移动开销,而单一的清扫算法则会引起内存碎片问题,往往需要结合压缩策略,而压缩又需要较大的系统开销。
[0005]理想的垃圾收集器应该在运行时尽量避免程序的停顿,或者将停顿限制在可以接受的范围之内,同时要求具有较低的资源占有率和较高的收集效率,并且尽量避免内存碎片。垃圾收集作为一个研究重点,目前还没有一种方式能够完美的解决垃圾问题。所以,垃圾收集算法的研究逐渐成为广大程序员关注的要点。

【发明内容】

[0006]本发明的目的是提供一种基于生命期预测的内存分配和垃圾收集方法,在保证内存利用率的同时,减少垃圾收集所引起的暂停次数和执行内存回收所消耗的时间。
[0007]为达到此目的,本发明的技术方案如下:预测由同一加载类所产生对象的生命长度,结合分代思想进行内存分配;在传统内存分代基础上,对年幼区进行进一步的划分,实现内存分配和内存回收的并行执行;年长区采用lazy-buddy模式分配,结合mark-sweep方法进行垃圾收集的策略。具体包括以下内容:
[0008](I)对象生命长度预测及分配区域选择:
[0009]计算在两次垃圾收集执行期间,由同一类所产生的对象存活字节数总和以及这期间此类对象分配字节数总和的比率。通过综合多次比率的平均值来预测此类所产生的对象的生命长度。分配对象时将生命长的对象分配到年长区,生命短的对象分配到年幼区。
[0010](2)年幼区内存划分及分配收集策略:
[0011]年幼区进一步划分为三个区域,三个区域依次用来进行内存分配。在其中两块内存空间不足时,继续在第三块区域进行内存分配,同时,在前两块区域中进行垃圾收集。
[0012](3)年长区分配及收集策略:
[0013]年长区采用lazy-buddy模式进行内存分配,利用mark-sweep方法进行垃圾收集,内存回收完毕后,对相邻空闲内存按照一定的比例进行有效合并。
[0014]本发明优点如下:通过对分配对象的生命期长度进行预测,将生命期长的对象直接分配到年长区域,减少了从年幼区域到年长区域复制的数量,进而降低垃圾回收执行的时间。在年幼区域中,通过对年幼区域的进一步有效划分,实现一种对象分配和垃圾收集同时进行的非暂停模式,从而减 少了程序运行过程中的暂停次数。年长区域采用lazy-buddy模式进行内存分配,保证内存分配速度,结合mark-sweep方法进行垃圾收集,既避免了大对象的复制操作,又控制了内存碎片的数量。
【专利附图】

【附图说明】
[0015]图1为本发明内存分配流程图
[0016]图2为本发明内存区域划分图
[0017]图3为本发明年幼区工作原理图
[0018]图4为本发明年长区内存分配和内存回收流程图
【具体实施方式】
[0019]为实现发明目的,使技术方案和特点更加清楚明白,下面结合附图及具体实施例,对本发明作进一步说明:
[0020]附图1是本发明的内存分配流程图。
[0021]内存分配采用生命期预测机制决定分配区域。当程序为每一个对象申请内存时,首先判断对象所属的类是否为长寿类,长寿类判定标准如下:
[0022]对于一个类C,它在第i次垃圾收集过程中的生存比率,定义为类C的在此次垃圾收集过程中的对象存活率rj。
【权利要求】
1.本发明的目的在于提供一种基于生命期预测的内存分配和垃圾收集方法,其特征在于: (1)一种对象生命期预测方式,进而选择对象分配区域; (2)—种内存区域划分方式,年幼区内存分配和垃圾收集并行执行的原则; (3)—种年长区lazy-buddy和mark_sweep结合的内存分配和垃圾收集的方式。
2.根据权利要求1所述一种基于生命期预测的内存分配和垃圾收集方法,其特征在于,(I)所述的对象生命期预测方式,预测步骤如下: 计算在第i和i_l次垃圾收集期间,由同一类C所产生的对象存活字节数总和Wf以及在此期间类C所分配对象字节数总和<的比率<:
3.根据权利要求书I所述一种基于生命期预测的内存分配和垃圾收集方法,其特征在于,(I)所述的对象分配区域选择,根据其来源类的的P值所定,若P值为O,对象分配到年幼区,若P值为1,对象分配到年长区。
4.根据权利要求书I所述的一种基于生命期预测的内存分配和垃圾收集方法,其特征在于,(2)所述的一种内存区域划分方式为:整个堆内存首先划分为年长区和年幼区两个区域,年幼区再细分为三个等大小区域。
5.根据权利要求书I所述的一种内存分配和垃圾收集方法,其特征在于,(2)所述的年幼区内存分配和垃圾收集并行执行的原则如下: 对象依次在年幼区三个区域上进行内存分配,在其中两块内存空间不足时,继续在第三块区域进行内存分配,同时,在前两块区域中进行垃圾收集,保证内存分配和垃圾收集的同时执行。
6.根据权利要求书I所述的一种基于生命期预测的内存分配和垃圾收集方法,其特征在于,(3)所述的年长区内存分配和回收方式,其工作步骤如下: (a)内存分配:按照lazy-buddy原则,对年长区进行内存分割,相同大小的内存块由同一个链表统一维护; (b)垃圾收集:采用mark-sweep模式,遍历根集,标记有效区域,清除无效区域,回收内存; (C)内存整理:若某一链表空闲数量太多,超出预设值L,则合并此链表内成buddy关系的内存块,将其空闲数量控制在L范围内。
【文档编号】G06F12/02GK104035879SQ201410247496
【公开日】2014年9月10日 申请日期:2014年6月4日 优先权日:2014年6月4日
【发明者】白瑞林, 张涛 申请人:江南大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1