專利名稱:一種Java虛擬機(jī)中位置無關(guān)代碼的緩存與復(fù)用方法
技術(shù)領(lǐng)域:
本發(fā)明屬于Java虛擬機(jī)技術(shù)領(lǐng)域,具體涉及位置無關(guān)代碼的緩存與復(fù)用方法。
背景技術(shù):
Java虛擬機(jī)作為一種重要的運(yùn)行時(shí)系統(tǒng),因易于擴(kuò)展、便于跟蹤程序執(zhí)行和程序移植等優(yōu)點(diǎn)而被廣泛研究。近年來,借助即時(shí)編譯、并行執(zhí)行等方法,桌面平臺(tái)與服務(wù)器平臺(tái)的虛擬機(jī)執(zhí)行效率獲得了很大提升。即時(shí)編譯技術(shù)借助動(dòng)態(tài)剖析信息,使虛擬機(jī)只關(guān)注熱方法,縮小了編譯器的編譯范圍,從整體上降低了編譯時(shí)間開銷,減少了編譯生成的代碼所需存儲(chǔ)空間,因此被廣泛應(yīng)用于個(gè)人電腦平臺(tái)、服務(wù)器平臺(tái)甚至嵌入式平臺(tái)。然而,即時(shí)編譯系統(tǒng)也給程度執(zhí)行帶來額外開銷,如檢測(cè)延時(shí)和編譯延時(shí)??蓤?zhí)行代碼緩存復(fù)用是一項(xiàng)重要的降低檢測(cè)和編譯延時(shí)的技術(shù)。該技術(shù)的核心是 針對(duì)虛擬機(jī)生成的可執(zhí)行位置無關(guān)代碼的設(shè)計(jì)和位置無關(guān)代碼的緩存與復(fù)用管理。代碼緩存即將編譯生成的可執(zhí)行代碼以文件形式,按一定的格式存儲(chǔ)至次級(jí)存儲(chǔ)設(shè)備,如硬盤、閃存等。緩存代碼至文件的目的是使其他程序或該程序在之后的運(yùn)行過程中可以復(fù)用功能相同的部分或全部代碼。代碼緩存復(fù)用技術(shù)的典型的應(yīng)用是Unix或Linux操作系統(tǒng)的共享庫。共享庫中的函數(shù)只有一份物理拷貝,但可被不同的進(jìn)程裝載至不同的內(nèi)存地址空間執(zhí)行而互不影響,從而既節(jié)省代碼存儲(chǔ)空間又節(jié)省編譯時(shí)間。位置無關(guān)代碼的常見緩存與復(fù)用方法使用符號(hào)表和動(dòng)態(tài)鏈接器共同實(shí)現(xiàn)。在編譯過程(通常是靜態(tài)編譯)中,編譯器從代碼中的位置相關(guān)處提取所依賴的符號(hào)信息,并計(jì)算各符號(hào)相對(duì)于程序地址空間中某一全局固定位置的地址偏移;然后,將符號(hào)及其偏移值存儲(chǔ)至統(tǒng)一的符號(hào)表中;最后,將符號(hào)表及其描述信息與代碼一起存儲(chǔ)至文件系統(tǒng)。這樣處理后,代碼中所依賴的位置信息被替換為指向符號(hào)表中某項(xiàng)的索引,消除了具體地址位置信息,從而實(shí)現(xiàn)代碼的位置無關(guān)。因此,使用符號(hào)表,一方面實(shí)現(xiàn)了代碼的位置無關(guān)化,另一方面又完成了對(duì)位置無關(guān)代碼的緩存管理。該方法的實(shí)質(zhì)是將地址位置的直接引用替換為間接引用,將代碼中位置相關(guān)點(diǎn)的地址綁定操作推遲到運(yùn)行時(shí)完成。因此,該方法還必須配合專門的運(yùn)行時(shí)動(dòng)態(tài)鏈接器和鏈接過程,才能使緩存代碼得以復(fù)用。復(fù)用代碼時(shí),操作系統(tǒng)需要查詢符號(hào)表,獲得所需符號(hào)的當(dāng)前位置信息,并填充符號(hào)表以備后續(xù)使用,該過程稱為符號(hào)的解析過程。如果符號(hào)不在當(dāng)前程序鏡像中而在共享庫中,那么動(dòng)態(tài)鏈接器需要加載該共享庫其及依賴的共享庫并完成必需的符號(hào)解析過程,該過程稱為符號(hào)的鏈?zhǔn)浇馕?。解析結(jié)束后,動(dòng)態(tài)鏈接器需要加載符號(hào)及相關(guān)代碼,該過程中需要驗(yàn)證許多信息,十分復(fù)雜。這使得該方法適用靜態(tài)編譯器卻不適于即時(shí)編譯系統(tǒng),因?yàn)閷?duì)即時(shí)編譯器而言,維護(hù)符號(hào)表、計(jì)算符號(hào)偏移的開銷,屬于程序執(zhí)行時(shí)間的一部分,而靜態(tài)編譯器無需考慮這些開銷;專門的鏈接器會(huì)增加即時(shí)編譯器的實(shí)現(xiàn)難度,專門的符號(hào)鏈接解析過程會(huì)增加程序執(zhí)行的等待時(shí)間
發(fā)明內(nèi)容
本發(fā)明的目的在于設(shè)計(jì)一種高效的位置無關(guān)代碼緩存與復(fù)用方法。該方法使用較小的緩存文件與復(fù)用文件開銷,同時(shí)不需要復(fù)雜的數(shù)據(jù)結(jié)構(gòu)與算法,能簡(jiǎn)化即時(shí)編譯器的代碼管理,幫助提升虛擬機(jī)的執(zhí)行效率。本發(fā)明設(shè)計(jì)的位置無關(guān)代碼緩存與復(fù)用方法,包括設(shè)計(jì)緩存文件存儲(chǔ)格式和必要元數(shù)據(jù)信息,以便能高效地實(shí)現(xiàn)代碼的緩存;設(shè)計(jì)緩存文件組織方式,以便能高效地復(fù)用代碼;設(shè)計(jì)實(shí)現(xiàn)緩存檢測(cè)算法,在運(yùn)行過程中檢測(cè)緩存文件的存在性與合法性,并更新各Java方法的緩存狀態(tài);依據(jù)緩存狀態(tài)和復(fù)用策略,決定如何加載緩存文件中的代碼以實(shí)現(xiàn)復(fù)用。本發(fā)明設(shè)計(jì)的位置無關(guān)代碼緩存與復(fù)用方法,可分為兩大部分可執(zhí)行代碼緩存方法與緩存文件復(fù)用方法。在可執(zhí)行代碼緩存方法方面,虛擬機(jī)按圖I所示的緩存文件布局存儲(chǔ)位置無關(guān)代碼,并按圖3和圖5所示的流程緩存并復(fù)用已緩存的代碼。圖2則展示了本發(fā)明所設(shè)計(jì)的緩存文件組織方法。
第一部分,可執(zhí)行代碼的緩存方法??蓤?zhí)行代碼的緩存方法主要包括緩存文件的布局方式,緩存文件的組織策略,位置無關(guān)代碼緩存。所述的緩存文件布局,如圖I所示。從圖中可知,緩存文件由頭部和內(nèi)容兩部分組成文件頭部包括標(biāo)識(shí)該文件類型的魔數(shù)(Magic Number),除魔數(shù)外剩余文件內(nèi)容的校驗(yàn)和、該文件的總大小、常量池空間大小、代碼區(qū)大小以及異常信息表的大小,這些信息主要用于在加載代碼前檢查文件的完整性并指導(dǎo)內(nèi)存分配器為即將加載的代碼分配空間;文件內(nèi)容包含代碼使用的常量池、可執(zhí)行代碼本身以及異常信息表。本發(fā)明使用ccf后綴表示使用圖I布局的代碼緩存文件。本發(fā)明所設(shè)計(jì)布局策略有以下優(yōu)點(diǎn)
1.完整性與安全性檢驗(yàn)時(shí),可只讀元數(shù)據(jù)信息進(jìn)行,從而可以快速完成檢驗(yàn)過程;
2.加載CCF內(nèi)容前,元數(shù)據(jù)中的大小信息可指導(dǎo)以代碼管理器提前分配好緩存的可執(zhí)行代碼所需一切存儲(chǔ)空間,從而使加載過程變?yōu)楹?jiǎn)單的文件讀與內(nèi)存寫操作。所述的緩存文件組織策略,見圖2所示。經(jīng)調(diào)研發(fā)現(xiàn),每個(gè)類文件包含多個(gè)Java方法,各Java方法由不同的索引標(biāo)識(shí);而不同的類文件由類文件的唯一身份簽名標(biāo)識(shí)。因此,本發(fā)明使用目錄管理緩存文件,一個(gè)目錄表示一個(gè)類文件,而目錄中的文件表示該類文件中Java方法的代碼緩存。從圖2可知,本發(fā)明用類唯一標(biāo)識(shí)構(gòu)造目錄名,用方法在類中的索引號(hào)構(gòu)造緩存文件名。該緩存組織策略有如下優(yōu)點(diǎn)
1.構(gòu)造命名法直接借用已有標(biāo)識(shí)信息構(gòu)建文件名及目錄名,從而省去復(fù)雜的唯一鍵值過程,降低了方法的實(shí)現(xiàn)難度;
2.類目錄與緩存文件名的構(gòu)造規(guī)則可用于運(yùn)行時(shí)緩存文件檢測(cè),方便高效復(fù)用;
3.無需單獨(dú)維護(hù)文件表等信息以記錄文件位置,也不必實(shí)現(xiàn)文件查找算法,這些工作都由借助文件系統(tǒng)完成,使緩存與復(fù)用過程都變得簡(jiǎn)單。所述位置無關(guān)代碼緩存,是以緩存文件布局及其組織方式為基礎(chǔ)的,在此基礎(chǔ)上,本發(fā)明設(shè)計(jì)了緩存流程,具體見圖3所示。圖中粗線框表示本發(fā)明添加的緩存操作。本發(fā)明根據(jù)Java虛擬機(jī)中即時(shí)編譯器的翻譯結(jié)果將生成的二進(jìn)制代碼保存到緩存中去。具體過程為在即時(shí)編譯器生成好位置無關(guān)的二進(jìn)制代碼后計(jì)算代碼的校驗(yàn)和、準(zhǔn)備該方法的元信息,然后按照前文所述的緩存文件組織策略和布局存入緩存中。第二部分,緩存文件的復(fù)用方法。本發(fā)明所設(shè)計(jì)的復(fù)用方法分兩階段緩存文件的存在性檢測(cè)階段與緩存文件加載階段。前者負(fù)責(zé)檢測(cè)被調(diào)用方法是否存在緩存的代碼,并檢測(cè)代碼的合法性(如果確實(shí)存在緩存),其算法效率直接影響虛擬機(jī)的開銷;后者負(fù)責(zé)在合適時(shí)機(jī)加載緩存文件并執(zhí)行加載的代碼。本發(fā)明使用方法緩存狀態(tài)在兩個(gè)階段間進(jìn)行相互通信,如圖4左側(cè)所示。本發(fā)明先檢測(cè)是否存在代碼的緩存版本,并更新檢測(cè)結(jié)果至方法的標(biāo)志位。然后按圖4右側(cè)所設(shè)計(jì)的方法緩存狀態(tài)變換規(guī)則與變換條件虛擬機(jī)啟動(dòng)時(shí),每個(gè)方法都被指定為初始狀態(tài)——UNCHECKED,表示未知存在緩存與否;CACHED,表示該方法已經(jīng)過緩存檢測(cè),且存在可復(fù)用的代碼緩存版本,緩存加載操作可以在恰當(dāng)?shù)臅r(shí)機(jī)加載該方法的緩存代碼;N0CACHE,表示該方法已經(jīng)被檢測(cè)過,但目前不存在可復(fù)用的代碼緩存文件。每一個(gè)方法初始都為UNCHECKED狀態(tài),在執(zhí)行到該方法時(shí)進(jìn)行緩存檢測(cè),如果沒有檢測(cè)該方法則改變?yōu)镹OCACHE狀態(tài),若緩存文件已存在則改變?yōu)镃ACHED狀態(tài),方法的二進(jìn)制代碼在失效或者卸載的時(shí)候又會(huì)改變?yōu)镹OCACHE狀態(tài)。在緩存文件存在性檢測(cè)階段,本發(fā)明設(shè)計(jì)如下緩存檢測(cè)算法1.從方法的類文件 獲得類文件的標(biāo)識(shí)信息;2.用類文件標(biāo)識(shí)信息和方法在類文件中方法表里的索引構(gòu)造出緩存文件的全路徑;3.使用文件系統(tǒng)庫函數(shù),如access、stat等檢測(cè)該路徑所指向的文件是否存在,并依據(jù)返回的檢測(cè)結(jié)果更新方法的緩存狀態(tài)標(biāo)志。該方法之所以高效在于文件的位置和索引信息都由文件系統(tǒng)維護(hù),檢測(cè)文件是否存在的算法和過程也由系統(tǒng)調(diào)用函數(shù)完成,這使得方法在實(shí)現(xiàn)時(shí)省去維護(hù)緩存文件信息以及提供對(duì)這些信息的訪問接口的任務(wù);構(gòu)造路徑所需的信息僅為類標(biāo)識(shí)和方法索引,它們都可以在運(yùn)行時(shí)從方法的數(shù)據(jù)結(jié)構(gòu)體中直接獲得,無需額外的存儲(chǔ)空間和虛擬機(jī)函數(shù)調(diào)用;路徑構(gòu)造只是字符串拼接操作,本身簡(jiǎn)單直接。在緩存文件加載階段,本發(fā)明所設(shè)計(jì)復(fù)用策略為方法執(zhí)行時(shí)期MET (MethodExecuting Time)復(fù)用,即在方法執(zhí)行前檢查緩存狀態(tài),并依據(jù)緩存狀態(tài)確定是否先加載再執(zhí)行。這與即時(shí)編譯的基本原理類似,因此MET復(fù)用也稱為即時(shí)加載(Just-In-TimeLoad)。即時(shí)加載只加載被執(zhí)行到的方法,相比于全部復(fù)用,該策略從整體上降低了緩存代碼的內(nèi)存空間需求,使資源得到合理利用。圖5是本發(fā)明所設(shè)計(jì)的緩存復(fù)用操作流程。圖中粗線框?yàn)楸景l(fā)明所設(shè)計(jì)內(nèi)容。與傳統(tǒng)的即時(shí)編譯過程相比,本發(fā)明的位置無關(guān)代碼緩存與復(fù)用管理方法為虛擬機(jī)提供了一條新的可執(zhí)行代碼來源,該來源與即時(shí)編譯過程都是在線完成的。具體過程如下首先采用解釋執(zhí)行的方式進(jìn)入方法的執(zhí)行,此時(shí)進(jìn)行緩存文件的檢測(cè),如果緩存中存在該方法的緩存,則對(duì)緩存文件的合法性進(jìn)行校驗(yàn)。如果通過校驗(yàn)則直接加載如內(nèi)存直接執(zhí)行二進(jìn)制代碼;如果校驗(yàn)存在問題,則使用即時(shí)編譯器進(jìn)行重新編譯,將結(jié)果保存會(huì)緩存,同時(shí)直接執(zhí)行二進(jìn)制代碼。如果在緩存中不存在該方法的記錄,則仍然采用解釋進(jìn)行的方式進(jìn)行執(zhí)行,同時(shí)進(jìn)行調(diào)用計(jì)數(shù),當(dāng)計(jì)數(shù)器超過一定的閾值之后,調(diào)用即時(shí)編譯器進(jìn)行方法的編譯,并且根據(jù)前文描述的緩存文件的組織和布局方式對(duì)該方法的二進(jìn)行代碼進(jìn)行緩存。本發(fā)明的有益效果是I)本發(fā)明設(shè)計(jì)實(shí)現(xiàn)了一種針對(duì)Java即時(shí)編譯器動(dòng)態(tài)生成的位置無關(guān)代碼的緩存與復(fù)用管理方法,其輕量級(jí)特性和較小的開銷使其可在運(yùn)行時(shí)使用。2)本發(fā)明設(shè)計(jì)了輕量級(jí)的緩存文件的構(gòu)造組織法,借助現(xiàn)有Java類與方法的標(biāo)識(shí)信息和文件系統(tǒng)函數(shù)接口,可高效地管理緩存代碼,并能為緩存檢測(cè)、維護(hù)與加載復(fù)用提供很好支持;該方法可用于其他基于文件的管理應(yīng)用領(lǐng)域。3)本發(fā)明設(shè)計(jì)了基于狀態(tài)的緩存文件檢測(cè)方法,可以高效地檢測(cè)緩存文件的存在性;狀態(tài)標(biāo)志分離了檢測(cè)與加載過程,使加載器復(fù)用時(shí)機(jī)更靈活。4)本發(fā)明設(shè)計(jì)了代碼復(fù)用的即時(shí)加載策略,使虛擬機(jī)用較小的開銷實(shí)現(xiàn)了對(duì)位置無關(guān)代碼的正確復(fù)用。
圖I為本發(fā)明所設(shè)計(jì)代碼緩存文件內(nèi)容布局。圖2為本發(fā)明所設(shè)計(jì)緩存文件組織方式。圖3為本發(fā)明的代碼緩存操作流程。圖4為本發(fā)明所設(shè)計(jì)緩存狀態(tài)變換條件與規(guī)則。圖5為本發(fā)明的代碼加載復(fù)用操作流程。
圖6為本發(fā)明的緩存文件檢測(cè)算法。
具體實(shí)施例方式本發(fā)明的具體實(shí)施過程分兩個(gè)步驟進(jìn)行緩存位置無關(guān)代碼至文件和從文件復(fù)用可執(zhí)行代碼。在實(shí)施時(shí),前者主要涉及即時(shí)編譯器的代碼生成和管理,需對(duì)動(dòng)態(tài)編譯生成的可執(zhí)行代碼在恰當(dāng)?shù)臅r(shí)候按本發(fā)明所設(shè)計(jì)緩存格式和組織方式進(jìn)行緩存;后者主要涉及解釋器和代碼管理器,需在恰當(dāng)?shù)臅r(shí)候按本發(fā)明所設(shè)計(jì)緩存文件檢測(cè)方法和復(fù)用策略對(duì)緩存代碼進(jìn)行加載。下面從兩個(gè)步驟分別細(xì)述
步驟一、緩存位置無關(guān)代碼
首先,虛擬機(jī)需要計(jì)算位置無關(guān)的校驗(yàn)和與元數(shù)據(jù)中各個(gè)大小信息;然后,用構(gòu)造命名法創(chuàng)建緩存文件和目錄(如果不存在對(duì)應(yīng)類文件的目錄);最后,以二進(jìn)制形式將準(zhǔn)備好的元數(shù)據(jù)與原始代碼一起寫入新建的緩存文件中。本發(fā)明中,這些操作發(fā)生在即時(shí)編譯結(jié)束之后,代碼安裝執(zhí)行之前,如圖4中粗線框所示。步驟二、復(fù)用位置無關(guān)代碼
虛擬機(jī)通常希望被緩存的代碼被加載得越早越好,從而能使虛擬機(jī)越早執(zhí)行效率更高的二進(jìn)制代碼。即時(shí)加載的最早時(shí)期是方法第一次被執(zhí)行的時(shí)候。按選擇性編譯流程,Java方法的首次執(zhí)行引擎都是解釋器。因此,本發(fā)明將緩存復(fù)用加載過程安排在解釋器中進(jìn)行。由于即時(shí)加載之前,必須先檢測(cè)緩存文件的存在性與合法性,因而實(shí)施過程中,本發(fā)明將緩存檢測(cè)過程也安排在解釋器中。圖5左側(cè)粗線流程展示了該過程。圖5中的緩存存在性檢測(cè)過程由圖6偽代碼所示算法實(shí)現(xiàn)。使用圖4所示的狀態(tài)標(biāo)志及其轉(zhuǎn)換規(guī)則,可以確保緩存文件檢測(cè)過程只發(fā)生一次;而后的檢測(cè)可直接通過比較緩存狀態(tài)標(biāo)志簡(jiǎn)單地實(shí)現(xiàn)。當(dāng)方法首次被執(zhí)行時(shí),解釋器必須調(diào)用dvmCodeCacheCheck檢測(cè)緩存文件存在與否并依據(jù)檢測(cè)結(jié)果更新方法的緩存狀態(tài)(第6行),最后做出跳轉(zhuǎn)決定(第9行)對(duì)于CACHED狀態(tài)結(jié)果,虛擬機(jī)將從解釋執(zhí)行切換到加載緩存代碼進(jìn)行本地執(zhí)行;對(duì)于NOCACHE狀態(tài)結(jié)果,虛擬機(jī)仍然按照選擇性編譯的正常過程執(zhí)行,直到方法變熱被編譯執(zhí)行,或者因不夠熱而在解釋中執(zhí)行至結(jié)束。該算法中,dvmCodeCacheCheck用構(gòu)造命名法和文件系統(tǒng)調(diào)用接口函數(shù),完成緩存文件存在性檢測(cè)過程。
權(quán)利要求
1.一種Java虛擬機(jī)中位置無關(guān)代碼緩存與復(fù)用方法,其特征在于分為兩大部分可執(zhí)行代碼緩存方法與緩存文件復(fù)用方法,其中 第一部分,可執(zhí)行代碼的緩存方法,包括緩存文件的布局方式、緩存文件的組織策略和位置無關(guān)代碼緩存; 所述的緩存文件布局,緩存文件由文件頭部和文件內(nèi)容兩部分組成;所述文件頭部包括標(biāo)識(shí)該文件類型的魔數(shù),除魔數(shù)外剩余文件內(nèi)容的校驗(yàn)和、該文件的總大小、常量池空間大小、代碼區(qū)大小以及異常信息表的大小,這些信息用于在加載代碼前檢查文件的完整性并指導(dǎo)內(nèi)存分配器為即將加載的代碼分配空間;所述文件內(nèi)容包含代碼使用的常量池、可執(zhí)行代碼本身以及異常信息表; 所述的緩存文件組織策略,使用目錄管理緩存文件,每一個(gè)Java類對(duì)應(yīng)一個(gè)目錄,該Java類中的所有方法對(duì)應(yīng)為該目錄中的一個(gè)文件,該文件中保存該Java方法的代碼緩存;目錄名根據(jù)Java類的唯一標(biāo)識(shí)進(jìn)行命名,文件名根據(jù)每個(gè)Java方法在類中的索引號(hào)進(jìn)行唯一的標(biāo)識(shí)和識(shí)別; 所述位置無關(guān)代碼緩存,以緩存文件布局及其組織方式為基礎(chǔ),根據(jù)Java虛擬機(jī)中即時(shí)編譯器的翻譯結(jié)果將生成的二進(jìn)制代碼保存到緩存中去;具體過程為在即時(shí)編譯器生成好位置無關(guān)的二進(jìn)制代碼后計(jì)算代碼的校驗(yàn)和、準(zhǔn)備該方法的元信息,然后按照上面所述的緩存文件組織策略和布局存入緩存中; 第二部分,緩存文件的復(fù)用方法,分為兩階段緩存文件的存在性檢測(cè)階段與緩存文件加載階段;前者負(fù)責(zé)檢測(cè)被調(diào)用方法是否存在緩存的代碼,并檢測(cè)代碼的合法性;后者負(fù)責(zé)在合適時(shí)機(jī)加載緩存文件并執(zhí)行加載的代碼; 所述緩存文件的狀態(tài)在兩個(gè)階段間進(jìn)行相互通信先檢測(cè)是否存在代碼的緩存版本,并更新檢測(cè)結(jié)果至方法的標(biāo)志位;然后按所設(shè)計(jì)的方法的緩存狀態(tài)變換規(guī)則與變換條件進(jìn)行復(fù)用虛擬機(jī)啟動(dòng)時(shí),每個(gè)方法都被指定為初始狀態(tài)——UNCHECKED,表示未知存在緩存與否;CACHED,表示該方法已經(jīng)過緩存檢測(cè),且存在可復(fù)用的代碼緩存版本,緩存加載操作可以在恰當(dāng)?shù)臅r(shí)機(jī)加載該方法的緩存代碼;NOCACHE,表示該方法已經(jīng)被檢測(cè)過,但目前不存在可復(fù)用的代碼緩存文件;每一個(gè)方法初始都為UNCHECKED狀態(tài),在執(zhí)行到該方法時(shí)進(jìn)行緩存檢測(cè),如果沒有檢測(cè)該方法則改變?yōu)镹OCACHE狀態(tài),若緩存文件已存在則改變?yōu)镃ACHED狀態(tài),方法的二進(jìn)制代碼在失效或者卸載的時(shí)候又會(huì)改變?yōu)镹OCACHE狀態(tài)。
2.根據(jù)權(quán)利要求I所述的Java虛擬機(jī)中位置無關(guān)代碼緩存與復(fù)用方法,其特征在于在緩存文件存在性檢測(cè)階段,采用緩存檢測(cè)算法(I)從方法的類文件獲得類文件的標(biāo)識(shí)信息;(2)用類文件標(biāo)識(shí)信息和方法在類文件中方法表里的索引構(gòu)造出緩存文件的全路徑;(3)根據(jù)該緩存文件的全路徑,使用文件系統(tǒng)庫函數(shù),檢測(cè)所指向的文件是否存在,并依據(jù)返回的檢測(cè)結(jié)果更新方法的緩存狀態(tài)標(biāo)志。
3.根據(jù)權(quán)利要求2所述的Java虛擬機(jī)中位置無關(guān)代碼緩存與復(fù)用方法,其特征在于在緩存文件加載階段,采用方法執(zhí)行時(shí)期MET復(fù)用策略,即在方法執(zhí)行前檢查緩存狀態(tài),并依據(jù)緩存狀態(tài)確定是否先加載再執(zhí)行。
4.根據(jù)權(quán)利要求3所述的Java虛擬機(jī)中位置無關(guān)代碼緩存與復(fù)用方法,其特征在于所述緩存文件復(fù)用方法的具體過程如下首先采用解釋執(zhí)行的方式進(jìn)入方法的執(zhí)行,此時(shí)進(jìn)行緩存文件的檢測(cè),如果緩存中存在該方法的緩存,則對(duì)緩存文件的合法性進(jìn)行校驗(yàn);如果通過校驗(yàn)則直接加載如內(nèi)存直接執(zhí)行二進(jìn)制代碼;如果校驗(yàn)存在問題,則使用即時(shí)編譯器進(jìn)行重新編譯,將結(jié)果保存會(huì)緩存,同時(shí)直接執(zhí)行二進(jìn)制代碼;如果在緩存中不存在該方法的記錄,則仍然采 用解釋進(jìn)行的方式進(jìn)行執(zhí)行,同時(shí)進(jìn)行調(diào)用計(jì)數(shù),當(dāng)計(jì)數(shù)器超過一定的閾值之后,調(diào)用即時(shí)編譯器進(jìn)行方法的編譯,并且根據(jù)前文描述的緩存文件的組織和布局方式對(duì)該方法的二進(jìn)行代碼進(jìn)行緩存。
全文摘要
本發(fā)明屬于Java虛擬機(jī)設(shè)計(jì)技術(shù)領(lǐng)域,具體涉及即時(shí)編譯器生成的位置無關(guān)代碼的緩存與復(fù)用管理。本發(fā)明設(shè)計(jì)了一種高效的位置無關(guān)代碼管理方法,并在Android操作系統(tǒng)內(nèi)置虛擬機(jī)Dalvik上將其實(shí)現(xiàn)。本發(fā)明為位置無關(guān)代碼設(shè)計(jì)了良好的緩存文件格式和緩存文件組織方式,并設(shè)計(jì)了高效的復(fù)用檢測(cè)與加載策略。使用該管理方法可使虛擬機(jī)編譯器生成的位置無關(guān)代碼被高效地復(fù)用,從而提升虛擬機(jī)的執(zhí)行效率。
文檔編號(hào)G06F9/44GK102830965SQ201210260280
公開日2012年12月19日 申請(qǐng)日期2012年7月26日 優(yōu)先權(quán)日2012年7月26日
發(fā)明者楊珉, 張?jiān)? 周波 申請(qǐng)人:復(fù)旦大學(xué)