專利名稱:一種基于Java虛擬機(jī)的延時動態(tài)對象更新方法
技術(shù)領(lǐng)域:
本發(fā)明屬于計算機(jī)應(yīng)用領(lǐng)域,具體是一種基于Java虛擬機(jī)的低中斷的延時動態(tài)對象更新方法。
背景技術(shù):
Java是一種面向?qū)ο笳Z言。運行中的Java程序可以看做是由對象以及對象之間的交互組成。Java程序的動態(tài)更新可以看做是對對象的更新。Java虛擬機(jī)按照對象模型去實現(xiàn)對象,每一個對象都包含兩個字的對象頭。一個對象頭字用于存儲一些狀態(tài)信息,例如對象鎖的狀態(tài),垃圾回收標(biāo)志,哈希值等。另一個對象頭字存儲指向與該對象類型相關(guān)的運行時刻類元數(shù)據(jù),運行時刻的動態(tài)類型檢查、虛方 法調(diào)用、接口方法調(diào)用等都是通過這個類元數(shù)據(jù)獲得具體的動態(tài)信息。當(dāng)前很多基于Java虛擬機(jī)動態(tài)更新系統(tǒng)并不能夠支持對對象的更新,例如Hotspot JVM的Hotswap機(jī)制。一些系統(tǒng)雖然能夠?qū)ο筮M(jìn)行更新但是存在一些不足的地方,例如需要進(jìn)行遍歷堆區(qū)中的所有對象,造成很大的更新中斷時間。這些系統(tǒng)采用即時的對象更新方法,利用垃圾回收協(xié)助對象更新,進(jìn)行一次全堆區(qū)的垃圾回收,加上執(zhí)行自定義對象更新方法,造成系統(tǒng)中斷時間比較長,可能會導(dǎo)致額外的損失。動態(tài)更新的操作需要中斷當(dāng)前系統(tǒng),安裝新的類,之后對對象進(jìn)行更新。動態(tài)對象更新時需要解決以下三個問題。I.在運行時刻,找出當(dāng)前堆區(qū)的所有類型發(fā)生改變的對象。2.當(dāng)對象空間變大時需要為更新后的對象申請新的更大的空間,修復(fù)那些原先指向舊對象空間的指針指向新的對象。保證引用一致性的最簡單的方法就是在一個原子過程實現(xiàn)這個操作。3.利用舊對象的值去對新對象的值進(jìn)行初始化。這涉及到開發(fā)者編寫自定義更新方法。即時動態(tài)更新方法一般利用Java虛擬機(jī)的垃圾回收去掃描整個對象圖,找出變化的對象,接著利用垃圾回收能夠移動對象的特性更新指針。延時的方法則將對需要更新的對象的檢測推遲到更新中斷之后的程序常態(tài)運行時。在更新中斷之后的常態(tài)運行時,對非法對象的首次訪問將會首先陷入一個對象更新例程,非法對象因此被更新為普通的對象。延時的對象更新主要面臨如下三個問題。I.常態(tài)運行時刻對非法對象的檢測會導(dǎo)致程序運行速度變慢。2.對象空間變大時,沒有有效的方法更新指針。3.編寫自定義方法面臨的上下環(huán)境復(fù)雜,需要對此做出限制。本發(fā)明提出的延時對象更新方法可以很好的解決上述三個問題。它可以有效減少運行時刻對非法對象的檢測,支持對對象空間增大的對象更新,同時給出一個編寫transformer 的方法。
發(fā)明內(nèi)容
本發(fā)明所要解決的技術(shù)問題是提供一種基于Java虛擬機(jī)的低中端延時動態(tài)對象更新方法,該方法通過將對象更新操作推遲到更新中斷之后的常態(tài)運行時刻執(zhí)行,降低更新中斷時間,從而提高了更新的效率。本發(fā)明的技術(shù)方案為一種基于Java虛擬機(jī)的低中端延時動態(tài)對象更新方法,主要包含如下步驟
I.在動態(tài)更新中斷時刻,加載新類替換舊類,將舊類元數(shù)據(jù)設(shè)置為非法狀態(tài)。2.如果新類對象空間增大,則創(chuàng)建輔助的類元數(shù)據(jù)。 3.在更新中斷之后的常態(tài)運行時刻插入非法對象檢測點,對非法對象進(jìn)行檢測。4.在常態(tài)運行時刻將非法對象更新為普通的新對象。有益效果本發(fā)明提出的延時對象更新方法可以很好的解決現(xiàn)有技術(shù)中出現(xiàn)的問題,有效減少運行時刻對非法對象的檢測,支持對對象空間增大的對象更新,同時給出一個編寫transformer的方法。
圖I本發(fā)明實施例的動態(tài)類更新以及對象更新的整個流程。圖2本發(fā)明實施例的更新后的類結(jié)構(gòu)。圖3本發(fā)明實施例的對空間未增長對象的更新。圖4本發(fā)明實施例的對空間增長對象的更新,構(gòu)造MixObjects。圖5本發(fā)明實施例的垃圾回收將Mix-Objects合并成普通對象。
具體實施例方式以下結(jié)合附圖和具體實施例對本發(fā)明作進(jìn)一步詳細(xì)闡述。圖I本發(fā)明實施例的動態(tài)類更新以及對象更新的整個流程。本發(fā)明的基于Java虛擬機(jī)的低中端延時動態(tài)對象更新方法,主要包含如下步驟
步驟一、在動態(tài)更新中斷時刻,加載新類替換舊類,將舊類元數(shù)據(jù)設(shè)置為非法狀態(tài);
將舊類元數(shù)據(jù)設(shè)置為非法狀態(tài)的具體步驟為
1.D設(shè)置舊類元數(shù)據(jù)中的虛方法表中方法入口地址指向?qū)ο蟾吕獭?.2)設(shè)置舊類元數(shù)據(jù)中的接口實現(xiàn)信息為空。1.3)設(shè)置舊類元數(shù)據(jù)中的父類為新類。這樣,更新之后舊類設(shè)置為非法類,它在類型系統(tǒng)中的位置如圖2所示。步驟二、如果新類對象空間增大,則創(chuàng)建輔助的類元數(shù)據(jù);
創(chuàng)建輔助的類元數(shù)據(jù)的具體步驟為
2.I)拷貝一份新類元數(shù)據(jù),該拷貝即為輔助類元數(shù)據(jù)的雛形。2.2)設(shè)置拷貝類元數(shù)據(jù)對象大小為舊類型對象大小。2. 3)設(shè)置拷貝類元數(shù)據(jù)對象引用類型域信息為僅包含能放置在舊類對象空間中的域。輔助類在類型系統(tǒng)中的位置如圖2所示。
步驟三、在更新中斷之后的常態(tài)運行時刻插入非法對象檢測點,對非法對象進(jìn)行檢測;
插入非法檢測點的具體步驟為
3.I)在該對象表現(xiàn)為父類對象時的訪問前移除非法對象檢測。3.2)進(jìn)行控制流分析,消除冗余的顯式非法對象檢測。
3. 3)移除虛方法調(diào)用、接口方法調(diào)用處得非法對象檢測,這部分檢測是隱式的。3.4)插入剩下顯式的對象檢測。步驟四、在常態(tài)運行時刻將非法對象更新為普通的新對象;
在運行時刻將對象更新為普通的新對象的具體步驟為
如圖2所示,如果該對象需要申請新空間,則創(chuàng)建一個新對象,將該對象與舊對象鏈接起來,舊對象的類元數(shù)據(jù)更新為輔助類元數(shù)據(jù),舊對象的狀態(tài)字設(shè)置為有Mix-Ob ject,且將申請的新對象地址編碼進(jìn)該狀態(tài)字,形成一對未初始化的Mix-Objects。如圖3所示,如果不需要申請新空間,則將舊對象的類元數(shù)據(jù)設(shè)置為新類元數(shù)據(jù),形成一個為初始化的新對象。在得到的新空間上執(zhí)行對象更新方法。上述步驟中執(zhí)行的對象更新方法的編寫準(zhǔn)則是
第一、在運行更新方法時,運行系統(tǒng)保證了沒有其他線程對該對象訪問。第二、舊對象空間中舊類域的值會被拷貝到棧中成為局部變量,所有對舊類舊域的訪問會轉(zhuǎn)換為對局部變量的訪問。第三、對新類域的寫入讀取操作分兩種情況1)對溢出的域(必須被放在MixObjects的新對象空間中的域)需要進(jìn)行一次重定向;2)對其它域則正常訪問。圖4本發(fā)明實施例的對空間增長對象的更新,構(gòu)造MixObjects。如圖5所示,垃圾回收將Mix-Objects合并成普通對象。將非一般的普通新對象Mix-Objects更新為普通對象的具體步驟是
1)當(dāng)垃圾回收器要移動非一般的普通新對象Mix-Objects對象的時只移動Mix-Objects中的新對象,
2)將Mix-Objects中的舊對象值拷貝到新對象中。3)當(dāng)對其他對象更新指向Mix-Objects的指針時,使其指向Mix-Objects新對象對應(yīng)的地址。這里存在兩次轉(zhuǎn)發(fā)。雖然本發(fā)明通過具體實施例和附圖進(jìn)行了描述,但實施例并非用來限定本發(fā)明。本領(lǐng)域技術(shù)人員可在本發(fā)明的精神范圍內(nèi),做出各種變形和改進(jìn),其同樣在本發(fā)明的保護(hù)范圍之內(nèi)。因此本發(fā)明的保護(hù)范圍應(yīng)當(dāng)以本申請的權(quán)利要求保護(hù)所界定的相同或等同的范圍為準(zhǔn)。
權(quán)利要求
1.一種基于Java虛擬機(jī)的低中斷延時動態(tài)對象更新方法,其特征在于,包含如下步驟 步驟一、在動態(tài)更新中斷時刻,加載新類替換舊類; 步驟二、在更新中斷之后的常態(tài)運行時刻插入非法對象檢測點,對非法對象進(jìn)行檢測; 步驟三、在常態(tài)運行時刻檢測到非法對象時將其更新為非一般的新對象; 步驟四、將非一般的新對象更新為普通對象。
2.根據(jù)權(quán)利要求I所述的基于Java虛擬機(jī)的低中斷延時動態(tài)對象更新方法,其特征在于,所述步驟一的具體步驟為 1.1)加載新類替換舊類; I. 2)如果需要對象更新,將舊類元數(shù)據(jù)設(shè)置為非法狀態(tài); I. 3)如果新類對象空間增大,則創(chuàng)建輔助的類元數(shù)據(jù)。
3.根據(jù)權(quán)利要求2所述的基于Java虛擬機(jī)的低中斷延時動態(tài)對象更新方法,其特征在于,所述步驟I. 2的具體步驟為 I. 2. I)設(shè)置舊類元數(shù)據(jù)中的虛方法表中方法入口地址指向?qū)ο蟾吕蹋? I. 2. 2)設(shè)置舊類元數(shù)據(jù)中的接口實現(xiàn)信息為空; 1.2.3)設(shè)置舊類元數(shù)據(jù)中的父類為新類。
4.根據(jù)權(quán)利要求2所述的基于Java虛擬機(jī)的低中斷延時動態(tài)對象更新方法,其特征在于,所述步驟I. 3的具體步驟為 I. 3. I)拷貝一份新類元數(shù)據(jù),該拷貝即為輔助類元數(shù)據(jù)的雛形; I. 3. 2)設(shè)置拷貝類元數(shù)據(jù)對象大小為舊類型對象大??; 1.3. 3)設(shè)置拷貝類元數(shù)據(jù)對象引用類型域信息為僅包含能放置在舊類對象空間中的域。
5.根據(jù)權(quán)利要求I所述的基于Java虛擬機(jī)的低中斷延時動態(tài)對象更新方法,其特征在于,所述步驟二的插入非法對象檢測點的具體步驟為 2.I)在該對象表現(xiàn)為父類對象時的訪問前移除非法對象檢測; 2.2)進(jìn)行控制流分析,消除冗余的顯式非法對象檢測; 2.3)移除虛方法調(diào)用、接口方法調(diào)用處得非法對象檢測,這部分檢測是隱式的; 2.4)插入剩下顯式的對象檢測。
6.根據(jù)權(quán)利要求I所述的基于Java虛擬機(jī)的低中斷延時動態(tài)對象更新方法,其特征在于,所述步驟三的常態(tài)運行時刻將對象更新為普通的新對象的具體步驟為 3.I)如果該對象需要申請新空間,則創(chuàng)建一個新對象,將該對象與舊對象鏈接起來,舊對象的類元數(shù)據(jù)更新為輔助類元數(shù)據(jù),舊對象的狀態(tài)字設(shè)置為有Mix-Object,且將申請的新對象地址編碼進(jìn)該狀態(tài)字,形成一對未初始化的Mix-Objects ; 3.2)如果不需要申請新空間,則將舊對象的類元數(shù)據(jù)設(shè)置為新類元數(shù)據(jù),形成一個為初始化的新對象; 3.3)在得到的新空間上執(zhí)行對象更新方法。
7.根據(jù)權(quán)利要求6所述的基于Java虛擬機(jī)的低中斷延時動態(tài)對象更新方法,其特征在于,所述步驟3. 3中執(zhí)行對象更新方法的編寫準(zhǔn)則是.3.3.1)在運行更新方法時,運行系統(tǒng)保證了沒有其他線程對該對象訪問; .3.3.2)舊對象空間中舊類域的值會被拷貝到棧中成為局部變量,所有對舊類舊域的訪問會轉(zhuǎn)換為對局部變量的訪問; .3.3.3)對新類域的寫入讀取操作分兩種情況1)對溢出的域(必須被放在MixObjects的新對象空間中的域)需要進(jìn)行一次重定向;2)對其它域則正常訪問。
8.根據(jù)權(quán)利要求I所述的基于Java虛擬機(jī)的低中斷延時動態(tài)對象更新方法,其特征在于,所述步驟四的將非一般的普通新對象更新為普通對象的具體步驟為 .4.1)當(dāng)垃圾回收器要移動非一般的普通新對象Mix-Objects對象時只移動Mix-Objects中的新對象; .4. 2)將Mix-Objects中的舊對象值拷貝到新對象中; .4. 3)當(dāng)對其他對象更新指向Mix-Objects的指針時,使其指向Mix-Objects新對象對應(yīng)的地址。
9.根據(jù)權(quán)利要求8所述的基于Java虛擬機(jī)的低中斷延時動態(tài)對象更新方法,其特征在于,所述步驟4. 3中,這里存在兩次轉(zhuǎn)發(fā)。
全文摘要
本發(fā)明公開了一種基于Java虛擬機(jī)的低中斷延時動態(tài)對象更新方法,包含如下步驟1)在動態(tài)更新中斷時刻,加載新類替換舊類;將舊類元數(shù)據(jù)設(shè)置為非法狀態(tài);2)如果新類對象空間增大,則創(chuàng)建輔助的類元數(shù)據(jù);3)在更新中斷之后的常態(tài)運行時刻插入非法對象檢測點,對非法對象進(jìn)行檢測;4)在常態(tài)運行時刻檢測到非法對象時將其更新為非一般的新對象;5)將非一般的新對象更新為普通對象。該方法在對Java程序進(jìn)行動態(tài)更新時對象更新的操作延遲到更新中斷以后的常態(tài)運行時刻進(jìn)行,以減少動態(tài)更新對系統(tǒng)的中斷時間,提高更新的效率。
文檔編號G06F9/455GK102880490SQ20121034659
公開日2013年1月16日 申請日期2012年9月19日 優(yōu)先權(quán)日2012年9月19日
發(fā)明者馬曉星, 曹春, 呂建, 顧天曉 申請人:南京大學(xué)