CN104035879A - 一种基于生命期预测的内存分配和垃圾收集方法 - Google Patents
一种基于生命期预测的内存分配和垃圾收集方法 Download PDFInfo
- Publication number
- CN104035879A CN104035879A CN201410247496.2A CN201410247496A CN104035879A CN 104035879 A CN104035879 A CN 104035879A CN 201410247496 A CN201410247496 A CN 201410247496A CN 104035879 A CN104035879 A CN 104035879A
- Authority
- CN
- China
- Prior art keywords
- memory
- district
- memory allocation
- older
- young
- 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.)
- Pending
Links
Landscapes
- Memory System (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
一种基于生命期预测的内存分配和垃圾收集方法,通过对分配对象的生命期长度进行预测,将生命期长的对象直接分配到年长区域,减少了从年幼区域到年长区域复制的数量,进而降低垃圾回收执行的时间。在年幼区域中,通过对年幼区域的进一步有效划分,实现一种对象分配和垃圾收集同时进行的非暂停模式,从而减少了程序运行过程中的暂停次数。年长区域采用lazy-buddy模式进行内存分配,保证内存分配速度,结合mark-sweep方法进行垃圾收集,既避免了大对象的复制操作,又控制了内存碎片的数量。
Description
技术领域
本发明涉及一种内存自动管理方法,具体是指一种基于生命期预测的内存分配和垃圾收集方法。该方法可用于内存资源有限的开发环境,例如嵌入式虚拟机平台和语言编译环境。
背景技术
现代编程语言当中,例如java和C#,若程序为某个对象分配了内存,当一个对象不再被其它对象引用的时候,这个对象就成为“垃圾”对象,“垃圾”对象所占用的内存如果得不到及时释放,系统内存就会被逐步蚕食殆尽,从而导致应用系统崩溃。
为解决以上问题,系统需要提供垃圾收集机制。垃圾收集的精确定义是动态分配内存的自动管理机制。垃圾收集器会自动回收垃圾对象所占用的空间以便被后续的新对象使用。
目前,在成熟的虚拟机和运行平台上,例如SUN的Java虚拟机(JVM)和Microsoft公共语言运行时(CLI)等,垃圾回收器(GC)是必不可少的组成部分,它们普遍采用分代式的垃圾收集算法。分代算法基于对象生命长度差异的原理,将内存分为不同年龄的子堆。由于多数对象存在的时间比较短,垃圾收集器先从最年轻的子堆中收集这些对象,在垃圾收集器运行后存活下来的对象会被移到下一代的子堆中。因为老一代的子堆不会经常被回收,所以节省了时间。但是,传统的分代式GC的次级收集多采用标记-清扫、清扫-压缩或拷贝等基本算法。这些算法均属于“stop-the-world”GC模式,在收集期间仍然需要主程序的多次暂停。再者,年长空间收集带来的较长时间延迟对系统影响较为明显。在年长空间的收集方面,采用拷贝算法和火车算法会产生较大的对象移动开销,而单一的清扫算法则会引起内存碎片问题,往往需要结合压缩策略,而压缩又需要较大的系统开销。
理想的垃圾收集器应该在运行时尽量避免程序的停顿,或者将停顿限制在可以接受的范围之内,同时要求具有较低的资源占有率和较高的收集效率,并且尽量避免内存碎片。垃圾收集作为一个研究重点,目前还没有一种方式能够完美的解决垃圾问题。所以,垃圾收集算法的研究逐渐成为广大程序员关注的要点。
发明内容
本发明的目的是提供一种基于生命期预测的内存分配和垃圾收集方法,在保证内存利用率的同时,减少垃圾收集所引起的暂停次数和执行内存回收所消耗的时间。
为达到此目的,本发明的技术方案如下:预测由同一加载类所产生对象的生命长度,结合分代思想进行内存分配;在传统内存分代基础上,对年幼区进行进一步的划分,实现内存分配和内存回收的并行执行;年长区采用lazy-buddy模式分配,结合mark-sweep方法进行垃圾收集的策略。具体包括以下内容:
(1)对象生命长度预测及分配区域选择:
计算在两次垃圾收集执行期间,由同一类所产生的对象存活字节数总和以及这期间此类对象分配字节数总和的比率。通过综合多次比率的平均值来预测此类所产生的对象的生命长度。分配对象时将生命长的对象分配到年长区,生命短的对象分配到年幼区。
(2)年幼区内存划分及分配收集策略:
年幼区进一步划分为三个区域,三个区域依次用来进行内存分配。在其中两块内存空间不足时,继续在第三块区域进行内存分配,同时,在前两块区域中进行垃圾收集。
(3)年长区分配及收集策略:
年长区采用1azy-buddy模式进行内存分配,利用mark-sweep方法进行垃圾收集,内存回收完毕后,对相邻空闲内存按照一定的比例进行有效合并。
本发明优点如下:通过对分配对象的生命期长度进行预测,将生命期长的对象直接分配到年长区域,减少了从年幼区域到年长区域复制的数量,进而降低垃圾回收执行的时间。在年幼区域中,通过对年幼区域的进一步有效划分,实现一种对象分配和垃圾收集同时进行的非暂停模式,从而减少了程序运行过程中的暂停次数。年长区域采用lazy-buddy模式进行内存分配,保证内存分配速度,结合mark-sweep方法进行垃圾收集,既避免了大对象的复制操作,又控制了内存碎片的数量。
附图说明
图1为本发明内存分配流程图
图2为本发明内存区域划分图
图3为本发明年幼区工作原理图
图4为本发明年长区内存分配和内存回收流程图
具体实施方式
为实现发明目的,使技术方案和特点更加清楚明白,下面结合附图及具体实施例,对本发明作进一步说明:
附图1是本发明的内存分配流程图。
内存分配采用生命期预测机制决定分配区域。当程序为每一个对象申请内存时,首先判断对象所属的类是否为长寿类,长寿类判定标准如下:
对于一个类C,它在第i次垃圾收集过程中的生存比率,定义为类C的在此次垃圾收集过程中的对象存活率ri c。
其中,是指在第i-1次垃圾收集到第i次垃圾收集期间,系统所分配的C类对象字节数总和;是指上述所分配的对象在第i次垃圾收集过程中存活的字节数总和。
为广泛捕捉动态特征,计算C类对象在最近4次垃圾收集后的平均成活率rc:
定义一个阈值t以及变量pc来决定预测结果,判定方式如下:
若pc值为0,则类C为非长寿类,申请的对象分配在年幼区。若pc值为1,则类C为长寿类,申请的对象分配在年长区,若年长区空间不足,执行年长区垃圾收集,内存回收后继续在年长区分配。
当前对象分配完毕后,如需继续分配对象,返回继续申请;否则,结束申请。
图2是本发明内存区域划分图。
内存划分先按传统方式分为年幼区和年长区两部分,年长区存放生命期长的对象,年幼区存放生命期短的对象,年幼区在执行垃圾收集后,存活的对象提升到年长区。
年幼区进一步细分为三个等大小区域,三个区域全都用来进行内存分配,但每次只在其中两个区域执行垃圾收集。具体工作过程将结合图3详细讲解。
图3是本发明年幼区工作原理图。
年幼区内存分配时,遵从三个区域都用来分配内存,但只在其中两个区域执行垃圾收集的原则。具体实施步骤如下:初始时,首先在a区进行分配,a区内存不足时,跳到b区进行分配,b区内存不足时,继续在c区进行分配。在c区进行分配时,同时对a区和b区进行垃圾收集,存活对象提升到下一代。c区内存不足时,返回a区进行内存分配,此时,a区和b区内存经过垃圾收集后已经被回收。a区内存不足时,继续在b区进行分配,同时对a区和c区执行垃圾收集内存回收。b区内存不足时,继续在a区进行分配,依此类推,保证内存分配和垃圾收集可以同时进行。
图4是本发明年长区内存分配和内存回收流程图。
初次分配对象时,如图4(a)所示,比较对象大小X和年长区内存大小N的关系,若X>N,则直接分配内存,若X<N,则将年长区分为2个大小为N(1)=N/2的块,再次比较X和N/2大小关系,若X>N/2,则在其中一块上分配内存,若X<N,则再次将其中一块分为大小为N(2)=N(1)/2的块,依此类推,直至找到一块内存大小符合N(i+1)>X≥N(i)为止,并在相应的内存块上分配对象,其中N(i)=2-i N。相同大小的内存块由同一个链表维护,由同一块内存分裂成的相邻的内存块构成buddy关系。
当继续申请一个大小为Y的内存块时,查询符合N(i+1)>Y≥N(i)条件的内存块链表,若有空闲,直接分配内存并更新链表;若无空闲块,则分裂一个N(i-1)大小的空闲内存块,一半用来分配对象Y,另一半加入N(i)空闲列表。若N(i-1)大小内存块也无空闲,则继续往上搜寻N(i-2)大小空闲内存块,经两次分裂成N(i)大小内存块,依此类推,直至分配到合适内存为止。若满足以上条件的内存块均无空闲,则启动年长区垃圾回收机制。
年长区垃圾收集启动后,如图(b)所示,系统遍历对象根集,标记可达区域,回收不可达区域,释放内存,并更新相应链表。若某一大小链表数量超过预设值L,检测链表中构成buddy关系的内存,将其合并,更新链表。直至所有的链表数量控制在L范围内,垃圾收集执行完毕。
Claims (6)
1.本发明的目的在于提供一种基于生命期预测的内存分配和垃圾收集方法,其特征在于:
(1)一种对象生命期预测方式,进而选择对象分配区域;
(2)一种内存区域划分方式,年幼区内存分配和垃圾收集并行执行的原则;
(3)一种年长区lazy-buddy和mark-sweep结合的内存分配和垃圾收集的方式。
2.根据权利要求1所述一种基于生命期预测的内存分配和垃圾收集方法,其特征在于,(1)所述的对象生命期预测方式,预测步骤如下:
计算在第i和i-1次垃圾收集期间,由同一类C所产生的对象存活字节数总和以及在此期间类C所分配对象字节数总和的比率ri c:
计算近4次垃圾收集后的平均成活率rc:
比较rc与阈值t关系,若rc<t,则对应变量pc值为0,类C为非长寿类;若rc≥t,则对应pc值为1,类C为长寿类。
3.根据权利要求书1所述一种基于生命期预测的内存分配和垃圾收集方法,其特征在于,(1)所述的对象分配区域选择,根据其来源类的的P值所定,若P值为0,对象分配到年幼区,若P值为1,对象分配到年长区。
4.根据权利要求书1所述的一种基于生命期预测的内存分配和垃圾收集方法,其特征在于,(2)所述的一种内存区域划分方式为:整个堆内存首先划分为年长区和年幼区两个区域,年幼区再细分为三个等大小区域。
5.根据权利要求书1所述的一种内存分配和垃圾收集方法,其特征在于,(2)所述的年幼区内存分配和垃圾收集并行执行的原则如下:
对象依次在年幼区三个区域上进行内存分配,在其中两块内存空间不足时,继续在第三块区域进行内存分配,同时,在前两块区域中进行垃圾收集,保证内存分配和垃圾收集的同时执行。
6.根据权利要求书1所述的一种基于生命期预测的内存分配和垃圾收集方法,其特征在于,(3)所述的年长区内存分配和回收方式,其工作步骤如下:
(a)内存分配:按照lazy-buddy原则,对年长区进行内存分割,相同大小的内存块由同一个链表统一维护;
(b)垃圾收集:采用mark-sweep模式,遍历根集,标记有效区域,清除无效区域,回收内存;
(c)内存整理:若某一链表空闲数量太多,超出预设值L,则合并此链表内成buddy关系的内存块,将其空闲数量控制在L范围内。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410247496.2A CN104035879A (zh) | 2014-06-04 | 2014-06-04 | 一种基于生命期预测的内存分配和垃圾收集方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410247496.2A CN104035879A (zh) | 2014-06-04 | 2014-06-04 | 一种基于生命期预测的内存分配和垃圾收集方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN104035879A true CN104035879A (zh) | 2014-09-10 |
Family
ID=51466651
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201410247496.2A Pending CN104035879A (zh) | 2014-06-04 | 2014-06-04 | 一种基于生命期预测的内存分配和垃圾收集方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN104035879A (zh) |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108845864A (zh) * | 2018-06-27 | 2018-11-20 | 北京京东尚科信息技术有限公司 | 一种基于spring框架的JVM垃圾回收方法和装置 |
CN110325969A (zh) * | 2017-02-01 | 2019-10-11 | 微软技术许可有限责任公司 | 多阶段垃圾收集器 |
CN110764874A (zh) * | 2019-10-23 | 2020-02-07 | 北京字节跳动网络技术有限公司 | Dalvik垃圾回收抑制的方法及装置、终端和存储介质 |
WO2020037686A1 (zh) * | 2018-08-24 | 2020-02-27 | 袁振南 | 基于数据结构的垃圾回收方法、计算机及存储介质 |
CN116860658A (zh) * | 2023-06-21 | 2023-10-10 | 中国科学院软件研究所 | 一种面向大数据处理框架的高效半自动垃圾回收方法和系统 |
-
2014
- 2014-06-04 CN CN201410247496.2A patent/CN104035879A/zh active Pending
Non-Patent Citations (1)
Title |
---|
李守龙: "《分代算法在KVM中的实现》", 《计算机工程》 * |
Cited By (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110325969A (zh) * | 2017-02-01 | 2019-10-11 | 微软技术许可有限责任公司 | 多阶段垃圾收集器 |
CN110325969B (zh) * | 2017-02-01 | 2023-06-02 | 微软技术许可有限责任公司 | 多阶段垃圾收集器 |
CN108845864A (zh) * | 2018-06-27 | 2018-11-20 | 北京京东尚科信息技术有限公司 | 一种基于spring框架的JVM垃圾回收方法和装置 |
WO2020037686A1 (zh) * | 2018-08-24 | 2020-02-27 | 袁振南 | 基于数据结构的垃圾回收方法、计算机及存储介质 |
CN110764874A (zh) * | 2019-10-23 | 2020-02-07 | 北京字节跳动网络技术有限公司 | Dalvik垃圾回收抑制的方法及装置、终端和存储介质 |
CN110764874B (zh) * | 2019-10-23 | 2022-06-24 | 北京字节跳动网络技术有限公司 | Dalvik垃圾回收抑制的方法及装置、终端和存储介质 |
CN116860658A (zh) * | 2023-06-21 | 2023-10-10 | 中国科学院软件研究所 | 一种面向大数据处理框架的高效半自动垃圾回收方法和系统 |
CN116860658B (zh) * | 2023-06-21 | 2024-05-28 | 中国科学院软件研究所 | 一种面向大数据处理框架的高效半自动垃圾回收方法和系统 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US7165255B2 (en) | Method and apparatus for managing surplus memory in multitasking system | |
CN104035879A (zh) | 一种基于生命期预测的内存分配和垃圾收集方法 | |
JP4079684B2 (ja) | ヒープメモリ管理方法およびそれを用いた計算機システム | |
US7519639B2 (en) | Method and apparatus for dynamic incremental defragmentation of memory | |
CN108038002B (zh) | 一种嵌入式软件内存管理方法 | |
CN102722415B (zh) | 基于堆栈体系结构Java SoC系统的垃圾收集方法 | |
CN103514102B (zh) | 一种Java虚拟机实现内存垃圾回收的方法及装置 | |
JP4756231B2 (ja) | 掃除用のガーベッジコレクションの効果を高めるための方法、コンピュータ読み取り可能媒体、コンピュータシステム、及び、メモリ | |
WO2001088699A3 (en) | Method for using atomic compare-and-swap operations during forwarding-pointer installation | |
JP2005216298A (ja) | 適応型ガーベージコレクション方法及び前記方法を行う装置 | |
KR20010025112A (ko) | 메모리 재사용 방법 | |
CN111399986A (zh) | Pod资源配额配置方法及装置 | |
WO2018144286A1 (en) | Multiple stage garbage collector | |
JP2006172494A (ja) | プログラム制御装置、プログラム制御方法、およびプログラム記録媒体 | |
US7792879B2 (en) | Efficient heap utilization and partitioning | |
CN103455433A (zh) | 内存管理方法及系统 | |
CN107133182A (zh) | 一种内存管理方法及装置 | |
JP2006172495A (ja) | プログラム制御装置、プログラム制御方法、およびプログラム記録媒体 | |
Zhao et al. | Two generational garbage collection models with major collection time | |
JP3826626B2 (ja) | プログラム制御装置、プログラム制御方法、およびプログラム記録媒体 | |
CN106293939A (zh) | 一种在内存垃圾收集器中动态重用对象的方法 | |
US6842838B2 (en) | Preemptive memory-block splitting | |
CN100382047C (zh) | 把无用方法收集到垃圾箱中的方法和系统 | |
Tauro et al. | CMS and G 1 Collector in Java 7 Hotspot: Overview, Comparisons and Performance Metrics | |
Spoonhower et al. | Using page residency to balance tradeoffs in tracing garbage collection |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
WD01 | Invention patent application deemed withdrawn after publication |
Application publication date: 20140910 |
|
WD01 | Invention patent application deemed withdrawn after publication |