專利名稱:一種使用非暫態(tài)流存儲來改進垃圾收集算法的方法
技術領域:
本發(fā)明一般地涉及運行時環(huán)境中的存儲器管理,具體而言涉及一種使用非暫態(tài)存儲來減少垃圾收集時間的垃圾收集算法。
背景技術:
計算系統(tǒng)的隨機存取存儲器(RAM)是一種大小固定的資源;現(xiàn)在RAM的大小一般為32兆字節(jié)(Mb)。為了保持系統(tǒng)性能,必須正確管理RAM。在例如Java或者Microsoft CLI的運行時環(huán)境中,存儲器管理是由系統(tǒng)來控制的。存儲器管理包括被稱為“垃圾收集”的處理。垃圾收集是以在循環(huán)再利用存儲器過程中盡量無干擾為目的的一種處理。當計算機程序運行時,它基于正在進行的情況分配和使用存儲器的各部分。在有些時候程序可能不再需要使用存儲器的一個特定部分,例如,存儲器曾被分配用于一個現(xiàn)在已經不再有關的特定目的。識別(收集)那些現(xiàn)在不會再被使用的部分(垃圾),使得它們能夠被回收以用于以后的分配。垃圾收集處理給中央處理單元(CPU)增加負擔并且降低系統(tǒng)的性能,對應用程序產生影響。因此人們非常希望能夠減少回收存儲器不被使用的部分所花的時間。
一般的計算系統(tǒng)在CPU和主存之間有高速緩沖存儲器。與一般為128Mb的主存相比,高速緩存比較小,一般為2Mb或者更小。高速緩存用于存儲來自最近被使用的存儲單元的數(shù)據(jù)和提供對這些數(shù)據(jù)的快速訪問。數(shù)據(jù)被放入高速緩存中,預期它會很快被再次訪問。垃圾收集發(fā)生在主存中,但是由于大多數(shù)程序在最近被訪問的數(shù)據(jù)會很快被再次訪問的假設之下運行,所以垃圾收集的處理發(fā)生在高速緩存內,如以下所描述的那樣。
在運行時環(huán)境中使用的一種通用垃圾收集算法是移動垃圾收集算法(MGCA,moving garbage collection algorithm)。MGCA檢查存儲塊,該存儲塊的大小一般可為1Mb到4十億字節(jié)(Gb)。MGCA確定來自該塊的存儲器數(shù)據(jù)哪些是在使用中的(活的數(shù)據(jù)),哪些是垃圾。正如其名稱所表示的,MGCA將所有活的數(shù)據(jù)都移到新的連續(xù)的存儲單元中。這將活的數(shù)據(jù)壓縮到了相對于其與垃圾放置在一處時的更小的空間中。一旦活的數(shù)據(jù)被拷貝到新的單元中,可以回收和重新分配整個塊。
一般的MGCA具有三個階段標記、重新指向(repoint)和拷貝。在標記階段,確定將被移到新的存儲單元的活的對象。數(shù)據(jù)對象的新存儲單元在這一階段確定。在重新指向階段,檢查活的對象并改變它們的引用使得它們指向新的存儲單元。在拷貝階段,各個活的對象的內容被拷貝到該新存儲單元中。
在很多程序中當數(shù)據(jù)被訪問時,例如被拷貝時,數(shù)據(jù)被放入高速緩沖存儲器中。如上所述,高速緩存提供對頻繁使用的存儲器的快速訪問,并假設最近被訪問的數(shù)據(jù)可能很快需要被再次訪問。如果數(shù)據(jù)沒有很快被使用,則將其從高速緩存中刪除。這種基于暫態(tài)訪問模式的處理常常造成被存儲到高速緩存中的數(shù)據(jù)只是當其沒有很快被訪問時被刪除。這種處理增加了高速緩沖存儲器的負擔,高速緩沖存儲器要確定哪些數(shù)據(jù)可以被從高速緩存上刪除,還必須實際地刪除它并且有可能要將改變后的數(shù)據(jù)反寫到主存中去。
當活的數(shù)據(jù)對象被拷貝到新存儲單元時,拷貝到新存儲單元的數(shù)據(jù)將來并不必須被訪問。所以,預期數(shù)據(jù)很快會被訪問的將數(shù)據(jù)拷貝到高速緩存不必要地增加了CPU/高速緩存資源的負擔。
本發(fā)明將以舉例方式來說明,但是并不限于附圖中的圖形,附圖中相同的標號表示相似的元件,在附圖中圖1是用于實現(xiàn)本發(fā)明的移動垃圾收集器的示例性的計算系統(tǒng)的圖解;以及圖2A和2B描述了為了減少垃圾收集所需的時間對CPU的非暫態(tài)流存儲特征的使用。
具體實施例方式
下面將描述一種改進的移動垃圾收集算法。該算法允許有效利用非暫態(tài)存儲來減少垃圾收集所需的時間。非暫態(tài)存儲(或拷貝)是一個CPU特征,其允許在主存內拷貝數(shù)據(jù)對象而沒有高速緩沖存儲器的干擾或污染。被拷貝到新存儲單元的活的對象在就近的將來不會被訪問,所以無需通過高速緩存來拷貝。如果被實現(xiàn),那么這避免了拷貝操作,也避免了增加硬件的負擔。本發(fā)明的算法利用了活的數(shù)據(jù)對象將被存儲到連續(xù)的新存儲單元中以執(zhí)行流拷貝過程這一事實。由于每個拷貝過程都有相關的CPU開銷,所以將拷貝流化的處理減少了系統(tǒng)性能的損失,并從而減少了垃圾收集的總的時間。
圖1是圖示了用于實現(xiàn)本發(fā)明的MGCA的示例性計算系統(tǒng)100的示圖。這里所描述的為了更有效的垃圾收集而對非暫態(tài)拷貝特征和流拷貝的使用可以在計算系統(tǒng)100內被實現(xiàn)和應用。系統(tǒng)100可表示通用計算機、便攜式計算機或者其它類似的設備。計算系統(tǒng)100的組成部分是示例性的,可以在其中省略或添加一個或多個組成部分。例如,計算系統(tǒng)100可能使用一個或多個存儲設備。
參照圖1,計算系統(tǒng)100包括經由總線101耦合到顯示電路105、主存104、靜態(tài)存儲器106和大容量存儲設備107的中央處理單元102和信號處理器103。計算系統(tǒng)100還可經由總線101耦合到顯示器121、鍵盤輸入122、光標控制器123、硬拷貝設備124、輸入/輸出(I/O)設備125以及聲頻/語音設備126。
總線101是標準系統(tǒng)總線,用于傳送信息和信號。CPU 102和信號處理器103是計算系統(tǒng)100的處理單元。CPU 102或信號處理器103或者兩者可被用于為計算系統(tǒng)100處理信息和/或信號。CPU 102包括控制單元131、算術邏輯單元(ALU)132和幾個寄存器133,它們被用于處理信息和信號。信號處理器103也可包括與CPU 102類似的組成部分。
主存104可以是,例如,隨機存取存儲器(RAM)或其它動態(tài)存儲設備,用于存儲被CPU 102或信號處理器103使用的信息或指令(程序代碼)。主存104可在CPU 102或信號處理器103執(zhí)行指令過程中存儲臨時變量或其它中間信息。靜態(tài)存儲器106可以是,例如,只讀存儲器(ROM)和/或其它靜態(tài)存儲設備,用于存儲也可以被CPU 102或信號處理器103使用的信息或指令。大容量存儲設備107可以是,例如,硬盤或軟盤驅動器或者光盤驅動器,用于存儲計算系統(tǒng)100的信息或指令。
顯示器121可以是,例如,陰極射線管(CRT)或液晶顯示器(LCD)。顯示設備121向用戶顯示信息或圖表。計算系統(tǒng)100可經由顯示電路105與顯示器121對接(interface)。鍵盤輸入122是具有模數(shù)轉換器的字母數(shù)字混編的輸入設備。光標控制器123可以是,例如,鼠標、軌跡球或光標方向鍵,用于控制顯示器121上目標的移動。硬拷貝設備124可以是,例如,激光打印機,用于在紙張、膠片或其它類似介質上打印信息。可耦合若干輸入/輸出設備125到計算系統(tǒng)100上。
根據(jù)本發(fā)明的垃圾收集的自動處理可以通過包含在計算系統(tǒng)100內的硬件和/或軟件實現(xiàn)。例如,CPU 102或信號處理器103能夠執(zhí)行存儲在例如主存104的機器可讀介質上的代碼或指令。
機器可讀介質可包括以例如計算機或數(shù)字處理設備的機器能夠讀的形式提供(即存儲和/或傳送)信息的機構。例如,機器可讀介質可以包括只讀存儲器(ROM)、隨機存取存儲器(RAM)、磁盤存儲介質、光存儲介質和閃存設備。代碼或指令可以由載波信號、紅外信號、數(shù)字信號以及其它類似信號來表示。
如上所述,一般的MGCA包括拷貝階段,其中活的對象被拷貝到新的存儲單元。本發(fā)明的一個實施例使用非暫態(tài)流存儲(NTSS)來完成垃圾收集的拷貝階段。對NTSS的使用使得能夠以較少的時間完成拷貝階段,從而實現(xiàn)更快的垃圾收集。圖2A描述了為了減少垃圾收集所需的時間而對CPU的非暫態(tài)存儲特征的使用。
圖2A中數(shù)據(jù)對象被示為A到O。例如,數(shù)據(jù)對象A、B、C和D是數(shù)據(jù)的根集(即,例如CPU寄存器內的引用)。然后,A、B、C、D以及所有可達到(相關)的數(shù)據(jù)對象被認為是活的并將被移動。箭頭是指示數(shù)據(jù)對象之間關聯(lián)的引用。所有傳遞閉包(transitive closure)活的對象都在MGCA的標記階段被確定。在一個實施例中,標記階段可以引起如205所示的標記堆棧的建立。如圖2A所示,數(shù)據(jù)對象G和I沒有包括在標記堆棧中,因為它們既不是根集的一部分,也不能從根集成員直接或傳遞地達到。
當每個數(shù)據(jù)對象都被確定為是活的時,分配新的存儲地址。在數(shù)據(jù)對象被添加到標記堆棧的時候,為數(shù)據(jù)對象確定新的存儲單元,因為認為該數(shù)據(jù)對象是經過垃圾收集而存留下來的。例如,如圖2B所示,為標記堆棧中所引用的每一個活的數(shù)據(jù)對象分配和指定新的存儲單元。標記堆棧如205B所示,對應新存儲單元的引用陣列如210B所示。這里,改變了每個數(shù)據(jù)對象的引用。這就是重新指向階段。例如,數(shù)據(jù)對象A引用了數(shù)據(jù)對象J和K。A的新的引用將是A’,而A’將引用J’和K’。
在拷貝階段,數(shù)據(jù)對象A的實際的內容(數(shù)據(jù)的實際的位)將被拷貝到被引用為A’的新的存儲單元。這包括了引用相關數(shù)據(jù)的數(shù)據(jù)對象A的部分。這部分可能已經被更新,也就是說對J和K的引用已經被改變成分別引用J’和K’。在另一個實施例中,數(shù)據(jù)對象A被拷貝到被引用為A’的新的存儲單元,然后更新與A關聯(lián)的數(shù)據(jù)對象(即J和K)。
在數(shù)據(jù)對象A被拷貝到A’之后,A’不必再次被訪問。關于數(shù)據(jù)對象A的垃圾收集的部分完成了。MGCA只是繼續(xù)到標記堆棧中引用的下一個數(shù)據(jù)對象,并繼續(xù)更新和移動。在MGCA的拷貝階段,被拷貝的數(shù)據(jù)對象(例如,數(shù)據(jù)對象A)被放入高速緩存。但是因為數(shù)據(jù)對象(即A’)在近的將來不會被訪問,所以A’的內容不需要被拷貝到高速緩存中。本發(fā)明的算法,這里作為附件A,使用非暫態(tài)存儲(NTS)來將數(shù)據(jù)對象直接拷貝到所指定的存儲器的新單元。CPU連同存儲控制器執(zhí)行非暫態(tài)存儲,在沒有高速緩沖存儲器的干擾或污染的情況下產生A到A’存儲單元的拷貝。對NTS的使用減少了垃圾收集所必需的時間,因為它減少了被不必要地拷貝到高速緩存中但只是在一段時間之后就被刪除的數(shù)據(jù)的量。
本發(fā)明的算法還使用了復合寫入技術(write combining)(流拷貝)來減少垃圾收集所需的時間。如圖2B所示,標記堆棧205B中所引用的數(shù)據(jù)對象將被拷貝到如標記堆棧210B所引用的新存儲單元中。例如,數(shù)據(jù)對象A、B和C將被拷貝到A’、B’和C’所引用的新單元。本發(fā)明的算法被設計為使得所有活的對象被拷貝到連續(xù)的新存儲單元,也就是說,例如A’、B’和C’是連續(xù)的單元。這使得能夠使用CPU的復合寫入(流拷貝)特征來異步透明地拷貝幾個數(shù)據(jù)對象。因為每個拷貝過程都有相關的CPU開銷,所以將拷貝流化的處理減少了系統(tǒng)性能的損失,從而減少了垃圾收集的時間。當然,能夠被拷貝的數(shù)量是因平臺而不同的,并且取決于占優(yōu)存儲器總線條件。
在上述說明中,通過參考其示例性的特定實施例對本發(fā)明做了描述。但是顯然在不背離如所附權利要求所陳述的本發(fā)明的更寬的精神和范圍的情況下可以對其做各種變形和改變。因此說明書和附圖被認為是解釋性的而不是限制性的。
權利要求
1.一種方法,包括訪問引用陣列,所述引用陣列引用至少一個數(shù)據(jù)對象,該至少一個數(shù)據(jù)對象具有存儲于存儲器中的內容;為所述至少一個數(shù)據(jù)對象的每一個的所述內容確定新的存儲單元;以及將所述至少一個數(shù)據(jù)對象的所述內容拷貝到所述新存儲單元,使得一旦拷貝了所述新存儲單元的所述內容,該數(shù)據(jù)就不會再被存儲到高速緩沖存儲器中。
2.如權利要求1所述的方法,其中被連續(xù)地引用的數(shù)據(jù)對象的所述內容被拷貝到連續(xù)的存儲單元。
3.如權利要求2所述的方法,其中拷貝還包括使用復合寫入操作繞過所述高速緩存拷貝所述至少一個數(shù)據(jù)對象的所述內容。
4.如權利要求3所述的方法,其在具有中央處理單元的計算系統(tǒng)上實現(xiàn),其中被拷貝的數(shù)據(jù)的量取決于中央處理單元的參數(shù)。
5.如權利要求4所述的方法,其中所述計算系統(tǒng)運行在動態(tài)運行時環(huán)境中。
6.如權利要求5所述的方法,其中所述運行時環(huán)境選自由JAVA和CLI組成的組。
7.如權利要求6所述的方法,其被實現(xiàn)為移動垃圾收集算法的拷貝階段。
8.一種機器可讀介質,所述介質提供可執(zhí)行指令,當由處理器執(zhí)行時,該可執(zhí)行指令使所述處理器執(zhí)行一種方法,該方法包括訪問引用陣列,所述引用陣列引用至少一個數(shù)據(jù)對象,所述至少一個數(shù)據(jù)對象具有存儲于存儲器中的內容;為所述至少一個數(shù)據(jù)對象的每一個的所述內容確定新的存儲單元;以及將所述至少一個數(shù)據(jù)對象的內容拷貝到新存儲單元,使得一旦拷貝,所述新存儲單元的所述內容不會被存儲到高速緩沖存儲器中。
9.如權利要求8所述的機器可讀介質,其中被連續(xù)引用的數(shù)據(jù)對象的所述內容被拷貝到連續(xù)的存儲單元。
10.如權利要求9所述的機器可讀介質,其中拷貝還包括通過采用非暫態(tài)流存儲操作的復合寫入特征繞過所述高速緩存拷貝所述至少一個數(shù)據(jù)對象的所述內容。
11.如權利要求10所述的機器可讀介質,其在具有中央處理單元的計算系統(tǒng)上實現(xiàn),其中被拷貝的數(shù)據(jù)的量取決于中央處理單元的參數(shù)。
12.如權利要求11所述的機器可讀介質,其中所述計算系統(tǒng)運行在動態(tài)運行時環(huán)境中。
13.如權利要求12所述的機器可讀介質,其中所述運行時環(huán)境選自由JAVA和CLI組成的組。
14.如權利要求13所述的機器可讀介質,其被實現(xiàn)為移動垃圾收集算法的拷貝階段。
15.一種設備,包括寄存器,用于保存引用陣列,所述引用陣列引用至少一個數(shù)據(jù)對象,所述至少一個數(shù)據(jù)對象具有內容;存儲區(qū)域,用于保存所述至少一個數(shù)據(jù)對象的所述內容;和中央處理單元,用于為所述至少一個數(shù)據(jù)對象的每一個的所述內容確定新存儲單元,所述至少一個數(shù)據(jù)對象的所述內容被拷貝到所述新存儲單元,使得一旦將所述內容拷貝到所述新存儲單元,該數(shù)據(jù)就不會被存儲到高速緩沖存儲器中。
16.如權利要求15所述的設備,其中所述被連續(xù)地引用的數(shù)據(jù)對象的所述內容繞過高速緩存被拷貝到連續(xù)的存儲單元。
17.如權利要求16所述的設備,其中拷貝還包括通過采用非暫態(tài)流存儲操作的復合寫入特征繞過所述高速緩存拷貝所述至少一個數(shù)據(jù)對象的所述內容。
18.如權利要求17所述的設備,其在具有中央處理單元的計算系統(tǒng)上實現(xiàn),其中被拷貝的數(shù)據(jù)的量取決于中央處理單元的參數(shù)。
19.如權利要求18所述的設備,其中所述計算系統(tǒng)運行在動態(tài)運行時環(huán)境中。
20.如權利要求19所述的設備,其中所述運行時環(huán)境選自由JAVA和CLI組成的組。
21.如權利要求20所述的設備,其被實現(xiàn)為移動垃圾收集算法的拷貝階段。
全文摘要
本發(fā)明描述了一種改進的移動垃圾收集算法。該算法允許有效地使用非暫態(tài)存儲來減少垃圾收集所需的時間。非暫態(tài)存儲(或拷貝)是一種CPU特征,該特征使得能夠在沒有高速緩沖存儲器干擾或污染的情況下在主存內拷貝數(shù)據(jù)對象。被拷貝到新存儲單元的活的對象在近的將來不會被再次訪問,因此無需被拷貝到高速緩存。這避免了拷貝操作,并且避免了給CPU增加高速緩存確定(cache determination)的負擔。在優(yōu)選實施例中,本發(fā)明的算法利用了活的數(shù)據(jù)對象會被存儲到連續(xù)的新存儲單元中以執(zhí)行流拷貝的這個事實。由于每個拷貝過程都有相關的CPU開銷,所以將拷貝流化的處理減少了系統(tǒng)性能的損失,并從而減少了用于垃圾收集的時間。
文檔編號G06F12/02GK1509435SQ02809793
公開日2004年6月30日 申請日期2002年6月6日 優(yōu)先權日2001年6月19日
發(fā)明者斯里尼瓦斯·蘇布拉馬尼, 斯里尼瓦斯 蘇布拉馬尼, L 赫德森, 理查德·L·赫德森 申請人:英特爾公司