欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

用于內(nèi)存垃圾回收的方法及裝置與流程

文檔序號:11950045閱讀:242來源:國知局
用于內(nèi)存垃圾回收的方法及裝置與流程

本發(fā)明涉及計算機內(nèi)存管理技術(shù)領(lǐng)域,具體而言,涉及一種用于內(nèi)存垃圾回收的方法及裝置。



背景技術(shù):

腳本語言(Python,Lua等)憑借其諸多的優(yōu)點,已經(jīng)在程序開發(fā)領(lǐng)域得到了廣泛的使用。腳本語言一般都有垃圾回收機制,其通常采用“標記-清除(Mark-and-Sweep)”算法。該算法在進行內(nèi)存垃圾回收時可分成兩步來執(zhí)行:第1步,標記階段,遍歷所有的對象,如果是可達的(Reachable),也即仍有對象在引用它,則將其標記為可達;第2步,清除階段,再次遍歷對象,如果發(fā)現(xiàn)某個對象沒有被標記為可達,則將其回收。該過程稱為一次“全回收”過程。該過程在執(zhí)行完畢之前不會被任何其它任務或事件中斷,在此期間程序無法做其他的事,導致對程序的阻塞時間過長,從而大大影響了程序的性能。

雖然各腳本語言為了盡量減少垃圾回收時對程序的阻塞時間,都設計了獨特的算法,如Python語言采用的引用計數(shù)法,Lua語言采用的分步垃圾回收機制等,其主要思想是把一次長時間的垃圾計算分割成多個離散的小計算步驟。但首先,把垃圾回收算法分散到各個時間片上去,不可避免地會影響程序執(zhí)行的性能。其次,目前來說各腳本語言均沒有一種技術(shù)能完全避免使用“全回收”機制,因此一旦出現(xiàn)“全回收”則程序會連續(xù)阻塞較長一段時間,尤其是隨著程序中內(nèi)存對象的增多,每次“全回收”垃圾的耗時不斷增加,阻塞耗時不可控。

在所述背景技術(shù)部分公開的上述信息僅用于加強對本發(fā)明的背景的理解,因此它可以包括不構(gòu)成對本領(lǐng)域普通技術(shù)人員已知的現(xiàn)有技術(shù)的信息。



技術(shù)實現(xiàn)要素:

本發(fā)明提供一種用于內(nèi)存垃圾回收的方法及裝置,能夠避免進程出現(xiàn)長時間阻塞,提高程序的性能。

本發(fā)明的其他特性和優(yōu)點將通過下面的詳細描述變得顯然,或部分地通過本發(fā)明的實踐而習得。

根據(jù)本發(fā)明的一方面,提供了一種用于內(nèi)存垃圾回收的方法,包括:a)以一應用程序的進程為父進程,復制生成父進程的子進程;b)使子進程對應用程序中的內(nèi)存垃圾進行標記,以計算出應用程序中的內(nèi)存垃圾;以及c)使子進程將內(nèi)存垃圾的地址存入一共享內(nèi)存中。

根據(jù)本發(fā)明的一實施方式,上述方法還包括:d)當確定子進程已將內(nèi)存垃圾的地址存入共享內(nèi)存中時,從共享內(nèi)存中取出內(nèi)存垃圾的地址,并將其保存至本地存儲器中。

根據(jù)本發(fā)明的一實施方式,上述方法還包括:e)對內(nèi)存垃圾執(zhí)行垃圾回收操作。

根據(jù)本發(fā)明的一實施方式,在步驟e)之前還包括:啟動一第一定時器;以及在步驟d)之后或在步驟e)之前還包括:將當前狀態(tài)設置為第三狀態(tài);其中,步驟e)還包括:當?shù)谝欢〞r器超時之前未完成垃圾回收操作時,暫停垃圾回收操作,記錄并返回當前狀態(tài);以及當?shù)谝欢〞r器超時之前完成了垃圾回收操作時,將當前狀態(tài)設置為第一狀態(tài),記錄并返回當前狀態(tài)。

根據(jù)本發(fā)明的一實施方式,上述方法還包括:當返回的當前狀態(tài)為第三狀態(tài)時,啟動一第二定時器;以及當返回的當前狀態(tài)為第一狀態(tài)時,啟動一第三定時器;其中第三定時器的時長閾值大于第二定時器的時長閾值。

根據(jù)本發(fā)明的一實施方式,在步驟a)之后還包括:將當前狀態(tài)設置為第二狀態(tài),并記錄并返回當前狀態(tài);上述方法還包括:當返回的狀態(tài)為第二狀態(tài)時,啟動第二定時器。

根據(jù)本發(fā)明的一實施方式,上述方法還包括:當?shù)诙〞r器超時且當前狀態(tài)為第三狀態(tài)時,執(zhí)行步驟e);當?shù)诙〞r器超時且當前狀態(tài)為第二狀態(tài)時,執(zhí)行所述步驟d)。以及當?shù)谌〞r器超時,執(zhí)行步驟a)。

根據(jù)本發(fā)明的另一方面,提供了一種用于內(nèi)存垃圾回收的裝置,包括:進程復制模塊,用于以一應用程序的進程為父進程,復制生成父進程的子進程;垃圾標記模塊,用于使子進程對應用程序中的內(nèi)存垃圾進行標記,以計算出應用程序中的內(nèi)存垃圾;以及地址存儲模塊,用于使子進程將內(nèi)存垃圾的地址存入一共享內(nèi)存中。

根據(jù)本發(fā)明的一實施方式,上述裝置還包括:地址復制模塊,用于當確定子進程已將內(nèi)存垃圾的地址存入共享內(nèi)存中時,從共享內(nèi)存中取出內(nèi)存垃圾的地址,并將其保存至本地存儲器中。

根據(jù)本發(fā)明的一實施方式,上述裝置還包括:垃圾回收模塊,用于對內(nèi)存垃圾執(zhí)行垃圾回收操作。

根據(jù)本發(fā)明的一實施方式,上述裝置還包括:第一定時器模塊,用于當垃圾回收模塊對內(nèi)存垃圾執(zhí)行垃圾回收操作之前,啟動一第一定時器;以及狀態(tài)設置模塊,用于當?shù)刂窂椭颇K將內(nèi)存垃圾的地址保存至本地存儲器中之后,或者當垃圾回收模塊對內(nèi)存垃圾執(zhí)行垃圾回收操作之前,將當前狀態(tài)設置為第三狀態(tài);其中,垃圾回收模塊還用于當?shù)谝欢〞r器超時之前未完成垃圾回收操作時,暫停垃圾回收操作,記錄并返回當前狀態(tài);以及當?shù)谝欢〞r器超時之前完成了垃圾回收操作時,將當前狀態(tài)設置為第一狀態(tài),記錄并返回當前狀態(tài)。

根據(jù)本發(fā)明的一實施方式,上述裝置還包括:第二定時器模塊,用于當返回的當前狀態(tài)為第三狀態(tài)時,啟動一第二定時器;以及第三定時器模塊,用于當返回的當前狀態(tài)為第一狀態(tài)時,啟動一第三定時器;其中第三定時器的時長閾值大于第二定時器的時長閾值。

根據(jù)本發(fā)明的一實施方式,狀態(tài)設置模塊還用于當進程復制模塊復制生成父進程的子進程之后,將當前狀態(tài)設置為第二狀態(tài),并記錄并返回當前狀態(tài);以及第二定時器模塊還用于當返回的狀態(tài)為第二狀態(tài)時,啟動所述第二定時器。

根據(jù)本發(fā)明的內(nèi)存垃圾處理方法,使用進程復制技術(shù),將當前進程作為父進程復制出子進程,利用子進程對應用程序中的內(nèi)存垃圾進行標記,使得父進程可以在子進程進行垃圾標記期間正常運行不被阻塞,如此能夠減少垃圾回收操作在腳本語言中的耗時,徹底避免了可能出現(xiàn)的長時間阻塞,從而提高了程序的性能。

應當理解的是,以上的一般描述和后文的細節(jié)描述僅是示例性的,并不能限制本發(fā)明。

附圖說明

通過參照附圖詳細描述其示例實施例,本發(fā)明的上述和其它目標、特征及優(yōu)點將變得更加顯而易見。

圖1是根據(jù)一示例性實施方式示出的一種用于內(nèi)存垃圾回收的方法流程圖。

圖2是根據(jù)一示例性實施方式示出的另一種用于內(nèi)存垃圾回收的方法流程圖。

圖3是根據(jù)一示例性實施方式示出的再一種用于內(nèi)存垃圾回收的方法流程圖。

圖4是根據(jù)一示例性實施方式示出的再一種用于內(nèi)存垃圾回收的方法流程圖。

圖5是根據(jù)一示例性實施方式示出的一種用于內(nèi)存垃圾回收的裝置的框圖。

圖6是根據(jù)一示例性實施方式示出的另一種用于內(nèi)存垃圾回收的裝置的框圖。

圖7是根據(jù)一示例性實施方式示出的再一種用于內(nèi)存垃圾回收的裝置的框圖。

圖8是根據(jù)一示例性實施方式示出的再一種用于內(nèi)存垃圾回收的裝置的框圖。

具體實施方式

現(xiàn)在將參考附圖更全面地描述示例實施方式。然而,示例實施方式能夠以多種形式實施,且不應被理解為限于在此闡述的范例;相反,提供這些實施方式使得本發(fā)明將更加全面和完整,并將示例實施方式的構(gòu)思全面地傳達給本領(lǐng)域的技術(shù)人員。附圖僅為本發(fā)明的示意性圖解,并非一定是按比例繪制。圖中相同的附圖標記表示相同或類似的部分,因而將省略對它們的重復描述。

此外,所描述的特征、結(jié)構(gòu)或特性可以以任何合適的方式結(jié)合在一個或更多實施方式中。在下面的描述中,提供許多具體細節(jié)從而給出對本發(fā)明的實施方式的充分理解。然而,本領(lǐng)域技術(shù)人員將意識到,可以實踐本發(fā)明的技術(shù)方案而省略所述特定細節(jié)中的一個或更多,或者可以采用其它的方法、組元、裝置、步驟等。在其它情況下,不詳細示出或描述公知結(jié)構(gòu)、方法、裝置、實現(xiàn)或者操作以避免喧賓奪主而使得本發(fā)明的各方面變得模糊。

圖1是根據(jù)一示例性實施方式示出的一種用于內(nèi)存垃圾回收的方法流程圖。如圖1所示,用于內(nèi)存垃圾回收的方法10包括:

在步驟S101中,以一應用程序的進程為父進程,復制生成所述父進程的子進程。

例如,在Unix/Linux系統(tǒng)中,可以通過fork系統(tǒng)的調(diào)用來快速地為應用程序的當前進程復制出一子進程,而原進程則被稱為父進程。優(yōu)選地,使用寫時拷貝技術(shù),從而實現(xiàn)非??斓膹椭扑俣?。

在步驟S102中,使子進程對應用程序中的內(nèi)存垃圾進行標記,以計算出應用程序中的內(nèi)存垃圾。

由于從父進程復制出來的子進程具有與父進程完全一樣的數(shù)據(jù),而腳本語言中的“垃圾”有一個很重要的特性,就是沒有任何地方還在引用它了,因此一個對象成為垃圾之后,除了垃圾回收算法,任何其他的代碼都不可能改變它的狀態(tài),它將一直是垃圾,因此可以使用子進程來對應用程序中的內(nèi)存垃圾進行標記,如上述“背景技術(shù)”部分所提到的“標記”操作,以計算出應用程序中的所有內(nèi)存垃圾。

此外,復制出來的子進程與父進程是兩條完全獨立的進程,不會互相影響。因此,在子進程進行垃圾標記操作時,父進程不會被阻塞,還可以正常運行。

在步驟S103中,使子進程將內(nèi)存垃圾的地址存入一共享內(nèi)存中。

子進程在完成垃圾標記操作后,將計算得到的內(nèi)存垃圾地址記錄下來,存儲于一共享內(nèi)存中,以使父進程可以對標記處的內(nèi)存垃圾進行回收。

本發(fā)明實施方式的用于內(nèi)存垃圾回收的方法,使用進程復制技術(shù),將當前進程作為父進程復制出子進程,利用子進程對應用程序中的內(nèi)存垃圾進行標記,使得父進程可以在子進程進行垃圾標記期間正常運行不被阻塞,如此能夠減少垃圾回收操作在腳本語言中的耗時,徹底避免了可能出現(xiàn)的長時間阻塞,從而提高了程序的性能。

應清楚地理解,本發(fā)明描述了如何形成和使用特定示例,但本發(fā)明的原理不限于這些示例的任何細節(jié)。相反,基于本發(fā)明公開的內(nèi)容的教導,這些原理能夠應用于許多其它實施方式。

圖2是根據(jù)一示例性實施方式示出的另一種用于內(nèi)存垃圾回收的方法流程圖。如圖2所示,用于內(nèi)存垃圾回收的方法20包括:

在步驟S201中,以一應用程序的進程為父進程,復制生成所述父進程的子進程。

在步驟S202中,使子進程對應用程序中的內(nèi)存垃圾進行標記,以計算出應用程序中的內(nèi)存垃圾。

在步驟S203中,使子進程將內(nèi)存垃圾的地址存入一共享內(nèi)存中。

上述步驟與圖1所示的方法10中的步驟S101~S103相同,在此不再贅述。

在步驟S204中,當確定子進程已將所述內(nèi)存垃圾的地址存入所述共享內(nèi)存中時,從共享內(nèi)存中取出內(nèi)存垃圾的地址,并將其保存至本地存儲器中。

將存儲于共享內(nèi)存中的內(nèi)存垃圾的地址保存至本地存儲器,可以避免在后續(xù)垃圾清除回收過程中不斷訪問這個共享內(nèi)存,而導致該共享內(nèi)存的存在時間。此外,由于其他進程也可以訪問該共享內(nèi)存,如果由于其他進程造成了該共享內(nèi)存的損壞而導致垃圾地址的錯誤,將會引起嚴重的后果。

在步驟S205中,對上述內(nèi)存垃圾執(zhí)行垃圾回收操作。

在垃圾回收操作過程中,如果被標記出的內(nèi)存垃圾過多,則清除過程則會較長,從而也會導致較長時間的阻塞當前進程的執(zhí)行。因此,為了進一步的減小每次垃圾回收操作對進程阻塞的時間,在一些實施例中,還可以分多次執(zhí)行垃圾回收清除操作。例如,可以通過設置一最大阻塞時間來實現(xiàn)。開始垃圾清除操作后,開始計時,如果垃圾清除的時長超過了最大阻塞時間,則不管是否已經(jīng)將當前所有內(nèi)存垃圾清除完畢,均暫停當前垃圾清除操作,從而使當前進程繼續(xù)其正常操作。待等待一段時間后,再次進行垃圾清除操作,繼續(xù)清除之前已標記但未被清除的內(nèi)存垃圾,同樣清除的時間仍受到最大阻塞時間的限制。不斷重復上述分次垃圾清除操作,直到將所標記的所有內(nèi)存垃圾清除完,則表示完成本輪垃圾回收操作。步驟S204與S205例如可以由父進程(即當前進程)來執(zhí)行。

根據(jù)本發(fā)明實施方式的用于內(nèi)存垃圾回收的方法,在利用子進程執(zhí)行完垃圾標記操作后,進一步由父進程執(zhí)行垃圾回收操作。從而可以避免“全回收”操作對父進程的長時間阻塞,提高程序的性能。

圖3是根據(jù)一示例性實施方式示出的再一種用于內(nèi)存垃圾回收的方法流程圖。如圖3所示,用于內(nèi)存垃圾回收的方法30包括:

在步驟S301中,判斷當前狀態(tài),如果當前狀態(tài)為第一狀態(tài),則執(zhí)行步驟S302;如果當前狀態(tài)為第二狀態(tài),則執(zhí)行步驟S307;如果當前狀態(tài)為第三狀態(tài),則執(zhí)行步驟S311。

根據(jù)垃圾回收的進度,可以設有三種當前狀態(tài):

第一狀態(tài),例如可以命名為“未開始“狀態(tài),表示當前未開始新一輪的垃圾回收。從未開始過垃圾回收或者完成了一輪垃圾回收之后都會處于這個狀態(tài)。

第二狀態(tài),例如可以命名為“正在標記”狀態(tài),表示復制出的子進程正在計算可回收的垃圾對象。

第三狀態(tài),例如可以命名為“正在清除”狀態(tài),表示父進程(即應用程序的當前進程)正在根據(jù)子進程(即由該父進程復制出的進行)標記出的可回收垃圾進行清除操作。

在步驟S302中,以應用程序的進程為父進程,復制生成所述父進程的子進程。

如果當前狀態(tài)是第一狀態(tài)即“未開始”狀態(tài),則進行新一輪的內(nèi)存垃圾清除操作。例如,可以調(diào)用fork系統(tǒng)來創(chuàng)建一條子進程。fork系統(tǒng)調(diào)用使用寫入時復制技術(shù),能非??焖俚膹椭瞥鲆粭l一模一樣的進程。原進程稱為父進程,復制出來的進程稱為子進程。

在步驟S303中,將當前狀態(tài)設置為第二狀態(tài)并返回當前狀態(tài)。

子進程復制完畢后,例如可以由父進程把當前狀態(tài)設置為第二狀態(tài)即“正在標記”狀態(tài),并返回當前狀態(tài)。這一步驟不會阻塞應用程序,此后父進程可以正常運行,繼續(xù)進行其他運算。

在步驟S304中,使子進程對應用程序中的內(nèi)存垃圾進行標記。

通過子進程進行“標記-清除”運算中的標記操作,以計算出應用程序中的內(nèi)存垃圾。

在步驟S305中,使子進程將內(nèi)存垃圾的地址存入一共享內(nèi)存中。

子進程標記出所有內(nèi)存垃圾后,將內(nèi)存垃圾的地址存入共享內(nèi)存中。

在步驟S306中,退出該子進程。

在完成上述內(nèi)存垃圾標記操作后,子進程退出。

在步驟S307中,判斷子進程是否退出,如果沒有退出,則執(zhí)行步驟S308;否則,執(zhí)行步驟S309。

也即判斷子進程是否已計算出應用程序中的所有內(nèi)存垃圾,并將內(nèi)存垃圾的地址存入共享內(nèi)存中。

例如,可以調(diào)用waitpid函數(shù)判斷本輪垃圾清除過程中所復制出的子進程是否退出。waitpid函數(shù)可以通過參數(shù)設置為不阻塞,即不管子進程當前是否已經(jīng)退出,都立即返回結(jié)果。根據(jù)返回的結(jié)果可以判斷子進程是否已經(jīng)退出。

在步驟S308中,保持并返回當前狀態(tài)。

此時,當前狀態(tài)仍然保持為第二狀態(tài)即“正在標記”狀態(tài)。

在步驟S309中,從共享內(nèi)存中取出內(nèi)存垃圾地址,保存至本地存儲器中。

例如,由父進程在確認計算完畢之后,把垃圾對象的地址從共享內(nèi)存中取出并保存至本地存儲器中,供后續(xù)垃圾清除使用。

在步驟S310中,將當前狀態(tài)設置為第三狀態(tài)。

將當前狀態(tài)設置為第三狀態(tài)即“正在清除”狀態(tài)。

在步驟S311中,啟動一第一定時器。

為了防止一次清除所有內(nèi)存垃圾而導致的時間過長問題,可以設置一定時器,該定時器的時長閾值被設置為一最大阻塞時間,從而限制每次垃圾清除的時間。

在一些實施例中,也可以通過其他計時方式來實現(xiàn),如在該步驟中開始計時,當計時達到該最大阻塞時間時,停止當前垃圾清除操作,剩余垃圾則在下次操作中繼續(xù)進行。

在步驟S312中,執(zhí)行垃圾回收操作。

父進程根據(jù)保存下來的垃圾列表,循環(huán)清除父進程中的垃圾對象。為了防止一次清除全部垃圾可能造成的長時間阻塞,這里只清除一定數(shù)量的垃圾對象。

在步驟S313中,判斷第一定時器超時前是否完成了垃圾回收操作,如果完成了垃圾回收操作,則執(zhí)行步驟S314;否則,執(zhí)行步驟S315。

在步驟S314中,將當前狀態(tài)設置為第一狀態(tài),記錄并返回當前狀態(tài)。

在完成了所有垃圾回收后,將當前狀態(tài)設置為第一狀態(tài)即“未開始”狀態(tài),表示本輪垃圾回收操作完成。

在步驟S315中,暫停垃圾回收操作,并返回當前狀態(tài)。

暫停垃圾回收操作,保持當前的第三狀態(tài)即“正在清除”狀態(tài),并返回當前狀態(tài)。

圖4是根據(jù)一示例性實施方式示出的再一種用于內(nèi)存垃圾回收的方法流程圖。圖4所示的方法40用于根據(jù)圖3所示的方法30返回的當前狀態(tài)定期調(diào)用圖3所示的方法30,以進行內(nèi)存垃圾回收。例如,在實際應用中,如果圖3所示的方法30被實現(xiàn)為一內(nèi)存垃圾回收的函數(shù),則圖4所示的方法40用于定期調(diào)用該函數(shù),如設置定時器來實現(xiàn)定期調(diào)用該函數(shù),或者是另外啟動一條線程來調(diào)用該函數(shù)。具體地,如圖4所示,用于內(nèi)存垃圾回收的方法40包括:

在步驟S400中,執(zhí)行新一輪的垃圾回收操作。

在步驟S401中,執(zhí)行圖3所示的方法30中的內(nèi)存垃圾回收操作。

需要說明的是,在執(zhí)行圖3所示的方法30中的內(nèi)存垃圾回收操作的時候,系統(tǒng)會禁用原有的垃圾回收方法。

在步驟S402中,判斷返回的當前狀態(tài),如果返回的當前狀態(tài)為第二狀態(tài)即“正在標記”狀態(tài)或者為第三狀態(tài)即“正在清除”狀態(tài),則執(zhí)行步驟S403;如果返回的當前狀態(tài)為第一狀態(tài)即“未開始狀態(tài)”,則執(zhí)行步驟S404。

在步驟S403中,啟動第二定時器。

每次完整的垃圾回收動作,也即清除完所有標記的垃圾,被稱為一輪垃圾回收。而為了避免單次回收造成的長時間阻塞問題,可以把一輪垃圾回收操作又切分成多次操作。每次操作都允許設置一個最大阻塞時間,超過了這個時間,相應的垃圾回收操作就會暫停。

如果返回的當前狀態(tài)是第二狀態(tài)“正在標記”或第三狀態(tài)“正在清除”,則表明垃圾回收進程為內(nèi)存垃圾正在由子進程進行標記,或者由于最大阻塞時間的限制而未完成對所有內(nèi)存垃圾的回收,需要在經(jīng)過一個預設時長閾值之后,再進行下一次的回收操作。

該預設時長閾值的記錄可以由該第二定時器實現(xiàn),或者也可以由其他計時方式實現(xiàn),本發(fā)明不以此為限。

第二定時器的時長閾值可以由用戶根據(jù)當前系統(tǒng)負載情況進行設置。如希望盡量不影響系統(tǒng)性能,則例如可以每秒鐘只使用1毫秒來進行清除工作,也即分別將第二定時器和第一定時器的時長閾值設置為1秒和1毫秒。而如果希望能較快釋放所有垃圾,那就可以每100毫秒調(diào)用一次,每次清除垃圾10毫秒,也即分別將第二定時器和第一定時器的時長閾值設置為100毫秒和10毫秒。

在步驟S404中,啟動第三定時器。

如果返回結(jié)果是第一狀態(tài)時即“未開始”狀態(tài),則代表本輪垃圾回收已經(jīng)完成,準備開始新一輪的垃圾回收操作??梢愿鶕?jù)系統(tǒng)的負載,設置一時長閾值,當時長超出該時長閾值時,再次開始新一輪的垃圾回收操作。該時長閾值例如可以通過第三定時器記錄實現(xiàn),或者也可以由其他計時方式實現(xiàn),本發(fā)明不以此為限。

該第三定時器的時長閾值可以根據(jù)當前系統(tǒng)的負載情況而設定,并且其時長閾值大于第二定時器的時長閾值。

當?shù)谌〞r器超時,則進入步驟S400,執(zhí)行新一輪的垃圾回收操作。

本領(lǐng)域技術(shù)人員可以理解實現(xiàn)上述實施方式的全部或部分步驟被實現(xiàn)為由CPU執(zhí)行的計算機程序。在該計算機程序被CPU執(zhí)行時,執(zhí)行本發(fā)明提供的上述方法所限定的上述功能。所述的程序可以存儲于一種計算機可讀存儲介質(zhì)中,該存儲介質(zhì)可以是只讀存儲器,磁盤或光盤等。

此外,需要注意的是,上述附圖僅是根據(jù)本發(fā)明示例性實施方式的方法所包括的處理的示意性說明,而不是限制目的。易于理解,上述附圖所示的處理并不表明或限制這些處理的時間順序。另外,也易于理解,這些處理可以是例如在多個模塊中同步或異步執(zhí)行的。

下述為本發(fā)明裝置實施例,可以用于執(zhí)行本發(fā)明方法實施例。對于本發(fā)明裝置實施例中未披露的細節(jié),請參照本發(fā)明方法實施例。

圖5是根據(jù)一示例性實施方式示出的一種用于內(nèi)存垃圾回收的裝置的框圖。如圖5所示,用于內(nèi)存垃圾回收的裝置50包括:進程復制模塊501、垃圾標記模塊502及地址存儲模塊503。

其中,進程復制模塊501用于以一應用程序的進程為父進程,復制生成父進程的子進程。

復制完成后子進程與父進程就是兩條完全獨立的進程,不會互相影響。

垃圾標記模塊502用于使子進程對應用程序中的內(nèi)存垃圾進行標記,以計算出應用程序中的內(nèi)存垃圾。

此時父進程照常執(zhí)行,由復制出來的子進程進行垃圾的計算,子進程與父進程并行運行,子進程計算出所有可以回收的垃圾,并記錄內(nèi)存垃圾的地址。

地址存儲模塊503用于使子進程將內(nèi)存垃圾的地址存入共享內(nèi)存中。

本發(fā)明實施方式的用于內(nèi)存垃圾回收的裝置,使用進程復制技術(shù),將當前進程作為父進程復制出子進程,利用子進程對應用程序中的內(nèi)存垃圾進行標記,使得父進程可以在子進程進行垃圾標記期間正常運行不被阻塞,如此能夠減少垃圾回收操作在腳本語言中的耗時,徹底避免了可能出現(xiàn)的長時間阻塞,從而提高了程序的性能。

圖6是根據(jù)一示例性實施方式示出的另一種用于內(nèi)存垃圾回收的裝置的框圖。如圖6所示,用于內(nèi)存垃圾回收的裝置60還進一步包括:地址復制模塊604及垃圾回收模塊605。

其中地址復制模塊604用于當確定子進程已將內(nèi)存垃圾的地址存入共享內(nèi)存中時,從共享內(nèi)存中取出內(nèi)存垃圾的地址,并將其保存至本地存儲器中。

垃圾回收模塊605用于對內(nèi)存垃圾執(zhí)行垃圾回收操作。

根據(jù)本發(fā)明實施方式的用于內(nèi)存垃圾回收的裝置,在利用子進程執(zhí)行完垃圾標記操作后,進一步由父進程執(zhí)行垃圾回收操作。從而可以避免“全回收”操作對父進程的長時間阻塞,提高程序的性能。

圖7是根據(jù)一示例性實施方式示出的再一種用于內(nèi)存垃圾回收的裝置的框圖。如圖7所示,相比于圖6所示的裝置60,用于內(nèi)存垃圾回收的裝置70還進一步包括:第一定時器模塊706及狀態(tài)設置模塊707。

第一定時器模塊706用于當垃圾回收模塊605對內(nèi)存垃圾執(zhí)行垃圾回收操作之前,啟動第一定時器。

狀態(tài)設置模塊707用于當?shù)刂窂椭颇K604將內(nèi)存垃圾的地址保存至本地存儲器中之后,或者當垃圾回收模塊605對內(nèi)存垃圾執(zhí)行垃圾回收操作之前,將當前狀態(tài)設置為第三狀態(tài)。

在一些實施例中,垃圾回收模塊605還用于當?shù)谝欢〞r器超時之前未完成垃圾回收操作時,暫停垃圾回收操作,記錄并返回當前狀態(tài);以及當?shù)谝欢〞r器超時之前完成了垃圾回收操作時,將當前狀態(tài)設置為第一狀態(tài),記錄并返回當前狀態(tài)。

圖8是根據(jù)一示例性實施方式示出的再一種用于內(nèi)存垃圾回收的裝置的框圖。如圖8所示,相比于圖7所示的裝置70,用于內(nèi)存垃圾回收的裝置80還進一步包括:第二定時器模塊808及第三定時器模塊809。

其中第二定時器模塊808用于當返回的當前狀態(tài)為第三狀態(tài)時,啟動一第二定時器。

第三定時器模塊809用于當返回的當前狀態(tài)為第一狀態(tài)時,啟動一第三定時器。

狀態(tài)設置模塊707還用于當進程復制模塊501復制生成父進程的子進程之后,將當前狀態(tài)設置為第二狀態(tài),并記錄并返回所述當前狀態(tài)。

第二定時器模塊808還用于當返回的狀態(tài)為第二狀態(tài)時,啟動第二定時器。

需要注意的是,上述附圖中所示的框圖是功能實體,不一定必須與物理或邏輯上獨立的實體相對應。可以采用軟件形式來實現(xiàn)這些功能實體,或在一個或多個硬件模塊或集成電路中實現(xiàn)這些功能實體,或在不同網(wǎng)絡和/或處理器裝置和/或微控制器裝置中實現(xiàn)這些功能實體。

通過以上的實施方式的描述,本領(lǐng)域的技術(shù)人員易于理解,這里描述的示例實施方式可以通過軟件實現(xiàn),也可以通過軟件結(jié)合必要的硬件的方式來實現(xiàn)。因此,根據(jù)本發(fā)明實施方式的技術(shù)方案可以以軟件產(chǎn)品的形式體現(xiàn)出來,該軟件產(chǎn)品可以存儲在一個非易失性存儲介質(zhì)(可以是CD-ROM,U盤,移動硬盤等)中或網(wǎng)絡上,包括若干指令以使得一臺計算設備(可以是個人計算機、服務器、移動終端、或者網(wǎng)絡設備等)執(zhí)行根據(jù)本發(fā)明實施方式的方法。

以上具體地示出和描述了本發(fā)明的示例性實施方式。應可理解的是,本發(fā)明不限于這里描述的詳細結(jié)構(gòu)、設置方式或?qū)崿F(xiàn)方法;相反,本發(fā)明意圖涵蓋包含在所附權(quán)利要求的精神和范圍內(nèi)的各種修改和等效設置。

當前第1頁1 2 3 
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1
包头市| 区。| 沁水县| 白玉县| 广平县| 吉首市| 余庆县| 临湘市| 修武县| 武隆县| 牙克石市| 山丹县| 通化县| 商丘市| 汝城县| 汪清县| 巴楚县| 凤阳县| 册亨县| 清河县| 抚州市| 永城市| 库尔勒市| 普洱| 邵东县| 聂拉木县| 西城区| 和静县| 平塘县| 德安县| 德州市| 定西市| 汉源县| 奉贤区| 温宿县| 隆昌县| 麦盖提县| 丹江口市| 中山市| 四平市| 镇安县|