專利名稱:Java虛擬機的垃圾回收移動通信終端及回收方法
技術領域:
本發(fā)明涉及虛擬機環(huán)境中的內存管理領域,尤其是涉及移動通信終端上運 行的Java虛擬機的垃圾回收方法及垃圾回收移動通信終端。
背景技術:
Java程序設計語言是由Sim公司推出的跨平臺面向對象高級程序設計語 言,它的可執(zhí)行代碼是編譯以后統(tǒng)一標準的Java字節(jié)碼(Byte code) 。 Java 語言依賴于稱為Java虛擬機(Java virtual machine, JVM)的模擬機。JVM 使得程序員不是和系統(tǒng)打交道,而是和虛擬機打交道。因此程序員使用的函數(shù) 是JVM內嵌的函數(shù),而不是操作系統(tǒng)的函數(shù)。這非常先進,因為它提供了可移 植性。同時,JVM也非常小,不占用大量的內存。這意味著JVM可以被應用于 許多不同的機器。例如,電視機,蜂窩移動電話以及計算機。目前在移動通信 終端領域,A固公司表示,目前它已經供應了 2. 6億份用于移動通信終端的ARM Java軟件。索愛和諾基亞等手機制造商都已經開發(fā)了自己的多任務Jave虛擬 機用于手機等移動通信終端領域。JVM是用來同步處理VoIP、 3D游戲、音樂 下載和播放、電子郵件和即時信息等任務的。在Java虛擬機中,垃圾回收就是自動釋放不再被程序所使用的對象的過 程。垃圾回收方法必須能斷定哪些對象是不再被引用的,哪些對象是活動的, 并且能夠把不再被引用的對象所占據(jù)的空間釋放出來,而不影響活動對象。這 些對象中不再被引用的對象稱為不可達對象?;顒拥?,被引用的對象稱為可達 對象。而可達對象和不可達對象又根據(jù)其存儲內容分為值類型對象和引用類型 對象。值類型對象指其存儲的是某種類型的值,引用類型對象是指對其它對象 的引用(類似C語言中的指針)。同時,傳統(tǒng)的垃圾回收方法都是不可調度的, 它們并不適合移動通信終端系統(tǒng)。且由于空間的不斷分配和回收,必然會形成 大量的內存碎片。這些碎片占用了空間且不能夠參與分配和回收,這會造成空 間浪費現(xiàn)象。雖然碎片的總空間可能足夠大,但由于不能參與分配,特別是像在移動通信終端這樣內存較小的系統(tǒng)中,碎片會導致虛擬機產生不必要的"內 存不足"錯誤。JVM的垃圾回收把用戶從釋放占用內存的重擔中解救出來。使用戶可以在 應用程序開發(fā)時不必關心內存回收的各種煩惱問題,從而可以提高開發(fā)效率。 同時能夠幫助程序保持完整性,避免因失誤(或故意)錯誤地釋放內存而導致Java虛擬機的崩潰。現(xiàn)有的專利文獻包括專利申請?zhí)枮?00510061994.9的中國專利申請"支 持多進程的Java虛擬機實現(xiàn)方法"和專利號為6070173的美國專利"Method and Apparatus for Assisting Garbage Collection Process within a Java Virtual Machine"(—種用于輔助Java虛擬機垃圾回收過程的方法和裝置)。第200510061994. 9號中國專利特征如下 一、引入一種支持多進程的Java 虛擬機的進程切換方法。二、引入一種支持多進程的Java虛擬機的進程通訊 方法。三、引入一種支持多進程的Java虛擬機的內存控制方法。該專利的缺 點是提出的支持多進程的Java虛擬機并不適用于像移動通信終端這樣的嵌入 式設備領域。它的內存控制方法沒有相應的垃圾回收方法,僅僅指出一些內存 控制結構。第6070173號美國專利特征如下 一、使用虛擬對象堆和物理對象堆輔助 Java虛擬機垃圾回收過程。二、設定虛擬對象堆的閾值, 一旦系統(tǒng)對象超過 該值就進行垃圾回收。該專利的缺點是虛擬對象堆和物理對象堆并不適用在移 動通信終端這類內存較小的設備實現(xiàn),而且它不能控制垃圾回收時機,只能在 系統(tǒng)到達一定的時間點才進行垃圾回收。發(fā)明內容本發(fā)明欲解決的問題在于,提供了一種移動通信終端中Java虛擬機的垃 圾回收方法,用于正確區(qū)分出系統(tǒng)使用的對象的類型,保證系統(tǒng)運行的準確性。為了實現(xiàn)上述目的,本發(fā)明提供了一種移動通信終端中Java虛擬機的垃 圾回收方法,包括保存當前線程的上下文環(huán)境;遍歷Java虛擬機內存中的所有運行時對象,對可達對象的標志位進行標 記,并對可達對象的類型進行記錄;對未標記的對象占用的Java虛擬機內存空間進行合并以及釋放;對可達對象的內存空間進行緊縮處理;恢復當前線程的上下文環(huán)境。所述對可達對象的類型進行記錄的步驟進一步包括 定義一位圖,所述位圖中的位對應所述Java虛擬機的內存空間; 對引用類型或者值類型的對象所占據(jù)的Java虛擬機的內存空間在位圖中 的對應位置位。所述對可達對象進行標記的步驟進一步包括對Java虛擬機內存中已標 記的對象的子對象進行遞歸標記。在執(zhí)行保存當前線程的上下文環(huán)境的步驟之前,將Java虛擬機內存分成 固定大小的塊。所述緊縮處理步驟包括當Java虛擬機內存不足時,遍歷所述位圖,確定引用類型的對象的位置, 回收其空間;和/或遍歷所述位圖,確定值類型的對象的位置,將所述值類型的對象收集到一 連續(xù)的區(qū)塊中。保存當前線程的上下文環(huán)境的步驟之前進一步包括-.Java虛擬機調度模塊根據(jù)垃圾回收線程的優(yōu)先級參數(shù),調用該垃圾回收 線程,執(zhí)行保存當前線程的上下文環(huán)境的步驟。本發(fā)明還公開了一種對Java虛擬機中的垃圾進行回收的移動通信終端, Java虛擬機中包括一垃圾回收模塊,該垃圾回收模塊進一步包括上下文環(huán)境保存模塊,用于保存當前線程的上下文環(huán)境;標記模塊,用于遍歷Java虛擬機內存中的所有運行時對象,對可達對象 的標志位進行標記,并對可達對象的類型進行記錄;內存合并模塊,用于對未標記的對象占用的Java虛擬機內存空間進行合 并以及釋放;緊縮模塊,用于對可達對象的內存空間進行緊縮處理; 上下文環(huán)境恢復模塊,用于恢復當前線程的上下文環(huán)境。 所述標記模塊進一步包括一位圖記錄模塊,該位圖記錄模塊用于定義一位 圖,所述位圖中的位對應所述Java虛擬機的內存空間;利用所述位圖對所述可達對象的類型進行記錄,對引用類型或者值類型的對象所占據(jù)的Java虛擬機的內存空間在位圖中的對應位置位。所述緊縮模塊,用于當Java虛擬機內存不足時,遍歷所述位圖,確定引用類型的對象的位置,回收其對象空間;禾Q/或遍歷所述位圖,確定值類型的對象的位置,將所述值類型的對象收集到個連續(xù)的區(qū)塊中。Java虛擬機的調度模塊根據(jù)所述垃圾回收模塊的優(yōu)先級參數(shù),執(zhí)行該垃 圾回收模塊。本發(fā)明可正確區(qū)分出系統(tǒng)使用的對象的類型,預知并記錄下內存區(qū)域中自 由內存的大小。這樣保證系統(tǒng)運行的準確性。另外,本發(fā)明將系統(tǒng)內存分為固 定大小的內存塊,再將可達對象收集到一個連續(xù)的區(qū)域,實現(xiàn)對已分配內存進 行緊縮的內存碎片管理。
圖1所示為本發(fā)明的整體結構示意圖;圖2所示為本發(fā)明的垃圾回收模塊的具體結構示意圖;圖3所示為本發(fā)明的具體處理步驟流程圖;圖4所示為本發(fā)明步驟304的詳細實現(xiàn)流程圖。
具體實施方式
以下配合實施例以及附圖,詳細描述本發(fā)明的技術特征。 如圖1所示為本發(fā)明的整體結構示意圖。移動通信終端100中,操作系統(tǒng)130運行于硬件140之上,Java虛擬機 120基于操作系統(tǒng)130執(zhí)行相關操作,為各應用軟件110提供運行平臺。移動 通信終端100包括手機、PDA等。Java虛擬機120中包括垃圾回收模塊200、 運行時環(huán)境201、 Java虛擬機調度模塊202等各功能模塊。該垃圾回收模塊 200將針對運行時環(huán)境201進行垃圾回收操作。該運行時環(huán)境201即系統(tǒng)運行 時應用到的方法區(qū)、堆、線程的執(zhí)行棧和寄存器等。Java虛擬機調度模塊202 用于對Java虛擬機中的各個功能模塊進行調度,以使各模塊依次獲取處理器 的執(zhí)行時間。其他功能模塊均為現(xiàn)有技術中的常用模塊。Java虛擬機中的各功能模塊,包括該垃圾回收模塊200,皆具備優(yōu)先級參 數(shù),Java虛擬機調度模塊202將根據(jù)各功能模塊的該優(yōu)先級參數(shù)進行調用。 垃圾回收模塊200作為一個低優(yōu)先級的線程運行一段時間后,Java虛擬機將 周期性的動態(tài)提升其優(yōu)先級。從而保證在所有其他線程處于等待狀態(tài)時,具有 低優(yōu)先級的垃圾回收線程仍能執(zhí)行,從而動態(tài)的調整系統(tǒng)的可用內存,或者, 在內存不足時主動執(zhí)行。請參閱圖2所示為本發(fā)明的垃圾回收模塊200的具體結構示意圖。垃圾回收模塊200包括內存劃分模塊210、上下文環(huán)境保存模塊220、標 記模塊230、內存合并模塊240、緊縮模塊250以及上下文環(huán)境恢復模塊260。內存劃分模塊210用于在首次運行該垃圾回收模塊200時,將系統(tǒng)內存劃 分為固定大小的塊,以降低移動對象的復雜性以及避免內存碎片。譬如每塊可 分為32字節(jié)。一Java對象通常在內存空間中占用一個或多個塊,該多個塊在 物理上可以不連續(xù)。上下文環(huán)境保存模塊220用于保存當前線程的上下文環(huán)境。該上下文環(huán)境 主要包括當前線程的執(zhí)行棧指針,當前執(zhí)行棧中的有關結構以及當前的程序計 數(shù)器指針。這些指針用于在垃圾回收處理后恢復系統(tǒng)的上下文。標記模塊230用于標記Java虛擬機中的所有的可達對象,可達對象即仍 然被程序所使用的對象。該可達對象包括Java虛擬機中的全局對象和臨時對 象,以及Java虛擬機中的全局性變量、符號表以及用以記錄當前所有已裝載 類的類表。標記模塊230中還包括一位圖記錄模塊231,該位圖記錄模塊用于 定義一位圖,所述位圖中的位對應記錄所述Java虛擬機的內存空間;利用所 述位圖對所述可達對象的類型進行記錄,對引用類型或者值類型的對象所占據(jù) 的Java虛擬機的內存空間在位圖中的對應位置位。內存合并模塊240用于對未標記的對象占用的Java虛擬機內存空間進行 合并以及釋放;還可用于計算當前系統(tǒng)中的最大可用內存。緊縮模塊250用于在當前內存量不足時,對值類型或者弓I用類型對象進行 內存空間的緊縮,減小內存碎片。上下文環(huán)境恢復模塊260用于根據(jù)保存的當前線程的上下文環(huán)境,恢復當 前線程的上下文環(huán)境。請參閱圖3所示為本發(fā)明的具體處理步驟流程圖。步驟301, Java虛擬機調度模塊202根據(jù)優(yōu)先級參數(shù)調用該垃圾回收模塊 200,垃圾回收模塊200開始運行。步驟302,在首次運行垃圾回收模塊200時,利用內存劃分模塊210將Java 虛擬機內存分為固定大小的塊。步驟303,利用上下文環(huán)境保存模塊220保存當前線程的上下文環(huán)境。如果當前線程非空,則將當前線程的上下文環(huán)境保存下來,特別是保存當 前線程的執(zhí)行棧指針,當前執(zhí)行棧中的有關結構以及當前的程序計數(shù)器指針。 這些指針用于在垃圾回收處理后恢復系統(tǒng)的上下文。步驟304,遍歷Java虛擬機內存中的所有運行時對象,利用標記模塊230 標記Java虛擬機中的所有的可達對象,并對可達對象的類型進行記錄。由于JVM中全局性變量以及用以記錄當前所有已裝載類的類表在整個JVM 運行期間都是可訪問的,因而也要進行標記。請參閱圖4所示為本發(fā)明步驟304的詳細實現(xiàn)流程圖。步驟401,遍歷Java虛擬機內存中的所有運行時對象,對于可達對象, 將該對象前的標志位置位。該標志位為代表每個對象的數(shù)據(jù)結構中設置的標志位。步驟402,對內存中已標記的可達對象的子對象即間接可達對象進行遞歸 標記處理。步驟403,定義一位圖,用于對應記錄移動通信終端100的Java虛擬機 的內存空間。該位圖中的一位例如為對應Java虛擬機內存中的一個字節(jié)。步驟404,對可達對象中,值類型的對象所占用的空間在該位圖中對應標 記為"0",對引用類型的對象所占用的空間在該位圖中置位,即對應標記為 "1",包含引用的字對應的位也對應標記為"1"。當然,也可對值類型的對象所占用的空間在該位圖中置位,即對應標記為 "1",對引用類型的對象所占用的空間在該位圖中對應標記為"0"。該標記方法可快速區(qū)分值類型和引用類型對象,且確切了解所有對象的引 用的分布位置。本發(fā)明的垃圾回收算法正確區(qū)分出系統(tǒng)使用的對象的值和引用 類型,通過該位圖即可預知并記錄下內存區(qū)域中可達對象占用的內存大小,從 而同時得到自由內存的大小。這樣保證系統(tǒng)運行的準確性,使內存開銷最小。請繼續(xù)參閱圖3。歩驟305,利用內存合并模塊240對未標記的對象占用的Java虛擬機內 存空間進行合并以及釋放。艮口,對于不可達對象所占用的Java虛擬機內存空間進行了釋放,使其成為自由內存,重新得到應用。步驟306,計算系統(tǒng)中當前的最大可用內存,并判斷最大可用內存是否大 于系統(tǒng)當前需要的內存量,如果否,執(zhí)行步驟307,如果是,執(zhí)行步驟310。步驟307,利用緊縮模塊250進行緊縮處理。遍歷所述位圖,確定引用類型的對象的位置,根據(jù)該引用類型的對象的標 志位回收其空間;和/或遍歷所述位圖,確定值類型的對象的位置,將所述值類型的對象收集到一 連續(xù)的區(qū)塊中,以獲得更大的可用內存量,減小內存碎片。步驟308,判斷當前可用內存是否大于系統(tǒng)當前需要的內存量,如果否, 執(zhí)行步驟309,如果是,執(zhí)行步驟310。步驟309,拋出異常,結束當前線程,恢復上下文環(huán)境,執(zhí)行步驟311。 步驟310,恢復上下文環(huán)境,為線程分配適當?shù)膬却婵臻g。 步驟311,垃圾回收模塊200讓出處理器等待下次調度。 與現(xiàn)有技術相比較,本發(fā)明引入一種Java虛擬機的垃圾回收移動通信終 端及回收方法。本發(fā)明的垃圾回收方法可根據(jù)系統(tǒng)賦予的優(yōu)先級作為系統(tǒng)線程 被動受調度模塊調度執(zhí)行或由于內存不足而主動執(zhí)行。正是因為其可調度性, 使其可以在系統(tǒng)空閑時運行,而不是等到內存不足時被動執(zhí)行,從而有效的利 用了系統(tǒng)資源,因此,本發(fā)明為一種漸進運行的垃圾回收方法。本發(fā)明的垃圾 回收算法還可正確區(qū)分出系統(tǒng)使用的對象的類型,預知并記錄下內存區(qū)域中自 由內存的大小。這樣保證系統(tǒng)運行的準確性。另外,本發(fā)明的垃圾回收算法將 系統(tǒng)內存分為固定大小的內存塊,再將可達對象收集到一個連續(xù)的區(qū)域,實現(xiàn) 對已分配內存進行緊縮的內存碎片管理。本發(fā)明的保護范圍不限于上述說明,本領域的一般技術人員按本發(fā)明的構 思,可以對其做出修改或變動,它們應屬于本發(fā)明的構思范圍內。
權利要求
1、一種移動通信終端中Java虛擬機的垃圾回收方法,其特征在于,包括如下步驟保存當前線程的上下文環(huán)境;遍歷Java虛擬機內存中的所有運行時對象,對可達對象的標志位進行標記,并對可達對象的類型進行記錄;對未標記的對象占用的Java虛擬機內存空間進行合并以及釋放;對可達對象的內存空間進行緊縮處理;恢復當前線程的上下文環(huán)境。
2、 如權利要求l所述的方法,其特征在于,所述對可達對象的類型進行 記錄的步驟進一步包括定義一位圖,所述位圖中的位對應記錄所述Java虛擬機的內存空間; 對引用類型或者值類型的對象所占據(jù)的Java虛擬機的內存空間在位圖中 的對應位置位。
3、 如權利要求1或2所述的方法,其特征在于,所述對可達對象進行標 記的步驟進一步包括對Java虛擬機內存中己標記的對象的子對象進行遞歸 標記。
4、 如權利要求l所述的方法,其特征在于,在執(zhí)行保存當前線程的上下 文環(huán)境的步驟之前,將Java虛擬機內存分成固定大小的塊。
5、 如權利要求2所述的方法,其特征在于,所述緊縮處理步驟包括當Java虛擬機內存不足時,遍歷所述位圖,確定引用類型的對象的位置, 根據(jù)該引用類型的對象的標志位回收其空間;禾B/或遍歷所述位圖,確定值類型的對象的位置,將所述值類型的對象收集到一 連續(xù)的區(qū)塊中。
6、 如權利要求l、 2、 4或5所述的方法,其特征在于,保存當前線程的 上下文環(huán)境的步驟之前進一步包括Java虛擬機調度模塊根據(jù)垃圾回收線程的優(yōu)先級參數(shù),調用該垃圾回收 線程,執(zhí)行保存當前線程的上下文環(huán)境的步驟。
7、 一種對Java虛擬機中的垃圾進行回收的移動通信終端,所述移動通信終端中設置有Java虛擬機,其特征在于,所述Java虛擬機包括一垃圾回收模塊,該垃圾回收模塊進一步包括上下文環(huán)境保存模塊,用于保存當前線程的上下文環(huán)境;標記模塊,用于遍歷Java虛擬機內存中的所有運行時對象,對可達對象的標志位進行標記,并對可達對象的類型進行記錄;內存合并模塊,用于對未標記的對象占用的Java虛擬機內存空間進行合并以及釋放;緊縮模塊,用于對可達對象的內存空間進行緊縮處理; 上下文環(huán)境恢復模塊,用于恢復當前線程的上下文環(huán)境。
8、 如權利要求7所述的移動通信終端,其特征在于,所述標記模塊進一 步包括一位圖記錄模塊,該位圖記錄模塊用于定義一位圖,所述位圖中的位對 應記錄所述Java虛擬機的內存空間;利用所述位圖對所述可達對象的類型進行記錄,對引用類型或者值類型的 對象所占據(jù)的Java虛擬機的內存空間在位圖中的對應位置位。
9、 如權利要求8所述的移動通信終端,其特征在于,所述緊縮模塊,用 于當Java虛擬機內存不足時,遍歷所述位圖,確定引用類型的對象的位置, 根據(jù)該引用類型的對象的標志位回收其空間;和/或遍歷所述位圖,確定值類型的對象的位置,將所述值類型的對象收集到一 個連續(xù)的區(qū)塊中。
10、 如權利要求7、 8或9所述的移動通信終端,其特征在于,Java虛擬 機的調度模塊根據(jù)所述垃圾回收模塊的優(yōu)先級參數(shù),執(zhí)行該垃圾回收模塊。
全文摘要
本發(fā)明公開了一種Java虛擬機的垃圾回收移動通信終端及回收方法,該方法包括保存當前線程的上下文環(huán)境;遍歷Java虛擬機內存中的所有運行時對象,對可達對象進行標記,并對可達對象的類型進行記錄;對未標記的對象占用的Java虛擬機內存空間進行合并以及釋放;對可達對象的內存空間進行緊縮處理;恢復當前線程的上下文環(huán)境。本發(fā)明可正確區(qū)分出系統(tǒng)使用的對象的類型,預知并記錄下內存區(qū)域中自由內存的大小。這樣保證系統(tǒng)運行的準確性。另外,本發(fā)明將系統(tǒng)內存分為固定大小的內存塊,再將可達對象收集到一個連續(xù)的區(qū)域,實現(xiàn)對已分配內存進行緊縮的內存碎片管理。
文檔編號G06F12/02GK101221535SQ200810056889
公開日2008年7月16日 申請日期2008年1月25日 優(yōu)先權日2008年1月25日
發(fā)明者震 方 申請人:中興通訊股份有限公司