專利名稱:一種內存垃圾收集器中對象狀態(tài)的增量式跟蹤記錄方法
技術領域:
本發(fā)明涉及一種內存垃圾收集器中對象狀態(tài)的增量式跟蹤記錄方法,屬于編譯器軟件和運行時系統(tǒng)技術領域。
背景技術:
內存垃圾收集器(Garbage Collector)是Java虛擬機、C#虛擬機中管理對象內存空間的關鍵模塊。對用戶而言,使用Java或者C#等語言編程時,由于內存垃圾收集器的存在,只需在程序中申請對象空間,而對象的管理和空間釋放,都由內存垃圾收集器自動完成,從而極大的提高程序的開發(fā)效率和運行可靠性。但由于內存垃圾收集器對內存對象的機械式管理,使得Java或者C#程序中的部分對象長期占用內存而得不到釋放,從而影響內 存的整體使用效率。因此,在虛擬機的內存垃圾收集器中建立一種針對每個對象生存周期和生存狀態(tài)的監(jiān)控記錄機制,可以尋找和定位那些長期占用內存而不釋放的對象,并針對這些對象對程序進行優(yōu)化,對于提高虛擬機的運行效率,具有重要的意義。
發(fā)明內容
針對現有技術中存在的問題,本發(fā)明提出一種內存垃圾收集器中對象狀態(tài)的增量式跟蹤記錄方法,對程序運行過程中申請的每一個對象的生存周期和生存狀態(tài)進行增量式跟蹤記錄,根據記錄結果,尋找和定位那些長期占用內存而不釋放的對象。將這些信息提供給程序員或者運行時系統(tǒng)后,針對這些對象對程序進行優(yōu)化,對于提高虛擬機的運行效率,具有重要的意義。本發(fā)明提出一種內存垃圾收集器中對象狀態(tài)的增量式跟蹤記錄方法,包括以下幾個步驟步驟一內存垃圾收集器創(chuàng)建一個新的對象的同時,增加該對象的對象序列號GID值,形成現有的對象存儲信息;步驟二 內存垃圾收集器完成當前的內存垃圾收集任務后,對每個對象的狀態(tài)進行記錄,并將記錄結果保存在對象狀態(tài)記錄表中,對象狀態(tài)記錄表由一個索引表和對象狀態(tài)記錄組成,索引表中的每一項都對應一個對象狀態(tài)記錄;步驟三判斷從上一次內存垃圾收集器執(zhí)行完內存垃圾收集任務到本次執(zhí)行完內存垃圾收集任務的過程中,內存垃圾收集器的程序是否申請創(chuàng)建了新的對象,如果是,每增加一個新的對象,在索引表中增加一個以該對象的GID值為下標的新項,并相應增加一個該對象的對象狀態(tài)記錄,并將該對象的創(chuàng)建時間記錄在內,如果不是,進入步驟四;步驟四判斷從上一次內存垃圾收集器執(zhí)行完內存垃圾收集任務到本次執(zhí)行完內存垃圾收集任務的過程中,內存垃圾收集器的程序是否訪問了已有的對象,如果是,每一個被訪問的對象,通過索引表,以該被訪問對象的GID值為下標,訪問到該對象的對象狀態(tài)記錄,將該對象的最近被訪問時間記錄在對象狀態(tài)記錄中,如果不是,進入步驟五;步驟五判斷本次內存垃圾收集器執(zhí)行內存垃圾收集過程中是否移動了已有對象,如果是,每一個被移動的對象,通過索引表,以該對象的GID值為下標,訪問到該對象的對象狀態(tài)記錄,在該對象的對象狀態(tài)記錄中增加一項內存地址記錄信息,標記為“GC X內存地址”,其中次數X代表內存垃圾收集器的第幾次調用該對象。如果不是,進入步驟六;步驟六判斷本次內存垃圾收集器執(zhí)行內存垃圾收集過程中內存垃圾收集器的程序是否釋放了已有對象,如果是,每一個被釋放的對象,通過索引表,以該對象的GID值為下標,訪問到該對象的對象狀態(tài)記錄,在該對象的對象狀態(tài)記錄中增加一項釋放的記錄信息,標記為“GC z:釋放”,z代表這是內存垃圾收集器第z次執(zhí)行內存垃圾收集任務,如果不是則結束。本發(fā)明的優(yōu)點在于(I)本發(fā)明提出一種內存垃圾收集器中對象狀態(tài)的增量式跟蹤記錄方法,在內存垃圾收集器中建立一種針對每個對象生存周期和生存狀態(tài)的增量式跟蹤記錄機制,這種機制目前不存在于任何內存垃圾收集器中; (2)本發(fā)明提出一種內存垃圾收集器中對象狀態(tài)的增量式跟蹤記錄方法,這種增量式跟蹤記錄方法對程序運行效率的影響較??;(3)本發(fā)明提出一種內存垃圾收集器中對象狀態(tài)的增量式跟蹤記錄方法所記錄的對象生存周期和生存狀態(tài)信息充分全面;(4)本發(fā)明提出一種內存垃圾收集器中對象狀態(tài)的增量式跟蹤記錄方法對內存的占用和消耗較低。
圖I :本發(fā)明提出一種內存垃圾收集器中對象狀態(tài)的增量式跟蹤記錄方法的流程 圖;圖2 :本發(fā)明中對象、GID項、索引表和對象狀態(tài)記錄之間的關系不意圖。
具體實施例方式下面將結合附圖對本發(fā)明作進一步的詳細說明。本發(fā)明提出一種內存垃圾收集器中對象狀態(tài)的增量式跟蹤記錄方法,如圖I所示,包括以下幾個步驟步驟一內存垃圾收集器創(chuàng)建一個新的對象的同時,增加該對象的對象序列號,即GID值,形成現有的對象存儲信息,即對象在內存中的映像。如圖2所示,GID項為對應對象所新增的數據成員,內存垃圾收集器每次申請增加新的對象,便會賦予該對象一個唯一的對象序列號即GID值,GID值取值為非零的正整數。步驟二 內存垃圾收集器完成當前的內存垃圾收集任務后,對每個對象的狀態(tài)進行記錄,并將記錄結果保存在對象狀態(tài)記錄表中,如圖2所示,對象狀態(tài)記錄表由一個索引表和一系列的對象狀態(tài)記錄組成。索引表包括的每一項(項數與GID值的個數一致)都對應一個對象狀態(tài)記錄,對象狀態(tài)記錄包含對象的創(chuàng)建時間、對象的最近被訪問時間等信息。對象狀態(tài)記錄還包括“GC X內存地址”以及“GC z:釋放”,“GC x:內存地址”的含義為第X次內存垃圾收集完成時,該對象在內存中的地址;“GC z:釋放”的含義為第z次內存垃圾收集完成時,該對象已被釋放。由于每個對象在整個程序運行周期中,對應且唯一對應索引表中的一項,因此每個對象的對象狀態(tài)記錄的信息是遞增記錄的,這就是本發(fā)明被稱為“增量式跟蹤記錄方法”的原因。這樣的跟蹤記錄方法可以有效降低程序的負載,提聞運行效率。步驟三判斷從上一次內存垃圾收集器執(zhí)行完內存垃圾收集任務到本次執(zhí)行完內存垃圾收集任務的過程中,內存垃圾收集器的程序是否申請創(chuàng)建了新的對象,如果是,每增加一個新的對象,在索引表中增加一個以該對象的GID值為下標的新項,并相應增加一個該對象的對象狀態(tài)記錄,并將該對象的創(chuàng)建時間記錄在內。如果不是,進入步驟四。
步驟四判斷從上一次內存垃圾收集器執(zhí)行完內存垃圾收集任務到本次執(zhí)行完內存垃圾收集任務的過程中,內存垃圾收集器的程序是否訪問了已有的對象,如果是,每一個被訪問的對象,通過索引表,以該被訪問對象的GID值為下標,快速訪問到該對象的對象狀態(tài)記錄,將該對象的最近被訪問時間記錄在對象狀態(tài)記錄中。如果不是,進入步驟五。步驟五判斷本次內存垃圾收集器執(zhí)行內存垃圾收集過程中是否移動了已有對象,如果是,每一個被移動的對象,通過圖2中索引表,以該對象的GID值為下標,快速訪問到該對象的對象狀態(tài)記錄,在該對象的對象狀態(tài)記錄中增加一項內存地址記錄信息,標記為“GC x:內存地址”,其中次數X代表內存垃圾收集器第幾次調用該對象。如果不是,進入步驟六;步驟六判斷本次內存垃圾收集器執(zhí)行內存垃圾收集過程中內存垃圾收集器的程序是否釋放了已有對象,如果是,每一個被釋放的對象,通過圖2中索引表,以該對象的GID值為下標,快速訪問到該對象的對象狀態(tài)記錄,在該對象的對象狀態(tài)記錄中增加一項釋放的記錄信息,標記為“GC z:釋放”,其中z代表這是內存垃圾收集器第z次執(zhí)行內存垃圾收集任務,如果不是則結束。
權利要求
1.一種內存垃圾收集器中對象狀態(tài)的增量式跟蹤記錄方法,其特征在于包括以下幾個步驟 步驟一內存垃圾收集器創(chuàng)建一個新的對象的同時,增加該對象的對象序列號GID值,形成現有的對象存儲信息; 步驟二 內存垃圾收集器完成當前的內存垃圾收集任務后,對每個對象的狀態(tài)進行記錄,并將記錄結果保存在對象狀態(tài)記錄表中,對象狀態(tài)記錄表由一個索引表和對象狀態(tài)記錄組成,索引表中的每一項都對應一個對象狀態(tài)記錄; 步驟三判斷從上一次內存垃圾收集器執(zhí)行完內存垃圾收集任務到本次執(zhí)行完內存垃圾收集任務的過程中,內存垃圾收集器的程序是否申請創(chuàng)建了新的對象,如果是,每增加一個新的對象,在索引表中增加一個以該對象的GID值為下標的新項,并相應增加一個該對象的對象狀態(tài)記錄,并將該對象的創(chuàng)建時間記錄在內,如果不是,進入步驟四; 步驟四判斷從上一次內存垃圾收集器執(zhí)行完內存垃圾收集任務到本次執(zhí)行完內存垃圾收集任務的過程中,內存垃圾收集器的程序是否訪問了已有的對象,如果是,每一個被訪問的對象,通過索引表,以該被訪問對象的GID值為下標,訪問到該對象的對象狀態(tài)記錄,將該對象的最近被訪問時間記錄在對象狀態(tài)記錄中,如果不是,進入步驟五; 步驟五判斷本次內存垃圾收集器執(zhí)行內存垃圾收集過程中是否移動了已有對象,如果是,每一個被移動的對象,通過索引表,以該對象的GID值為下標,訪問到該對象的對象狀態(tài)記錄,在該對象的對象狀態(tài)記錄中增加一項內存地址記錄信息,標記為“GC X內存地址”,其中次數X代表內存垃圾收集器的第幾次調用該對象。如果不是,進入步驟六; 步驟六判斷本次內存垃圾收集器執(zhí)行內存垃圾收集過程中內存垃圾收集器的程序是否釋放了已有對象,如果是,每一個被釋放的對象,通過索引表,以該對象的GID值為下標,訪問到該對象的對象狀態(tài)記錄,在該對象的對象狀態(tài)記錄中增加一項釋放的記錄信息,標記為“GC z:釋放”,z代表這是內存垃圾收集器第z次執(zhí)行內存垃圾收集任務,如果不是則結束。
2.根據權利要求I所述的一種內存垃圾收集器中對象狀態(tài)的增量式跟蹤記錄方法,其特征在于所述的GID值取值為非零的正整數。
3.根據權利要求I所述的一種內存垃圾收集器中對象狀態(tài)的增量式跟蹤記錄方法,其特征在于所述的對象狀態(tài)記錄包含對象的創(chuàng)建時間、對象的最近被訪問時間信息。
4.根據權利要求I所述的一種內存垃圾收集器中對象狀態(tài)的增量式跟蹤記錄方法,其特征在于所述的對象狀態(tài)記錄還包括“GC x:內存地址”以及“GC z:釋放”的信息,其中"GCx:內存地址”的含義為第X次內存垃圾收集完成時,該對象在內存中的地址;“GC z:釋放”的含義為第z次內存垃圾收集完成時,該對象已被釋放。
全文摘要
本發(fā)明提出一種內存垃圾收集器中對象狀態(tài)的增量式跟蹤記錄方法,屬于編譯器軟件和運行時系統(tǒng)技術領域,包括內存垃圾收集器創(chuàng)建對象并增加該對象的對象序列號;內存垃圾收集器完成當前的內存垃圾收集任務后,對每個對象的狀態(tài)進行增量式的記錄,并將記錄結果保存在對象狀態(tài)記錄表中;判斷內存垃圾收集器的程序是否申請創(chuàng)建了新的對象;判斷內存垃圾收集器的程序是否訪問了已有的對象;判斷內存垃圾收集器的程序是否移動了已有對象;判斷存垃圾收集過程中是否釋放了已有對象。本發(fā)明在內存垃圾收集器中建立一種針對每個對象生存周期和生存狀態(tài)的增量式跟蹤記錄機制,這種機制目前不存在于任何內存垃圾收集器中,對程序運行效率的影響較小。
文檔編號G06F12/02GK102722447SQ20121018583
公開日2012年10月10日 申請日期2012年6月6日 優(yōu)先權日2012年6月6日
發(fā)明者史曉華 申請人:北京航空航天大學