通過分隔額外信息來內存優化虛擬機代碼的方法和系統的製作方法
2023-06-04 02:31:51 1
專利名稱:通過分隔額外信息來內存優化虛擬機代碼的方法和系統的製作方法
技術領域:
本發明主要涉及虛擬機代碼,尤其涉及通過從可執行代碼中劃分額外信息來內存 優化虛擬機代碼。
背景技術:
虛擬機技術的優點已得到廣泛認可。在這些優點中,有一個優點是其能在單個主 機平臺上運行多個虛擬機,這樣做可以更好地使用硬體能力,同時確保每個用戶都享有「完 整的」計算機特徵。隨著計算機軟體複雜度的增加以及在日常生活和商業活動中對於軟體 系統的依賴度的增長,用戶期望具有很高的軟體運行性能。由於虛擬機軟體通常是在內存 受限的系統例如在PDA和智慧型電話這類內存往往少於傳統計算機系統的無線設備上運行 的,因此這種虛擬機軟體的性能尤其重要。由此,人們努力減少虛擬機代碼在運行時使用 的內存,例如將本地函數調用減至最少、限制本地代碼中提供的功能的類型、減小應用的大 小、以及要求有效的編碼。對於優化軟體性能而言,減小內存使用率仍舊是一個關鍵目標。
發明內容
因此,本發明的實施例包括一種用於優化虛擬機或解釋代碼的方法、電腦程式 產品和系統,包括接收包含多個程序指令以及第一額外信息的代碼,其中該代碼用供虛擬 機運行的語言編寫,並且其中第一額外信息是第一類型的不可執行信息;通過移除第一額 外信息以及將其替換成引用第一額外信息的位置的鍵值(key)來修改該代碼;以及執行經 過修改的代碼,並且如果在運行過程中發生請求第一額外信息的事件,則響應於所述事件 使用該鍵值來定位處於所述位置的額外信息,並且從所述位置加載第一額外信息。特別地,在通過結合附圖來考慮下文中的詳細描述時,可以清楚了解本發明實施 例的上述及其他特徵和優點,其中不同附圖中的相同附圖標記被用於表示相同的組件。
圖1是示出了根據本發明實施例的包含虛擬機的例示計算機系統的框圖。圖2是示出了根據本發明第一實施例的例示的劃分及內存優化處理的框圖。圖3是示出了根據本發明第一實施例的圖2劃分處理作用於例示Java類文件的 效果的框圖。圖4A和4B是示出了根據本發明第一實施例的劃分及內存優化處理的流程圖。圖5是示出了根據本發明第二實施例的例示劃分及內存優化處理的框圖。圖6是示出了根據本發明第二實施例的圖5劃分處理作用於例示Java類文件的 效果的框圖。圖7A和7B是描述根據本發明第二實施例的劃分及內存優化處理的流程圖。
具體實施例方式現在參考附圖,圖1示出的是一個根據本發明實施例的例示計算機系統。圖1顯 示的計算機系統10包括處理器12、內存14、網絡適配器16以及Java虛擬機20,所有這些 組件全都通過系統總線18可通信地耦接在一起。內存14可以用任何常規或其他的存儲器 或存儲設備(例如RAM、緩存、快閃記憶體等等)來實現,並且可以包括任何適當的存儲容量。網絡 適配器16可以被實現為使得計算機系統10能夠藉助任何數量的任何適當通信介質(例如 WAN、LAN、網際網路、內部網、有線網絡、無線網絡等等)通過共享內存或是採用其他任何適當 的方式來與一個或多個其他系統通信。本實施例的計算機系統可以包括藉助於任何常規或 其他協議而在網絡或其他通信信道上通信、並且可以使用任何類型的連接(例如有線、無 線等等)來進行訪問的任何常規或其他通信設備。Java虛擬機20包含各種組件,例如類加載器21、異常處理機(exertion handler)模塊22、差錯報告模塊23、包含解釋器25和即時(JIT)編譯器沈的運行引擎對、 類庫27以及內存觀。應該理解的是,雖然這裡論述的虛擬機20是Java虛擬機,但是本發明 並不局限於Java技術,而是可以結合其他技術和虛擬機來實施,例如CPython虛擬機、.NET 以及公用語言運行時、Parrot虛擬機、Rubinius虛擬機或是其他任何適當的虛擬機。類加載器21加載代碼,例如Java類(.class)或Java歸檔(.jar)文件之類的 字節碼文件,或是CIL字節碼文件。該代碼包含了從任何適合與虛擬機一起使用的語言中 編譯的程序指令,舉例來說,適合與CPython虛擬機結合使用的語言包括Python,適合與 Java 虛擬機(JVM)結合使用的語言包括 Java、Clojure、Fan、Groovy、IBMNetRexx, JavaFX Script、JavaScripts JRuby> Jython> JSchemeMacromedia ColdFusion、Rhino> Scala 等 等,適合與.NET公用語言運行時(CLR) —起使用的語言包括C#、C++/CLI、Cobra、F#、Fan、 IronPython、IronRuby、J#、JScript. NET、受管 JScript、Mondrian、Nemerle、VB. NET 等等, 適合與Parrot虛擬機一起使用的語言包括Perl 6,以及適合與Rubinius虛擬機一起使用 的語言包括Ruby。該語言可以是解釋語言或編譯語言,舉例來說,與JVM —起使用的語言可 以是Javakript或(iroovy,其中Javakript通常是解釋性的,而(iroovy則通常是編譯性的。計算機系統10既可以採用處理系統的形式來實現,也可以採用軟體的形式來實 現。計算機系統10可以由任何數量的常規或其他計算機系統或設備(例如計算機終端、個 人計算機(如IBM兼容機、AppleMacIntosh、平板電腦、膝上型計算機等等)等等)、蜂窩電 話、個人數字助理(例如him Pre, Treo, iPhone等等)等等來實現,並且可以包括任何商 用作業系統(例如AIX、Linux、0SX、Sun Solaris、Unix、Windows等等)以及任何商用或定 制軟體(例如瀏覽器軟體、通信軟體、字處理軟體等等)。這些系統可以包括多種類型的顯 示和輸入設備(例如鍵盤、滑鼠、語音識別等等),以便輸入和/或查看信息。如果是在軟體 中實現的(例如作為虛擬映像),那麼計算機系統10既可以在可記錄介質(例如磁性、光 學、軟盤、DVD、⑶等等)上得到,也可以採用從信源經由通信介質(例如公告板、網絡、LAN、 WAN、內部網、網際網路等等)下載的載波或信號的形式。圖2-4描述的是本發明第一實施例的不同方面。在本實施例中,代碼是通過從可 執行代碼中分離出額外信息以及通過單獨存儲額外信息而被劃分的,由此可執行代碼可以 正常加載,而額外信息則可以只在需要的時候延遲加載。在保持用於調試以及為欄位中的 代碼提供服務所必需的其他處理的額外信息的可訪問性的同時,通過減少內存足跡,該方案優化了內存使用率。圖2示出的是根據本發明第一實施例可由圖1系統實施的例示劃分和內存優化處 理。在本處理中,諸如Java類文件或CIL代碼文件之類的代碼30由後編譯模塊40接收, 並且在後編譯模塊40,代碼30中的額外信息被識別。該額外信息是不可執行信息,例如調 試信息221、注釋信息222或源信息223。通過移除額外信息產生經過修改的代碼35,以及 將額外信息保存在某個數據存儲位置,例如資料庫60、共享類緩存、嵌套內部類、或是獨立 的二進位對象,可以修改代碼30。在經過修改的代碼35中插入用於標識所述存儲位置的唯 一標識鍵值。在運行時,經過修改的代碼35被正常加載到虛擬機20中。如果在運行時需要該 額外信息,則系統可以定位並僅加載特定任務所需要的恰當類型的額外信息。舉個例子,如 果發生故障,那麼異常處理進程22和差錯報告機制23會請求調試信息221,以便拋出異常 並報告差錯,但其不需要注釋信息222和源信息223。同樣,如果代碼使用了反射,那麼反 射進程可以請求源信息223,但是不會請求調試信息221。在圖示的示例中,差錯報告機制 23是Java堆棧跟蹤報告方法,該方法請求四個信息來產生堆棧跟蹤70 類、方法、文件和 行號。通常,該信息是由虛擬機在構造異常的時候填入的,但在這些實施例中,文件和行號 會作為調試信息221的一部分而被移除,而所述調試信息則是保存在資料庫60中的。相應 地,異常處理進程22和差錯報告機制23使用鍵值來找出保存了調試信息221的存儲位置 60,然後則通過加載調試信息221來填充堆棧追蹤70。現在參考圖3,該圖顯示了一個例示的Java類文件30,其中所述Java類文件30具 有10個主要分量幻數(magic number) 201、版本202、常量池203、訪問標記204、本類205、 超類206、接口 207、欄位208、方法209以及屬性210。屬性可以包括調試信息221、注釋信 息222以及源信息223。例示的Java類文件30是通過從程序指令中劃分出額外信息以及 將額外信息保存在存儲位置60而被修改的,在本範例中,所述額外信息是調試信息221、注 釋信息222以及源信息223。在經過修改的Java類文件35中,額外信息被鍵值2M所取 代,其中該鍵值標識的是存儲該額外信息的存儲位置。在Jvava技術的上下文中,調試信息221可以包括如下屬性SourceFile (依照類)沒有路徑的源文件名,例如ClassName. Java ;SourceDebugExtension 通常是未使用的;LineNumberTable (依照方法)供調試器單步調試以及供異常堆棧跟蹤以列印行 號的行號(將字節碼索引映射成源文件中的行號);LocalVariableTable (依照方法)在單步調試時用於調試器的本地變量的名稱; 以及LocalVariableTypeTable (依照方法)對於一般類型(並且僅僅對於一般類型) 來說,源文件中的本地變量的類型不同於VM中的類型。例如,當源文件類型可以是一般散 列表 時,虛擬機將會看到散列表。對於代碼中的程序指令的正常運行來說,該信息並不是必需的,這是因為它僅僅 用於調試和堆棧跟蹤,並且在運行程序的過程中是不起作用的。在Java技術的上下文中,注釋信息222可以包括如下屬性AnnotationDefault ;
RuntimeVisibleAnnotations ;RuntimelnvisibleAnnotations ;RuntimeVisibIeParameterAnnotations ;以及RuntimeInvisibIeParameterAnnotations ο此外,在Java技術的上下文中,源信息223可以包括如下屬性EnclosingMethod 標識本地類的圍繞方法;Signature 標識用於類的一般籤名、欄位類型以及方法籤名;D印recated 標識棄用的項目;Synthetic 標識編譯器產生的項目;以及InnerClasses 標識內部和外部類關係(包括嵌套和匿名)對於代碼中的程序指令的正常運行來說,該信息並不是必需的,這是因為運行虛 擬機是不需要該信息的。該信息通常只用於反射。相應地,雖然移除該信息有可能會影響 到大量使用反射的方法,但是一般來說,大多數的程序不會受到這種移除處理的影響。現在轉到圖4A和4B,該圖概括性地顯示了第一實施例的用於劃分和內存優化處 理的處理300和400。處理300可以在運行時之外的時間執行(例如在加載類的時候),而 處理400則通常是在運行時執行的。以圖1的系統為例,在處理300中,該系統在步驟310 中接收代碼,例如經過後處理器解析的代碼,並且在步驟320標識所述代碼中的額外信息。 在步驟330,系統從代碼中移除額外信息,並且在步驟340中將移除的額外信息存入一個數 據存儲位置。在步驟350,系統在代碼中插入一個鍵值,以便引用所述額外信息的位置。在 一個系統、例如IBM J9系統中,該處理可以由某種工具來執行,例如Java優化器(JAPT)類 操作工具。在可選步驟360,系統改寫代碼,以使其間接而不是直接地訪問額外信息,例 如,通過修改多個程序指令中的一個或多個,可以攔截異常處理進程,並且可以使用鍵 值將其重定向到存儲位置。該步驟是可選的,這是因為所述進程也可以採用其他方式 來執行,例如修改類庫來變更本地函數的操作,以便透明地加載所存儲的額外信息, 例 如 Throwable. getStackTrace 、Class. getDeclaredAnnotations 以 及 Class. getGenericInterfaces 。舉個例子,對於堆棧跟蹤來說,通過修改類庫,可以在 StackTraceElement中存儲程序計數器。該程序計數器是標引發生了 StackTraceElement 所代表的方法調用的字節碼指令的索引,並且其被用於找到行號調試信息結構中的行號。 在可選步驟370中,經過修改的代碼可以保存在緩衝存儲器中,例如共享類緩存,由此以後 可以從共享類緩存中加載類,以便減少任何加載時間損失。如圖4B所示,在運行時,系統在步驟410中加載經過修改的代碼,然後在步驟420 中確定是否發生了需要額外信息的事件,例如故障或反射處理。如果沒有的話,該處理400 結束。如果有的話,那麼在步驟430,系統使用鍵值來定位存儲位置中的期望額外信息,並且 在步驟440中加載該信息。然後,內存優化處理結束,並且系統可以使用取回的額外信息來 執行任何期望的操作。所定位和加載的額外信息可以是一種或多種額外信息,例如先前描 述的調試信息、注釋信息以及源信息。系統可以只加載特定目的所需要的額外信息,舉例來 說,如果系統正在創建堆棧跟蹤,那麼它可以定位並只加載填充堆棧跟蹤所需要的調試信 息,或者如果系統使用了反射,那麼它可以定位並只加載執行反射所需要的源信息。
圖5-7描述的是本發明第二實施例的不同方面。在該實施例中,代碼是通過從可 執行代碼中分離出額外信息以及丟棄額外信息而被劃分的。如果需要的話,可以從初始代 碼加載額外信息。在保持用於調試以及為欄位中的代碼提供服務所必需的其他處理的額外 信息的可訪問性的同時,通過減少內存足跡,該方案優化了內存使用率。圖5示出的是根據本發明第二實施例可以由圖1系統執行的例示劃分和內存優化 處理。在該處理中,諸如Java類文件或CIL代碼文件之類的代碼30由虛擬機20中的定製 類加載器21接收,在虛擬機20中,所述代碼30中的額外信息被標識。該額外信息是不可 執行的信息,例如調試信息、注釋信息或源信息。代碼30是通過移除額外信息來產生經過 修改的代碼35而被修改的,並且在經過修改的代碼35中插入用於標識初始代碼30的位置 的唯一標識鍵值。在運行時,經過修改的代碼35被正常加載到虛擬機20中。如果在運行時需要額外 信息,則系統可以定位並且僅加載特定任務所需要的恰當類型的額外信息。舉例來說,如果 發生故障,那麼異常處理進程22和差錯報告機制23會請求調試信息,以便拋出異常並報告 差錯,但其不需要注釋信息和源信息。異常處理進程22和差錯報告機制23使用鍵值來找 出存儲初始代碼30的存儲位置,並且從文件中加載調試信息,由此可以填充堆棧跟蹤。同 樣,如果代碼使用了反射,那麼反射進程可以請求源信息,但是不會請求調試信息。如果初 始代碼是從伺服器產生或下載的,而不是在本地存在的,那麼可以再次產生或下載所述初 始代碼。現在參考圖6,該圖顯示的是具有10個基本分量的例示Java類文件30 幻數201、 版本202、常量池203、訪問標記204、本類205、超類206、接口 207、欄位208、方法209以及 屬性210。屬性可以包括調試信息221、注釋信息222以及源信息223。例示的Java類文件 30是通過從程序指令中劃分出額外信息以及將其丟棄在回收站80或是所收集的無用信息 中而被修改的,在本範例中,所述額外信息是調試信息221、注釋信息222以及源信息223。 在經過修改的Java類文件35中,額外信息被鍵值2M取代,該鍵值標識的是存儲原始代碼 30或者可從例如通過下載其取回原始代碼30的位置。現在轉到圖7A和7B,該圖概括性顯示了第二實施例的劃分和內存優化處理的處 理500和600。處理500可以在運行時之外的時間執行,或者可以由系統在運行時(例如在 加載類的時候)執行。處理600通常是在運行時執行的。以圖1的系統為例,在處理500 中,該系統在步驟510加載初始代碼,例如類加載器加載的代碼,並且在步驟520中標識代 碼中的額外信息。在步驟530,系統從代碼中移除額外信息,並且在步驟MO中將一個鍵值 插入所述代碼,以便引用存儲了包含額外信息的初始代碼或者可供取回所述代碼的位置。 在例如IBM J9系統的系統中,該處理可以由某種工具來執行,例如Java優化器(JAPT)類 操作工具,或者在運行時,它可以由運行時J9系統作為擴展加載處理的一部分來執行。在 由運行時系統執行時,經過修改的代碼代表的是保存在虛擬機內部並且可選地保存在緩存 內部的代碼。在可選步驟550,系統改寫所述代碼,以使其間接而不是直接地訪問額外信息, 舉例來說,通過修改多個程序指令中的一個或多個,可以攔截異常處理進程,並且可以使 用鍵值將其重定向到存儲的代碼。該步驟是可選的,這是因為所述進程也可以採用其 他方式來執行,例如修改類庫來變更本地函數的操作,以便透明地從所存儲的代碼加載客頁夕卜信息,例如 Throwable. getStackTrace 、Class. getDecIaredAnnotations O 以及 Class. getGenericInterfaces 。舉個例子,對於堆棧跟蹤來說,通過修改類庫,可以在 StackTraceElement中存儲程序計數器。該程序計數器是標引發生了 StackTraceElement 所代表的方法調用的字節碼指令的索引,並且其被用於找到行號調試信息結構中的行號。 在可選步驟560中,經過修改的代碼可以被存入緩衝存儲器,例如共享類緩存,由此以後可 以從共享類緩存中加載所述類,以便減小加載時間損失。如圖7B所示,在運行時,系統在步驟610中加載經過修改的代碼,然後在步驟620 中確定是否發生了需要額外信息的事件,例如故障或反射處理。如果沒有的話,該處理600 結束。如果有的話,那麼在步驟630,系統使用鍵值來定位存儲初始代碼或從其可以取回初 始代碼的位置中的期望額外信息,並且在步驟640中加載該信息。然後,內存優化處理結 束,並且系統可以使用取回的額外信息來執行任何期望的操作。所定位和加載的額外信息 可以是一種或多種額外信息,例如先前描述的調試信息、注釋信息以及源信息。系統可以只 加載特定目的所需要的額外信息,舉例來說,如果系統正在創建堆棧跟蹤,那麼它可以定位 並只加載填充堆棧跟蹤所需要的調試信息,或者如果系統使用了反射,那麼它可以定位並 只加載執行反射所需要的源信息。本領域技術人員應該理解,本發明的這些方面可以作為系統、方法或電腦程式 產品來實現。相應地,本發明的這些方面可以採用全硬體實施例的形式、全軟體實施例的形 式(包括固件、駐留軟體、微代碼等等)或是組合了軟體和硬體方面的實施例來實現,所有 這些在這裡可以統稱為「電路」、「模塊」或「系統」。此外,本發明的這些方面可以採用在包 含了計算機可讀程序代碼的一個或多個計算機可讀介質上實現的電腦程式產品的形式。可以使用一種或多種計算機可讀介質的任何組合。計算機可讀介質可以是計算機 可讀信號介質或計算機可讀存儲介質。舉例來說,計算機可讀介質可以是電子、磁性、光學、 電磁、紅外或半導體系統、裝置或設備,亦或是前述各項的任何組合,但其並不局限於此。計 算機可讀存儲介質的更具體的示例(非窮舉列表)包括下列各項具有一條或多條線路的 電連接,可攜式計算機碟片,硬碟,隨機存取存儲器(RAM),只讀存儲器(ROM),可擦寫可編 程只讀存儲器(EPR0M或快閃記憶體),光纖,可攜式緊湊型只讀存儲器(CD-ROM),光學存儲設備, 磁性存儲設備,或是前述各項的任何適當組合。在本文檔的語境中,計算機可讀存儲介質可 以是任何包含或存儲了可供指令執行系統、裝置或設備使用或與之結合使用的程序的有形 介質。計算機可讀信號介質可以包括那些包含了計算機可讀程序代碼的傳播數據信號, 其中舉例來說,所述信號可以處於基帶或者作為載波的一部分。這種傳播信號可以採用多 種形式中的任何一種,包括但不局限於電磁信號、光信號或是其任何適當的組合。計算機可 讀信號介質可以是並非計算機可讀存儲介質但卻可以傳遞、傳播或傳送供指令執行系統、 裝置或設備使用或與之結合的程序的任何計算機可讀介質。包含在計算機可讀介質上的程 序代碼可以使用任何恰當的介質來傳送,包括但不局限於無線、有線、光纜、RF等等,或是前 述各項的任何組合。用於執行本發明的各個方面的操作的電腦程式代碼可以用一種或多種編程語 言的任何組合來編寫,包括面向對象的程式語言,例如Java、Smalltalk、C++等等,以及常 規程式語言,例如「C」程式語言或類似的程式語言。程序代碼既可以完全在用戶計算機上運行,也可以部分在用戶計算機上運行,還可以作為獨立軟體包而部分在用戶計算機以及 部分在遠程計算機上運行,或者完全在遠程計算機或伺服器上運行。在後一種情況中,遠程 計算機可以通過包括區域網(LAN)或廣域網(WAN)在內的任何類型的網絡與用戶計算機相 連,或者可以(例如通過使用網際網路服務供應商的網際網路)與外部計算機相連。應該理解,用於本發明實施例的計算機系統的軟體可以用任何期望的計算機語言 實施,並且可以由計算機領域的普通技術人員根據說明書中包含的功能性描述以及附圖中 示出的流程圖來開發。作為示例,該軟體可以用c#、C++、Python、Java或PHP程式語言來 實現。更進一步,這裡關於執行各種功能的軟體的任何引用主要是指在軟體控制下執行這 些功能的計算機系統或處理器。作為替換,本發明實施例的計算機系統可以用任何類型的硬體和/或其他處理電 路來實現。計算機系統的不同功能可以採用任何方式分布在任何數量的軟體模塊或單元、 處理或計算機系統和/或電路中,其中計算機或處理系統既可以採用處於彼此本地的方 式部署,或者採用彼此遠離的方式部署,並且是可以藉助任何適當的通信介質通信(例如 LAN、WAN、內部網、網際網路、硬體、數據機連接、無線等等)的。本發明的這些方面是參考根據本發明實施例的流程圖例證和/或方法、裝置(系 統)以及電腦程式產品的框圖來描述的。應該理解流程圖例證和/或框圖中的每一個方 框以及流程圖例證和/或框圖中的方框的任何組合都可以由電腦程式指令來實施。這些 電腦程式指令可以被提供給通用計算機、專用計算機或其他可編程數據處理設備的處理 器,以產生一機器,使得藉助計算機或其他可編程數據處理設備的處理器運行的指令創建 用於實施流程圖和/或框圖的一個或多個方框中規定的功能/操作的手段。這些電腦程式產品還可以保存在計算機可讀介質中,其中所述介質可以指導計 算機、其他可編程數據處理裝置或其他設備以特定的方式運作,以使保存在計算機可讀介 質中的指令產生包含指令的製品,其中該指令實施的是流程圖和/或框圖的一個或多個方 框中規定的功能/操作。電腦程式指令還可以加載到計算機、其他可編程數據處理裝置 或其他設備中,以便在計算機、其他可編程裝置或其他設備上執行一系列操作步驟,從而產 生計算機實施的處理,由此,在計算機或其他可編程裝置上運行的指令提供用於實施流程 圖和/或框圖的一個或多個方框中規定的功能/操作。適合存儲和/或執行程序代碼的處理系統可以由任何常規或其他計算機或處理 系統來實施,其中所述系統優選地配備了顯示器或監視器,基礎(例如包括處理器、內存和 /或內部或外部通信設備(例如數據機、網卡等等)以及可選輸入設備(例如鍵盤、鼠 標或其他輸入設備))。該系統可以包括通過系統總線直接或間接耦合到內存部件的至少一 個處理器。內存部件可以包括在實際執行程序代碼的過程中使用的本地存儲器,大容量存 儲器,以及通過為至少某個程序代碼提供臨時存儲來減少運行過程中必須從大容量存儲器 中取回代碼的次數的緩存存儲器。輸入/輸出或I/O設備(包括但不局限於鍵盤、顯示器、 指示設備等等)既可以直接耦合到系統,也可以通過居間的I/O控制器而被間接地耦合到 系統。網絡適配器還可以耦合到系統,以使系統能夠通過居間的私有或公共網絡而被耦合 到其他處理系統、或遠端印表機或存儲設備。數據機、電纜數據機和乙太網卡僅僅 是當前可用的網絡適配器中的少量適配器。附圖中的流程圖和框圖示出了根據本發明不同實施例的系統、方法和電腦程式
10產品的可行實施方式的架構、功能和操作。就此而論,流程圖或框圖中的每一個方框都可以 代表一個模塊、分段或代碼部分,包含用於實施一個或多個指定的邏輯功能的一個或多個 可執行指令。此外還應該指出,在一些替換的實施方式中,方框中標註的功能有可能不是按 照附圖給出的順序發生的。例如,連續顯示的兩個方框實際有可能是以基本同時的方式運 行的,或者這些方框有時可以按照相反的順序運行,這一點取決於所涉及的功能。應該指出 的是,框圖和/或流程圖例證中的每一個方框以及方框和/或流程圖例證中的方框的組合 可以由執行規定的功能或操作的基於硬體的專用系統實施,或者由專用硬體和計算機指令 的組合來實施。這裡使用的術語旨在描述特定的實施例,而不是對本發明加以限制。除非在上下 文中以別的方式清楚規定,否則這裡使用的單數形式「一」、「一個」、「該」也包含了複數的形 式。此外還應該理解,本說明書中使用的術語「包括」和/或「包含」規定的是存在所陳述的 特徵、整體、步驟、操作、部件和/或組件,但是並不排除一個或多個特徵、整體、步驟、操作、 部件、組件和/或其群組的存在或添加。下列權利要求中的相應結構、材料、操作以及所有裝置或步驟加功能部件的等同 物旨在包含與特別要求保護的其他要求保護的部件相結合來執行功能的任何結構、材料或 操作。本發明的描述是出於例證和描述目的給出的,但是並不僅限於所公開的發明形式。對 本領域技術人員來說,在沒有脫離本發明的範圍和精神的情況下,很多的修改和變更都是 顯而易見的。選擇和描述這些實施例是為了最好地說明本發明的原理以及實際應用,並使 本領域的其他普通技術人員能夠理解具有與所設想的特定用途相適合的不同修改方式的 本發明的不同實施例。
1權利要求
1.一種用於優化虛擬機或解釋代碼的方法,包括接收包含多個程序指令以及第一額外信息的代碼,其中所述代碼用供虛擬機運行的語 言編寫,並且其中所述第一額外信息是第一類型的不可執行信息;通過移除所述第一額外信息以及將其替換成引用所述第一額外信息的位置的鍵值來 修改所述代碼;以及執行經過修改的代碼,並且如果在運行過程中發生請求所述第一額外信息的事件,則 響應於所述事件使用所述鍵值來定位處於所述位置的第一額外信息,並且從所述位置加載 所述第一額外信息。
2.根據權利要求1所述的方法,其中所述事件是故障,並且所述第一類型的不可執行 信息是調試信息。
3.根據權利要求2所述的方法,還包括修改所述多個程序指令中的一個或多個,以便攔截異常處理進程,並且使用鍵值將所 述異常處理進程重定向到所述第一額外信息的位置。
4.根據權利要求1所述的方法,其中所述代碼包括第二額外信息,並且其中所述第二 額外信息是第二類型的不可執行信息,以及第一和第二類型的不可執行信息是不同的。
5.根據權利要求4所述的方法,其中第二類型的不可執行信息是源信息或注釋信息。
6.根據權利要求1所述的方法,其中所述代碼是Java類文件或Java歸檔(JAR)文件, 以及所述多個程序指令是Java字節碼指令。
7.根據權利要求1所述的方法,其中所述代碼是.NET代碼文件,並且所述多個程序指 令是公用中間語言(CIL)字節碼指令。
8.根據權利要求1所述的方法,其中所述語言是解釋語言。
9.根據權利要求1所述的方法,其中所述位置是存儲位置,並且所述方法還包括將移除的第一額外信息保存在所述存儲位置中。
10.根據權利要求1所述的方法,其中所述位置是保存代碼的存儲位置,並且其中所述 加載包括從所述存儲位置加載代碼。
11.根據權利要求1所述的方法,其中所述位置是可以取回所述代碼的位置,並且其中 所述加載包括從所述位置取回代碼。
12.—種系統,包括處理器,其被配置成具有用於執行如下處理的邏輯在虛擬機環境中加載包含多個程序指令以及第一額外信息的代碼,其中所述代碼用供 虛擬機運行的語言編寫,並且其中所述第一額外信息是第一類型的不可執行信息;通過移除所述第一額外信息以及將其替換成引用所述第一額外信息的位置的鍵值來 修改所述代碼;以及執行經過修改的代碼,並且如果在運行過程中發生請求所述第一額外信息的事件,則 響應於所述事件,使用所述鍵值來定位處於所述位置的第一額外信息,並且從所述位置加 載所述第一額外信息。
13.根據權利要求12所述的系統,其中所述事件是故障,並且所述第一類型的不可執 行信息是調試信息,以及其中所述處理器還被配置成具有執行下列處理的邏輯修改所述多個程序指令中的一個或多個,以便攔截異常處理進程,並且使用鍵值將所述異常處理進程重定向到所述第一額外信息的位置。
14.根據權利要求12所述的系統,其中所述位置是存儲位置,並且其中所述處理器還 被配置成具有執行下列處理的邏輯將移除的第一額外信息保存在所述存儲位置中。
15.根據權利要求12所述的系統,其中所述位置是保存代碼或者從其可以取回所述代 碼的位置,並且其中所述加載包括從所述位置加載包含所述第一額外信息的代碼。
16.根據權利要求12所述的系統,其中所述虛擬機是公用語言運行時(CLR)虛擬機或 Java 虛擬機(JVM)。
全文摘要
本發明涉及一種通過從可執行的虛擬機代碼或解釋代碼中劃分出額外信息來優化內存的方法、電腦程式產品和系統。該額外信息可以單獨保存,或者可以在需要時從初始代碼中訪問,以便調試或服務於欄位中的代碼。在保持用於調試以及為欄位中的代碼提供服務所必需的處理的額外信息的可訪問性的同時,通過減少內存足跡,該方法優化了內存使用率。
文檔編號G06F9/455GK102081546SQ201010543228
公開日2011年6月1日 申請日期2010年11月15日 優先權日2009年11月30日
發明者A·R·勞, C·E·赫利斯丘克, H·W·亞當斯三世, P·D·希普頓, S·C·弗利 申請人:國際商業機器公司