一種基于生命期預(yù)測(cè)的內(nèi)存分配和垃圾收集方法
【專利摘要】一種基于生命期預(yù)測(cè)的內(nèi)存分配和垃圾收集方法,通過(guò)對(duì)分配對(duì)象的生命期長(zhǎng)度進(jìn)行預(yù)測(cè),將生命期長(zhǎng)的對(duì)象直接分配到年長(zhǎng)區(qū)域,減少了從年幼區(qū)域到年長(zhǎng)區(qū)域復(fù)制的數(shù)量,進(jìn)而降低垃圾回收?qǐng)?zhí)行的時(shí)間。在年幼區(qū)域中,通過(guò)對(duì)年幼區(qū)域的進(jìn)一步有效劃分,實(shí)現(xiàn)一種對(duì)象分配和垃圾收集同時(shí)進(jìn)行的非暫停模式,從而減少了程序運(yùn)行過(guò)程中的暫停次數(shù)。年長(zhǎng)區(qū)域采用lazy-buddy模式進(jìn)行內(nèi)存分配,保證內(nèi)存分配速度,結(jié)合mark-sweep方法進(jìn)行垃圾收集,既避免了大對(duì)象的復(fù)制操作,又控制了內(nèi)存碎片的數(shù)量。
【專利說(shuō)明】一種基于生命期預(yù)測(cè)的內(nèi)存分配和垃圾收集方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及一種內(nèi)存自動(dòng)管理方法,具體是指一種基于生命期預(yù)測(cè)的內(nèi)存分配和垃圾收集方法。該方法可用于內(nèi)存資源有限的開(kāi)發(fā)環(huán)境,例如嵌入式虛擬機(jī)平臺(tái)和語(yǔ)言編譯環(huán)境。
【背景技術(shù)】
[0002]現(xiàn)代編程語(yǔ)言當(dāng)中,例如java和C#,若程序?yàn)槟硞€(gè)對(duì)象分配了內(nèi)存,當(dāng)一個(gè)對(duì)象不再被其它對(duì)象引用的時(shí)候,這個(gè)對(duì)象就成為“垃圾”對(duì)象,“垃圾”對(duì)象所占用的內(nèi)存如果得不到及時(shí)釋放,系統(tǒng)內(nèi)存就會(huì)被逐步蠶食殆盡,從而導(dǎo)致應(yīng)用系統(tǒng)崩潰。
[0003]為解決以上問(wèn)題,系統(tǒng)需要提供垃圾收集機(jī)制。垃圾收集的精確定義是動(dòng)態(tài)分配內(nèi)存的自動(dòng)管理機(jī)制。垃圾收集器會(huì)自動(dòng)回收垃圾對(duì)象所占用的空間以便被后續(xù)的新對(duì)象使用。
[0004]目前,在成熟的虛擬機(jī)和運(yùn)行平臺(tái)上,例如SUN的Java虛擬機(jī)(JVM)和Microsoft公共語(yǔ)言運(yùn)行時(shí)(CLI)等,垃圾回收器(GC)是必不可少的組成部分,它們普遍采用分代式的垃圾收集算法。分代算法基于對(duì)象生命長(zhǎng)度差異的原理,將內(nèi)存分為不同年齡的子堆。由于多數(shù)對(duì)象存在的時(shí)間比較短,垃圾收集器先從最年輕的子堆中收集這些對(duì)象,在垃圾收集器運(yùn)行后存活下來(lái)的對(duì)象會(huì)被移到下一代的子堆中。因?yàn)槔弦淮淖佣巡粫?huì)經(jīng)常被回收,所以節(jié)省了時(shí)間。但是,傳統(tǒng)的分代式GC的次級(jí)收集多采用標(biāo)記-清掃、清掃-壓縮或拷貝等基本算法。這些算法均屬于“stop-the-worlcTGC模式,在收集期間仍然需要主程序的多次暫停。再者,年長(zhǎng)空間收集帶來(lái)的較長(zhǎng)時(shí)間延遲對(duì)系統(tǒng)影響較為明顯。在年長(zhǎng)空間的收集方面,采用拷貝算法和火車(chē)算法會(huì)產(chǎn)生較大的對(duì)象移動(dòng)開(kāi)銷,而單一的清掃算法則會(huì)引起內(nèi)存碎片問(wèn)題,往往需要結(jié)合壓縮策略,而壓縮又需要較大的系統(tǒng)開(kāi)銷。
[0005]理想的垃圾收集器應(yīng)該在運(yùn)行時(shí)盡量避免程序的停頓,或者將停頓限制在可以接受的范圍之內(nèi),同時(shí)要求具有較低的資源占有率和較高的收集效率,并且盡量避免內(nèi)存碎片。垃圾收集作為一個(gè)研究重點(diǎn),目前還沒(méi)有一種方式能夠完美的解決垃圾問(wèn)題。所以,垃圾收集算法的研究逐漸成為廣大程序員關(guān)注的要點(diǎn)。
【發(fā)明內(nèi)容】
[0006]本發(fā)明的目的是提供一種基于生命期預(yù)測(cè)的內(nèi)存分配和垃圾收集方法,在保證內(nèi)存利用率的同時(shí),減少垃圾收集所引起的暫停次數(shù)和執(zhí)行內(nèi)存回收所消耗的時(shí)間。
[0007]為達(dá)到此目的,本發(fā)明的技術(shù)方案如下:預(yù)測(cè)由同一加載類所產(chǎn)生對(duì)象的生命長(zhǎng)度,結(jié)合分代思想進(jìn)行內(nèi)存分配;在傳統(tǒng)內(nèi)存分代基礎(chǔ)上,對(duì)年幼區(qū)進(jìn)行進(jìn)一步的劃分,實(shí)現(xiàn)內(nèi)存分配和內(nèi)存回收的并行執(zhí)行;年長(zhǎng)區(qū)采用lazy-buddy模式分配,結(jié)合mark-sweep方法進(jìn)行垃圾收集的策略。具體包括以下內(nèi)容:
[0008](I)對(duì)象生命長(zhǎng)度預(yù)測(cè)及分配區(qū)域選擇:
[0009]計(jì)算在兩次垃圾收集執(zhí)行期間,由同一類所產(chǎn)生的對(duì)象存活字節(jié)數(shù)總和以及這期間此類對(duì)象分配字節(jié)數(shù)總和的比率。通過(guò)綜合多次比率的平均值來(lái)預(yù)測(cè)此類所產(chǎn)生的對(duì)象的生命長(zhǎng)度。分配對(duì)象時(shí)將生命長(zhǎng)的對(duì)象分配到年長(zhǎng)區(qū),生命短的對(duì)象分配到年幼區(qū)。
[0010](2)年幼區(qū)內(nèi)存劃分及分配收集策略:
[0011]年幼區(qū)進(jìn)一步劃分為三個(gè)區(qū)域,三個(gè)區(qū)域依次用來(lái)進(jìn)行內(nèi)存分配。在其中兩塊內(nèi)存空間不足時(shí),繼續(xù)在第三塊區(qū)域進(jìn)行內(nèi)存分配,同時(shí),在前兩塊區(qū)域中進(jìn)行垃圾收集。
[0012](3)年長(zhǎng)區(qū)分配及收集策略:
[0013]年長(zhǎng)區(qū)采用lazy-buddy模式進(jìn)行內(nèi)存分配,利用mark-sweep方法進(jìn)行垃圾收集,內(nèi)存回收完畢后,對(duì)相鄰空閑內(nèi)存按照一定的比例進(jìn)行有效合并。
[0014]本發(fā)明優(yōu)點(diǎn)如下:通過(guò)對(duì)分配對(duì)象的生命期長(zhǎng)度進(jìn)行預(yù)測(cè),將生命期長(zhǎng)的對(duì)象直接分配到年長(zhǎng)區(qū)域,減少了從年幼區(qū)域到年長(zhǎng)區(qū)域復(fù)制的數(shù)量,進(jìn)而降低垃圾回收?qǐng)?zhí)行的時(shí)間。在年幼區(qū)域中,通過(guò)對(duì)年幼區(qū)域的進(jìn)一步有效劃分,實(shí)現(xiàn)一種對(duì)象分配和垃圾收集同時(shí)進(jìn)行的非暫停模式,從而減 少了程序運(yùn)行過(guò)程中的暫停次數(shù)。年長(zhǎng)區(qū)域采用lazy-buddy模式進(jìn)行內(nèi)存分配,保證內(nèi)存分配速度,結(jié)合mark-sweep方法進(jìn)行垃圾收集,既避免了大對(duì)象的復(fù)制操作,又控制了內(nèi)存碎片的數(shù)量。
【專利附圖】
【附圖說(shuō)明】
[0015]圖1為本發(fā)明內(nèi)存分配流程圖
[0016]圖2為本發(fā)明內(nèi)存區(qū)域劃分圖
[0017]圖3為本發(fā)明年幼區(qū)工作原理圖
[0018]圖4為本發(fā)明年長(zhǎng)區(qū)內(nèi)存分配和內(nèi)存回收流程圖
【具體實(shí)施方式】
[0019]為實(shí)現(xiàn)發(fā)明目的,使技術(shù)方案和特點(diǎn)更加清楚明白,下面結(jié)合附圖及具體實(shí)施例,對(duì)本發(fā)明作進(jìn)一步說(shuō)明:
[0020]附圖1是本發(fā)明的內(nèi)存分配流程圖。
[0021]內(nèi)存分配采用生命期預(yù)測(cè)機(jī)制決定分配區(qū)域。當(dāng)程序?yàn)槊恳粋€(gè)對(duì)象申請(qǐng)內(nèi)存時(shí),首先判斷對(duì)象所屬的類是否為長(zhǎng)壽類,長(zhǎng)壽類判定標(biāo)準(zhǔn)如下:
[0022]對(duì)于一個(gè)類C,它在第i次垃圾收集過(guò)程中的生存比率,定義為類C的在此次垃圾收集過(guò)程中的對(duì)象存活率rj。
【權(quán)利要求】
1.本發(fā)明的目的在于提供一種基于生命期預(yù)測(cè)的內(nèi)存分配和垃圾收集方法,其特征在于: (1)一種對(duì)象生命期預(yù)測(cè)方式,進(jìn)而選擇對(duì)象分配區(qū)域; (2)—種內(nèi)存區(qū)域劃分方式,年幼區(qū)內(nèi)存分配和垃圾收集并行執(zhí)行的原則; (3)—種年長(zhǎng)區(qū)lazy-buddy和mark_sweep結(jié)合的內(nèi)存分配和垃圾收集的方式。
2.根據(jù)權(quán)利要求1所述一種基于生命期預(yù)測(cè)的內(nèi)存分配和垃圾收集方法,其特征在于,(I)所述的對(duì)象生命期預(yù)測(cè)方式,預(yù)測(cè)步驟如下: 計(jì)算在第i和i_l次垃圾收集期間,由同一類C所產(chǎn)生的對(duì)象存活字節(jié)數(shù)總和Wf以及在此期間類C所分配對(duì)象字節(jié)數(shù)總和<的比率<:
3.根據(jù)權(quán)利要求書(shū)I所述一種基于生命期預(yù)測(cè)的內(nèi)存分配和垃圾收集方法,其特征在于,(I)所述的對(duì)象分配區(qū)域選擇,根據(jù)其來(lái)源類的的P值所定,若P值為O,對(duì)象分配到年幼區(qū),若P值為1,對(duì)象分配到年長(zhǎng)區(qū)。
4.根據(jù)權(quán)利要求書(shū)I所述的一種基于生命期預(yù)測(cè)的內(nèi)存分配和垃圾收集方法,其特征在于,(2)所述的一種內(nèi)存區(qū)域劃分方式為:整個(gè)堆內(nèi)存首先劃分為年長(zhǎng)區(qū)和年幼區(qū)兩個(gè)區(qū)域,年幼區(qū)再細(xì)分為三個(gè)等大小區(qū)域。
5.根據(jù)權(quán)利要求書(shū)I所述的一種內(nèi)存分配和垃圾收集方法,其特征在于,(2)所述的年幼區(qū)內(nèi)存分配和垃圾收集并行執(zhí)行的原則如下: 對(duì)象依次在年幼區(qū)三個(gè)區(qū)域上進(jìn)行內(nèi)存分配,在其中兩塊內(nèi)存空間不足時(shí),繼續(xù)在第三塊區(qū)域進(jìn)行內(nèi)存分配,同時(shí),在前兩塊區(qū)域中進(jìn)行垃圾收集,保證內(nèi)存分配和垃圾收集的同時(shí)執(zhí)行。
6.根據(jù)權(quán)利要求書(shū)I所述的一種基于生命期預(yù)測(cè)的內(nèi)存分配和垃圾收集方法,其特征在于,(3)所述的年長(zhǎng)區(qū)內(nèi)存分配和回收方式,其工作步驟如下: (a)內(nèi)存分配:按照l(shuí)azy-buddy原則,對(duì)年長(zhǎng)區(qū)進(jìn)行內(nèi)存分割,相同大小的內(nèi)存塊由同一個(gè)鏈表統(tǒng)一維護(hù); (b)垃圾收集:采用mark-sweep模式,遍歷根集,標(biāo)記有效區(qū)域,清除無(wú)效區(qū)域,回收內(nèi)存; (C)內(nèi)存整理:若某一鏈表空閑數(shù)量太多,超出預(yù)設(shè)值L,則合并此鏈表內(nèi)成buddy關(guān)系的內(nèi)存塊,將其空閑數(shù)量控制在L范圍內(nèi)。
【文檔編號(hào)】G06F12/02GK104035879SQ201410247496
【公開(kāi)日】2014年9月10日 申請(qǐng)日期:2014年6月4日 優(yōu)先權(quán)日:2014年6月4日
【發(fā)明者】白瑞林, 張濤 申請(qǐng)人:江南大學(xué)