專利名稱:存儲器管理的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及計算機(jī)系統(tǒng)中的存儲器管理。更具體地,本發(fā)明涉及作用域存儲器 (scoped memory)的垃圾收集(garbage collection)。
背景技術(shù):
常常設(shè)計運(yùn)行時環(huán)境中的存儲器管理以便為軟件工程師提供便利。由于這個原 因,例如Java (Java是Sim微系統(tǒng)公司的注冊商標(biāo))的運(yùn)行時環(huán)境包括具有垃圾收集器的 堆存儲器(heap memory) 0垃圾收集器是用于從存儲器自動地識別并丟棄未使用的數(shù)據(jù) (例如對象)以便釋放存儲裝置的運(yùn)行時工具。垃圾收集是由現(xiàn)代計算機(jī)系統(tǒng)的效率提供的“奢侈品”,用于把軟件工程師從通過 編程來丟棄每一個未使用的對象的任務(wù)中解放出來。然而它存在一些缺點(diǎn)。一個這樣的缺 點(diǎn)是垃圾收集處理通常要求暫停執(zhí)行用于訪問堆的軟件線程。這是因為當(dāng)軟件線程主動地 分配并訪問現(xiàn)有的或新的對象時,無法正常進(jìn)行用于識別并丟棄未使用的對象的處理。為 了使垃圾收集器有效地操作,在垃圾收集處理的持續(xù)期間,堆的狀態(tài)最好是靜態(tài)的且確定 的。用于垃圾收集的線程的暫停持續(xù)時間取決于在堆中所存在的數(shù)據(jù)對象的數(shù)目和種類, 并且可能在從短到察覺不到的持續(xù)時間到長到會被用戶察覺的時段的范圍內(nèi)變動。因而垃 圾收集處理可能導(dǎo)致具有不確定的頻率和持續(xù)時間的延遲。這些缺點(diǎn)使垃圾收集運(yùn)行時環(huán) 境固有地不適用于依賴于執(zhí)行的連續(xù)性和可預(yù)測性的軟件。這種軟件包括例如在監(jiān)視和控 制應(yīng)用中使用的那些關(guān)鍵性實時應(yīng)用,并且一般阻止這些應(yīng)用訪問垃圾收集存儲器以便確 保它們的連貫性和穩(wěn)定性。為了解決垃圾收集堆存儲器的這些缺點(diǎn),運(yùn)行時環(huán)境可以被適配來使用作用域存 儲器區(qū)域(sloped memory area)。作用域存儲器區(qū)域是適用于對象的分配和解除分配而沒 有垃圾收集堆的某些缺點(diǎn)的存儲區(qū)域。軟件線程可以進(jìn)入作用域存儲器區(qū)域,然后由該線 程在所述作用域存儲器區(qū)域內(nèi)進(jìn)行所有對象分配。所述線程還可以按照嵌套方式進(jìn)入多個 作用域存儲器區(qū)域。例如,所述線程可以進(jìn)入變?yōu)槟J(rèn)的分配區(qū)域的第二作用域存儲器區(qū) 域。在作用域圖表(scope graph)中組織作用域存儲器區(qū)域,每個作用域存儲器區(qū)域具有 一個父輩(parent),該父輩是先前進(jìn)入的作用域存儲器區(qū)域。第一作用域存儲器區(qū)域具有 原始的作用域存儲器區(qū)域作為其父輩。為每個作用域存儲器區(qū)域維護(hù)該區(qū)域中的多個活動線程的線程計數(shù)。與作用域圖 表耦合的線程計數(shù)表明作用域存儲器區(qū)域(包括在所述作用域存儲器區(qū)域中分配的任何 對象)何時是可丟棄的。例如,當(dāng)相關(guān)聯(lián)的線程計數(shù)從一減到零并且作用域存儲器區(qū)域不 是任何其它作用域存儲器區(qū)域的父輩時,該作用域存儲器區(qū)域可以是可丟棄的。依照這種 方式,作用域存儲器區(qū)域向?qū)ο筇峁┛晒┻x擇的分配空間(否則所述對象在垃圾收集運(yùn)行 時環(huán)境、例如Java中)。由于作用域存儲器區(qū)域中的所有對象在按照存儲器區(qū)域的線程使 用和作用域圖表的組織所定義的相同時間變得可被丟棄,所以使用這種作用域存儲器區(qū)域 可以解決在應(yīng)用執(zhí)行中由垃圾收集算法所導(dǎo)致的延遲和不確定性的問題。
第一作用域存儲器區(qū)域中的第一對象可以引用第二作用域存儲器區(qū)域中的第二 對象。然而,由于單獨(dú)的作用域存儲器區(qū)域可能變得可完全被丟棄,所以必須實施關(guān)于在不 同作用域存儲器區(qū)域中的對象之間的有效和無效引用的嚴(yán)格規(guī)則。這些規(guī)則必須保證父輩 作用域存儲器區(qū)域的壽命至少是其子輩作用域存儲器區(qū)域的壽命,使得后輩存儲區(qū)域中的 對象可以可靠地引用先輩存儲區(qū)域中的對象。依照這種方式,可以避免懸空引用(dangling reference) ο 這在"Efficient Memory-Reference Checks for Real-time Java,,(Corsaro 和Cytron, ACMSIGPLAN第38卷,2003年7月7日發(fā)行),,中有所描述?!獋€這樣的規(guī)則是作用域存儲器區(qū)域具有至多一個父輩。這被稱為“單父輩規(guī) 則”。單父輩規(guī)則規(guī)定不同線程進(jìn)入作用域存儲器區(qū)域的次序始終是相同的,這是因為線程 進(jìn)入作用域存儲器區(qū)域的次序定義了作用域圖表中的作用域存儲器區(qū)域的結(jié)構(gòu)。此外,在 源作用域存儲器區(qū)域中分配的源對象只能引用在相同或先輩作用域存儲器區(qū)域中的目標(biāo) 對象。先輩作用域存儲器區(qū)域是在源作用域存儲器區(qū)域之前線程進(jìn)入的存儲區(qū)域。源作用 域存儲器區(qū)域被認(rèn)為是具有相對于目標(biāo)對象來說更靠內(nèi)部的作用域。此準(zhǔn)則確保了源對象 總是在目標(biāo)對象之前被解除分配。依照J(rèn)ava的實時規(guī)范(Bo 11 e 1 Ia等人,Addison-ffesley, 2000年),試圖創(chuàng)建不滿足該準(zhǔn)則的引用一定會失敗。因而,每當(dāng)創(chuàng)建對目標(biāo)對象的新引用 時,必須以有效的方式檢查所述準(zhǔn)則。確定對于創(chuàng)建對象之間的引用來說是否滿足此準(zhǔn)則的一種方式是通過作用域圖 表中的作用域存儲器區(qū)域進(jìn)行迭代。迭代開始于源作用域存儲器區(qū)域,并且通過每個父輩 作用域存儲器區(qū)域前進(jìn),以檢查目標(biāo)作用域存儲器區(qū)域。如果在迭代期間在作用域圖表內(nèi) 遇到目標(biāo)作用域存儲器區(qū)域,那么因為目標(biāo)區(qū)域是源區(qū)域的先輩,所以可以斷定滿足所述 準(zhǔn)則。如果迭代到達(dá)原始的作用域存儲器區(qū)域(作用域圖表的“根”),那么因為目標(biāo)作用 域存儲器區(qū)域不是源作用域存儲器區(qū)域的先輩,所以可以斷定不滿足所述準(zhǔn)則。一種另選的方式是確定目標(biāo)對象的作用域存儲器區(qū)域和原始的作用域存儲器區(qū) 域之間的距離的索引(index)。此距離可以被認(rèn)為是目標(biāo)作用域存儲器區(qū)域的“深度”。另 夕卜,源對象的作用域存儲器區(qū)域和原始的作用域存儲器區(qū)域之間的距離的索引可以被確定 為源作用域的“深度”。這里術(shù)語深度用來表明作用域存儲器區(qū)域存在于與原始的作用域存 儲器區(qū)域有一定距離的層次。較深的作用域存儲器區(qū)域位于作用域圖表中距離原始的作用 域存儲器區(qū)域更遠(yuǎn)的層次上。比較這些深度的索引將確定目標(biāo)作用域存儲器區(qū)域是否是源 作用域存儲器區(qū)域的先輩,這是因為后輩區(qū)域?qū)⒖偸潜认容厖^(qū)域更深(與原始的作用域存 儲器區(qū)域相距更遠(yuǎn))。因而,如果源作用域存儲器區(qū)域比目標(biāo)作用域存儲器區(qū)域更深,那么 滿足所述準(zhǔn)則并且可以創(chuàng)建引用。圖1是現(xiàn)有技術(shù)中示例性的作用域存儲器系統(tǒng)100的框圖。該作用域存儲器系統(tǒng) 是計算機(jī)系統(tǒng)的存儲裝置的一部分的安排,例如在Java的實時規(guī)范中所描述的作用域存 儲器系統(tǒng)(Bollella等人,Addison-WesleyJOOO年)。在使用中,作用域存儲器系統(tǒng)100 包括作用域圖表102,所述作用域圖表102是零或更多個作用域存儲器區(qū)域(例如作用域存 儲器區(qū)域106)的數(shù)據(jù)結(jié)構(gòu)安排。作用域圖表102在本領(lǐng)域中通常被稱為“作用域棧(scope stack) ”,不過作用域圖表102的數(shù)據(jù)結(jié)構(gòu)不一定是棧數(shù)據(jù)結(jié)構(gòu)。作用域圖表102可以被實 現(xiàn)為有向圖表數(shù)據(jù)結(jié)構(gòu)、棧數(shù)據(jù)結(jié)構(gòu)、樹數(shù)據(jù)結(jié)構(gòu)、鏈接列表或適于存儲零或更多個作用域 存儲器區(qū)域的任何數(shù)據(jù)結(jié)構(gòu)。
作用域存儲器區(qū)域106是在存儲裝置中所定義的適于分配和引用軟件對象的存 儲區(qū)域??梢酝ㄟ^在作用域存儲器區(qū)域106的環(huán)境中執(zhí)行的軟件線程來在作用域存儲器區(qū) 域的分配對象112部分中分配并訪問對象。作用域存儲器區(qū)域106進(jìn)一步包括線程計數(shù) 110,作為在作用域存儲器區(qū)域106的環(huán)境中執(zhí)行的軟件線程數(shù)目的計數(shù)。線程通過顯式地 進(jìn)入作用域存儲器區(qū)域,例如通過調(diào)用應(yīng)用編程接口函數(shù),來在作用域存儲器區(qū)域106的 環(huán)境中執(zhí)行。一旦線程已經(jīng)進(jìn)入作用域存儲器區(qū)域106,就將在作用域存儲器區(qū)域106內(nèi)進(jìn) 行對象分配,除非所述線程在其它地方專門分配,例如在通用堆(general heap)或另一作 用域存儲器區(qū)域中。作用域存儲器區(qū)域106進(jìn)一步包括父輩字段108,后者包括對父輩作用域存儲器 區(qū)域的引用。如上所述,作用域存儲器區(qū)域具有至多一個父輩。通過其間的父子關(guān)系定義 的作用域存儲器區(qū)域的安排定義了作用域圖表102。沒有特定父輩的初始作用域存儲器區(qū) 域?qū)⒔柚嘉环?placeholder)引用原始的作用域存儲器區(qū)域104作為其父輩。依賴于執(zhí)行的連續(xù)性和可預(yù)測性的關(guān)鍵軟件可以使用作用域存儲器區(qū)域來分配 對象。由于不對作用域存儲器區(qū)域進(jìn)行垃圾收集,所以與垃圾收集處理相關(guān)聯(lián)的延遲和不 確定性不會影響作用域存儲器或使用作用域存儲器的軟件線程。雖然這為關(guān)鍵軟件線程提 供了確定性,但是它存在以下缺點(diǎn)在作用域存儲器中分配的各個對象不被丟棄,直到所述 作用域存儲器中的所有對象都是可丟棄的。因而作用域存儲器可能被許多未使用的對象消耗。因此提供具有作用域存儲器的確定性和連貫性的垃圾收集的優(yōu)點(diǎn)是有益的。
發(fā)明內(nèi)容
在第一方面,本發(fā)明提供了一種作用域存儲器系統(tǒng)中的存儲器管理方法,所述作 用域存儲器系統(tǒng)包括作用域存儲器區(qū)域,所述作用域存儲器區(qū)域用于在其中分配對象以便 由一個或多個執(zhí)行中的軟件線程訪問,所述作用域存儲器區(qū)域與用于表明所述作用域存儲 器區(qū)域可丟棄的線程計數(shù)相關(guān)聯(lián),所述方法包括步驟針對在所述作用域存儲器區(qū)域中分 配的對象識別一組根引用(root reference);遞歸地遍歷并標(biāo)記從該組根引用被引用并且 在所述作用域存儲器區(qū)域中分配的對象;以及識別在所述作用域存儲器區(qū)域中未被這樣標(biāo) 記的對象,并且丟棄所識別的對象。運(yùn)行時環(huán)境中的垃圾收集堆(garbage collected heap)可以由執(zhí)行中的所有軟 件線程使用。因此,所述堆的垃圾收集處理可能要求暫停所有使用所述堆的執(zhí)行線程。這 向所有這種線程施加了不確定的延遲。相比之下,向作用域存儲器區(qū)域應(yīng)用垃圾收集處理 能夠只影響那些訪問所述作用域存儲器區(qū)域的線程。由于此原因,任何這種不確定延遲的 范圍只限于那些訪問該作用域存儲器區(qū)域的線程。此外,由于這些訪問該作用域存儲器區(qū) 域的線程的數(shù)量一般很小(與應(yīng)用中的所有線程相比),所以任何這種延遲的長度也受到 限制。因而,被應(yīng)用于作用域存儲器區(qū)域的垃圾收集處理將借助于訪問作用域存儲器的有 限數(shù)量的線程來提供具有作用域存儲器的確定性的垃圾收集的優(yōu)點(diǎn)。優(yōu)選地是,識別一組根引用的步驟進(jìn)一步包括使所述一個或多個軟件線程進(jìn)入暫 停狀態(tài),在該暫停狀態(tài)中臨時停止軟件線程的執(zhí)行,并且其中識別所有對象的步驟進(jìn)一步 包括使所述一個或多個軟件線程離開所述暫停狀態(tài)。
優(yōu)選地是,所述方法進(jìn)一步包括借助以下步驟來壓縮(compact)作用域存儲器區(qū) 域的步驟a)把在作用域存儲器區(qū)域中分配的對象移動到所述作用域存儲器區(qū)域中的連 續(xù)的存儲單元;并且b)整理(fixup)對移動后的對象的引用以便引用所述作用域存儲器區(qū) 域中的所述連續(xù)的存儲單元。優(yōu)選地是,識別一組根引用的步驟包括識別具有作為根引用的對在作用域存儲器 區(qū)域中分配的對象的引用的軟件線程。在第二方面,本發(fā)明提供了一種用于作用域存儲器系統(tǒng)中的存儲器管理的設(shè)備, 所述作用域存儲器系統(tǒng)包括作用域存儲器區(qū)域,所述作用域存儲器區(qū)域用于在其中分配對 象以便由一個或多個執(zhí)行中的軟件線程訪問,所述作用域存儲器區(qū)域與用于表明所述作用 域存儲器區(qū)域可丟棄的線程計數(shù)相關(guān)聯(lián),所述設(shè)備包括用于針對在所述作用域存儲器區(qū) 域中分配的對象識別一組根引用的裝置;用于遞歸地遍歷并標(biāo)記從該組根引用被引用并且 在所述作用域存儲器區(qū)域中分配的對象的裝置;和用于識別所述作用域存儲器區(qū)域中未被 這樣標(biāo)記的對象并且丟棄所識別的對象的裝置。在第三方面,本發(fā)明提供了一種設(shè)備,包括中央處理單元;存儲器子系統(tǒng);輸入/ 輸出子系統(tǒng);和總線子系統(tǒng),用于互連所述中央處理單元、所述存儲器子系統(tǒng)、所述輸入/ 輸出子系統(tǒng);以及如上所述的設(shè)備。在第四方面,本發(fā)明提供了一種計算機(jī)程序單元,包括計算機(jī)程序代碼,用于當(dāng)被 加載到計算機(jī)系統(tǒng)中并且在其上執(zhí)行時使所述計算機(jī)執(zhí)行如上所述方法的步驟。
下面參考附圖僅以舉例形式更詳細(xì)地描述本發(fā)明的優(yōu)選實施例,其中圖1是現(xiàn)有技術(shù)中示例性的作用域存儲器系統(tǒng)的框圖;圖2是適于本發(fā)明實施例的操作的計算機(jī)系統(tǒng)的框圖;圖3是依照本發(fā)明的優(yōu)選實施例在軟件運(yùn)行時環(huán)境中執(zhí)行的軟件應(yīng)用的框圖;圖4是依照本發(fā)明優(yōu)選實施例的圖3的作用域存儲器垃圾收集器的方法的流程 圖;和圖5是依照本發(fā)明的優(yōu)選實施例由線程使用的作用域存儲器區(qū)域的框圖。
具體實施例方式圖2是適于本發(fā)明實施例的操作的計算機(jī)系統(tǒng)的框圖。中央處理單元(CPU) 202 經(jīng)由數(shù)據(jù)總線208可通信地連接到存儲裝置204和輸入/輸出(I/O)接口 206。存儲裝置 204可以是諸如隨機(jī)存取存儲器(RAM)或非易失性存儲設(shè)備的任何讀取/寫入存儲設(shè)備。 非易失性存儲設(shè)備的例子包括盤或磁帶存儲設(shè)備。I/O接口 206是用于輸入或輸出數(shù)據(jù)、或 者輸入和輸出數(shù)據(jù)的設(shè)備接口??蛇B接到I/O接口 206的I/O設(shè)備的例子包括鍵盤、鼠標(biāo)、 顯示器(例如監(jiān)視器)和網(wǎng)絡(luò)連接。圖3是依照本發(fā)明的優(yōu)選實施例在軟件運(yùn)行時環(huán)境中執(zhí)行的軟件應(yīng)用的框圖。軟 件應(yīng)用包括執(zhí)行線程302到308。每個線程是獨(dú)立的軟件執(zhí)行流并且包括軟件指令和線程 數(shù)據(jù),所述軟件指令和線程數(shù)據(jù)一般被存儲在被稱為存儲器棧的存儲區(qū)域中。線程302到 308包括進(jìn)入到分配的堆存儲器中的引用310到320,所述堆存儲器包括垃圾收集堆332和
7作用域存儲器區(qū)域330。垃圾收集堆332是用于在運(yùn)行時環(huán)境中執(zhí)行的線程的存儲器分配 空間。在垃圾收集堆332中分配軟件對象340、338。垃圾收集器可周期性地操作來處理垃 圾收集堆332以便丟棄未使用的對象,如在本領(lǐng)域中公知的那樣。作用域存儲器區(qū)域330 也是供執(zhí)行中的線程使用的存儲器分配空間,并且在所述作用域存儲器區(qū)域330中分配軟 件對象334、336。作用域存儲器區(qū)域330包括被配置為訪問作用域存儲器區(qū)域330的線程 的數(shù)目的線程計數(shù)350。線程計數(shù)對于確定作用域存儲器區(qū)域330何時可丟棄(例如當(dāng)線 程計數(shù)350表明沒有任何線程訪問所述作用域存儲器區(qū)域330時)是有用的。作用域存儲 器區(qū)域進(jìn)一步包括對父輩作用域存儲器區(qū)域(例如原始的作用域存儲器區(qū)域)的引用,如 在本領(lǐng)域中公知的那樣。引用310到320是在線程302到308內(nèi)的對象引用。例如,每個這種引用可以包 括存儲器地址、基址和偏移,或者指向軟件對象的指針。線程302包括對垃圾收集堆332中 的對象340的引用310。線程302進(jìn)一步包括對垃圾收集堆332中的對象338的引用312。 線程304包括對垃圾收集堆中的對象338的引用313和對作用域存儲器區(qū)域330中的對象 336的引用314。線程306包括分別對作用域存儲器區(qū)域中的對象336和334的引用316 和318。線程308包括對作用域存儲器區(qū)域中的對象334的引用320。因而,線程302只包 括對垃圾收集堆中的對象的引用。線程306和308只包括對作用域存儲器區(qū)域330中的對 象的引用。線程304包括對垃圾收集堆332和作用域存儲器區(qū)域330中的對象的引用。在 執(zhí)行中,具有對在垃圾收集堆332中分配的對象的引用的線程302和304將受到該堆332 中的垃圾收集器的周期性處理的影響。另一方面,由于線程306和308沒有對垃圾收集堆 332中的對象的引用,所以它們不受該堆332中的垃圾收集器的影響。相比之下,線程306 和308使用作用域存儲器區(qū)域330,所述作用域存儲器區(qū)域330可根據(jù)線程計數(shù)350而被丟 棄。依照本發(fā)明的優(yōu)選實施例,垃圾收集的技術(shù)通過作用域存儲器垃圾收集器360被 進(jìn)一步應(yīng)用于作用域存儲器區(qū)域330。作用域存儲器垃圾收集器360是運(yùn)行時環(huán)境的軟件 或硬件組件,其可操作來識別和丟棄作用域存儲器區(qū)域330中的未使用的對象。依照這種 方式,向作用域存儲器區(qū)域330提供了垃圾收集的優(yōu)點(diǎn),并且被限制為只使用作用域存儲 器的線程(例如關(guān)鍵性實時線程)能夠得益于垃圾收集。圖4是依照本發(fā)明優(yōu)選實施例的圖3的作用域存儲器垃圾收集器360的方法的流 程圖。在步驟402,所述方法針對在作用域存儲器區(qū)域330中分配的對象識別一組根引用。 根引用是直接或間接地引向在作用域存儲器區(qū)域330中分配的對象的引用。這種引用通 常位于引用鏈的根部,例如存儲在處理器寄存器中,位于軟件程序棧(包括局部變量和臨 時量)和全局變量上。識別一組根引用在垃圾收集方法中是固有的并且在本領(lǐng)域中是公知 的。例如,這種識別將包括識別具有對在作用域存儲器區(qū)域330中分配的對象的直接或間 接引用的所有軟件線程。因而,用于作用域存儲器區(qū)域330的一組適當(dāng)?shù)母每梢园?已經(jīng)進(jìn)入作用域存儲器區(qū)域330的線程中的所有引用。在步驟404,遞歸地遍歷該組根引用中的每個引用以便識別在作用域存儲器區(qū)域 330中分配的對象。引用的遞歸遍歷涉及依照例如在完全遍歷鏈接列表或樹數(shù)據(jù)結(jié)構(gòu)時所 采用的遞歸方式訪問在被引用位置上存儲的所有引用。遍歷的目的是識別從根引用被引用 的在作用域存儲器區(qū)域330中分配的所有對象。當(dāng)這樣一個對象被識別時,該對象被標(biāo)記。
8可以借助任何適當(dāng)?shù)姆绞?,例如通過在對象本身內(nèi)設(shè)置標(biāo)志或者通過在例如表的獨(dú)立數(shù)據(jù) 結(jié)構(gòu)中產(chǎn)生或修正對應(yīng)于對象的條目來標(biāo)記對象。依照這種方式,標(biāo)記由執(zhí)行中的軟件應(yīng) 用(例如經(jīng)由線程302到308)引用的作用域存儲器區(qū)域330中的所有對象。在步驟406,所述方法識別作用域存儲器區(qū)域330中的未被標(biāo)記的對象。在步驟 406識別的對象是未使用的對象_即,在軟件應(yīng)用中不存在識別出的引用的對象。丟棄在步 驟406識別的對象。丟棄對象尤其可以包括把對象標(biāo)記為可丟棄,把對象消耗的存儲器標(biāo) 記為空閑存儲器,或者從存儲器主動地刪除對象等等。圖5是依照本發(fā)明的優(yōu)選實施例由線程502使用的作用域存儲器區(qū)域503的框 圖。線程502進(jìn)入用于分配對象B和A的作用域存儲器區(qū)域503。其它對象C、D、E和F也 在作用域存儲器區(qū)域503中被分配并且分別被引用和未被引用。現(xiàn)在圖4的方法將被應(yīng)用 于圖5的方案以便圖示本發(fā)明的優(yōu)選實施例的方法。最初,在步驟402,識別用于在作用域 存儲器區(qū)域503中分配的所有對象的一組根引用。該組只包括線程502中的引用,因為線 程502是具有對作用域存儲器區(qū)域503中的對象的引用的唯一線程。因而,該組根引用包 括引用510和504。在步驟404,所述方法遍歷每個根引用510和504并且標(biāo)記作用域存儲 器區(qū)域503中的對象。因而,遍歷根引用510,對象B被標(biāo)記,因為該對象B在作用域存儲 器區(qū)域503中被分配。對象B的標(biāo)記由勾號來表明。遍歷根引用504,對象A被標(biāo)記,因為 該對象A在作用域存儲器區(qū)域503中被分配。對根引用504的遍歷遞歸到對對象E的引用 506,所述對象E也在作用域存儲器區(qū)域503中因此也被標(biāo)記。此外,遍歷對對象D的引用 508,所述對象D也在作用域存儲器區(qū)域503中因此也被標(biāo)記。因而,在完成步驟404時,由 于從根引用510和504直接或間接地引用對象B、A、E和D,所以在作用域存儲器區(qū)域503 中標(biāo)記這些對象。最后在步驟406,所述方法識別在作用域存儲器區(qū)域503中被分配的、未 被標(biāo)記的對象。因此識別對象C和F,并且丟棄這些對象。依照這種方式,垃圾收集處理可 以被應(yīng)用于作用域存儲器區(qū)域503。為了進(jìn)行上述圖4的步驟,可能必須防止改變對作用域存儲器內(nèi)對象的引用,以 及防止改變作用域存儲器內(nèi)的對象,以便作用域存儲器垃圾收集器360可以在靜態(tài)下對作 用域存儲器區(qū)域330進(jìn)行操作。為了實現(xiàn)這一點(diǎn),用于訪問作用域存儲器區(qū)域330的所有 線程優(yōu)選地被轉(zhuǎn)變?yōu)闀和顟B(tài),在所述暫停狀態(tài)中停止執(zhí)行軟件線程。相應(yīng)地,在完成垃圾 收集處理時,用于訪問作用域存儲器區(qū)域330的所有線程優(yōu)選地被從暫停狀態(tài)轉(zhuǎn)變到活動 狀態(tài)。此外,在完成垃圾收集操作時,優(yōu)選可以通過壓縮(compaction)來整理作用域存 儲器區(qū)域330。壓縮是在存儲器空間內(nèi)移動對象的過程,使得它們所占據(jù)的存儲器基本上是 連續(xù)的,留下相對較大的空閑存儲器區(qū)域。相比之下,在未壓縮的存儲器中,許多分配的對 象可能被廣泛分布,在它們之間留下許多小的空閑存儲器區(qū)域。壓縮涉及把在作用域存儲 器區(qū)域330中分配的對象移動到所述作用域存儲器區(qū)域330中連續(xù)的(或基本上連續(xù)的) 存儲單元。另外,需要更新對每個移動后的對象的引用以便對應(yīng)于所述對象的新存儲器單 元。這被稱為整理(fix up)引用的過程。所描述的本發(fā)明的實施例可以至少部分地使用軟件控制的可編程處理設(shè)備來實 現(xiàn),例如微處理器、數(shù)字信號處理器或其它處理設(shè)備、數(shù)據(jù)處理設(shè)備或系統(tǒng),應(yīng)當(dāng)理解,用于 配置可編程裝置、設(shè)備或系統(tǒng)以實現(xiàn)上述方法的計算機(jī)程序被認(rèn)為是本發(fā)明的一個方面。
9計算機(jī)程序可以被實現(xiàn)為源代碼或經(jīng)過編譯以在處理裝置、設(shè)備或系統(tǒng)上實現(xiàn)或者例如可 以被實現(xiàn)為目標(biāo)代碼。適當(dāng)?shù)厥?,計算機(jī)程序以機(jī)器或設(shè)備可讀的形式被存儲在載體介質(zhì)上,例如存儲 在固態(tài)存儲器、例如磁盤或磁帶之類的磁存儲器、例如光盤或數(shù)字多用盤等光或磁光可讀 存儲器,并且處理裝置利用程序或其一部分來配置它以用于操作。計算機(jī)程序可以從用通 信介質(zhì)實現(xiàn)的遠(yuǎn)程源提供,所述通信介質(zhì)例如電子信號、射頻載波或光學(xué)載波。這種載體介 質(zhì)也被設(shè)想為本發(fā)明的一個方面。本領(lǐng)域技術(shù)人員應(yīng)當(dāng)理解,盡管已經(jīng)相對于上述示例性實施例描述了本發(fā)明,但 本發(fā)明并不局限于此并且存在落入本發(fā)明范圍內(nèi)的許多可能的變化和修改。本發(fā)明的范圍包括這里公開的任何新穎的特征或特征組合。申請人在此提請注 意,在本申請或從本申請衍生的任何這種進(jìn)一步申請的審批期間可能針對這些特征或特征 的組合形成新的權(quán)利要求。特別地是,參考所附權(quán)利要求,可以把從屬權(quán)利要求的特征與獨(dú) 立權(quán)利要求的那些特征相組合并且可以依照任何適當(dāng)?shù)姆绞蕉粌H是依照在權(quán)利要求中 列舉的具體組合來組合各個獨(dú)立權(quán)利要求的特征。
權(quán)利要求
一種作用域存儲器系統(tǒng)中的存儲器管理方法,所述作用域存儲器系統(tǒng)包括作用域存儲器區(qū)域,所述作用域存儲器區(qū)域用于在其中分配對象以便由一個或多個執(zhí)行中的軟件線程訪問,所述作用域存儲器區(qū)域與用于表明所述作用域存儲器區(qū)域可丟棄的線程計數(shù)相關(guān)聯(lián),所述方法包括步驟針對在所述作用域存儲器區(qū)域中分配的對象識別一組根引用;遞歸地遍歷并標(biāo)記從該組根引用被引用并且在所述作用域存儲器區(qū)域中分配的對象;并且識別所述作用域存儲器區(qū)域中未被這樣標(biāo)記的對象,并且丟棄所識別的對象。
2.如權(quán)利要求1所述的方法,其中識別一組根引用的步驟進(jìn)一步包括使所述一個或多 個軟件線程進(jìn)入暫停狀態(tài),在該暫停狀態(tài)中臨時停止軟件線程的執(zhí)行,并且其中識別所有 對象的步驟進(jìn)一步包括使所述一個或多個軟件線程離開所述暫停狀態(tài)。
3.如權(quán)利要求1所述的方法,進(jìn)一步包括步驟 借助以下步驟來壓縮所述作用域存儲器區(qū)域a)把在所述作用域存儲器區(qū)域中分配的對象移動到所述作用域存儲器區(qū)域中的連續(xù) 的存儲單元;并且b)整理對移動后的對象的引用以便引用所述作用域存儲器區(qū)域中的所述連續(xù)的存儲單元。
4.如權(quán)利要求1所述的方法,其中識別一組根引用的步驟包括識別具有作為根引用的 對在作用域存儲器區(qū)域中分配的對象的引用的軟件線程。
5.一種用于作用域存儲器系統(tǒng)中的存儲器管理的設(shè)備,所述作用域存儲器系統(tǒng)包括作 用域存儲器區(qū)域,所述作用域存儲器區(qū)域用于在其中分配對象以便由一個或多個執(zhí)行中的 軟件線程訪問,所述作用域存儲器區(qū)域與用于表明所述作用域存儲器區(qū)域可丟棄的線程計 數(shù)相關(guān)聯(lián),所述設(shè)備包括用于針對在所述作用域存儲器區(qū)域中分配的對象識別一組根引用的裝置; 用于遞歸地遍歷并標(biāo)記從該組根引用被引用并且在所述作用域存儲器區(qū)域中分配的 對象的裝置;和用于識別所述作用域存儲器區(qū)域中未被這樣標(biāo)記的對象,并且丟棄所識別的對象的裝置。
6.如權(quán)利要求5所述的設(shè)備,其中用于識別一組根引用的裝置進(jìn)一步包括用于使所述 一個或多個軟件線程進(jìn)入暫停狀態(tài)的裝置,在該暫停狀態(tài)中臨時停止軟件線程的執(zhí)行,并 且其中用于識別所有對象的裝置進(jìn)一步包括用于使所述一個或多個軟件線程離開所述暫 停狀態(tài)的裝置。
7.如權(quán)利要求5所述的設(shè)備,進(jìn)一步包括用于借助以下步驟來壓縮所述作用域存儲器區(qū)域的設(shè)備a)把在所述作用域存儲器區(qū)域中分配的對象移動到所述作用域存儲器區(qū)域中的連續(xù) 的存儲單元;并且b)整理對移動后的對象的引用以便引用所述作用域存儲器區(qū)域中的所述連續(xù)的存儲單元。
8.如權(quán)利要求5所述的設(shè)備,其中用于識別一組根引用的裝置包括用于識別具有作為 根引用的對在作用域存儲器區(qū)域中分配的對象的引用的軟件線程的裝置。
9.一種設(shè)備,包括中央處理單元;存儲器子系統(tǒng);輸入/輸出子系統(tǒng);和總線子系統(tǒng), 用于互連所述中央處理單元、存儲器子系統(tǒng)、輸入/輸出子系統(tǒng);和如權(quán)利要求5到8中任 何一項所述的設(shè)備。
10.一種計算機(jī)程序單元,包括計算機(jī)程序代碼,用于當(dāng)被加載到計算機(jī)系統(tǒng)中并且在 其上執(zhí)行時使所述計算機(jī)執(zhí)行如權(quán)利要求1到4中的任何一項所述方法的步驟。
全文摘要
一種作用域存儲器系統(tǒng)中的存儲器管理方法,所述作用域存儲器系統(tǒng)包括作用域存儲器區(qū)域,用于在其中分配對象以便由一個或多個執(zhí)行中的軟件線程訪問,所述作用域存儲器區(qū)域與用于表明所述作用域存儲器區(qū)域可丟棄的線程計數(shù)相關(guān)聯(lián),所述方法包括步驟針對在所述作用域存儲器區(qū)域中分配的對象識別一組根引用;遞歸地遍歷并標(biāo)記從該組根引用被引用并且在所述作用域存儲器區(qū)域中分配的對象;以及識別所述作用域存儲器區(qū)域中沒有被這樣標(biāo)記的對象,并且丟棄所識別的對象。
文檔編號G06F12/02GK101809545SQ200880108492
公開日2010年8月18日 申請日期2008年9月4日 優(yōu)先權(quán)日2007年9月25日
發(fā)明者A·約翰遜 申請人:國際商業(yè)機(jī)器公司