亚洲成年人黄色一级片,日本香港三级亚洲三级,黄色成人小视频,国产青草视频,国产一区二区久久精品,91在线免费公开视频,成年轻人网站色直接看

在運行時系統(tǒng)中共享對象的制作方法

文檔序號:6656506閱讀:146來源:國知局

專利名稱::在運行時系統(tǒng)中共享對象的制作方法
技術領域
:本申請涉及數(shù)據(jù)處理。
背景技術
:某些服務器,例如企業(yè)服務器或者其他的大型服務器,一般可以被刻畫為請求處理引擎,因為它們處理大量通常較小的用戶請求,這些用戶請求屬于用戶會話。處理請求通常涉及在服務器上執(zhí)行的運行時系統(tǒng)(例如Java虛擬機)中運行用戶代碼(例如Java服務器小程序(servlet)或企業(yè)JavaBean)。在這種服務器中的可擴展性(scalability)傳統(tǒng)上是通過使用線程來實現(xiàn)的——例如使用多線程虛擬機(virtualmachine,VM)來處理相應于許多個用戶會話的請求。但是系統(tǒng)魯棒性要求用戶會話之間有很強的隔離,當大量用戶會話運行于單個VM中時,這可能很難實現(xiàn)。操作系統(tǒng)能夠為進程提供近乎完美的隔離。在某些操作系統(tǒng)中,崩潰的進程(crashedprocess)將不會影響其他的進程,并且將不泄漏或遺留被分配的資源。在概念上,有可能通過為每一個用戶會話分配一個操作系統(tǒng)(OS)進程并在所分配的進程內為該用戶會話運行VM來隔離用戶會話,并從而提高服務器的魯棒性。但是,在某些情形下(例如在存在大量用戶會話的情形下),由于在相應大量的進程之間切換將導致的OS調度開銷以及由于這種方法將消耗的資源所致,這種方法可能并不實用。OS進程一般未被設計成像用戶會話那樣細致地對實體建模。
發(fā)明內容本發(fā)明提供了方法和裝置,包括計算機程序產品,它們實施了用于共享數(shù)據(jù)并在用戶會話之間提供隔離的技術。在一個總體方面,這些技術的特征是一種計算機程序產品,所述計算機程序產品可運行,以便使得數(shù)據(jù)處理裝置接收第一數(shù)據(jù)對象的標識,該第一數(shù)據(jù)對象是第一運行時類的實例;確定所述第一運行時類是否可共享;以及,確定所述第一數(shù)據(jù)對象是否引用一個或更多個被引用的數(shù)據(jù)對象。如果所述第一數(shù)據(jù)對象確實引用了一個或更多個被引用的數(shù)據(jù)對象,則所述計算機程序產品還可運行,以便使得所述數(shù)據(jù)處理裝置遍歷所述一個或更多個被引用的數(shù)據(jù)對象,并且針對每一個被遍歷的數(shù)據(jù)對象,確定所述被遍歷的數(shù)據(jù)對象是其實例的運行時類是否可共享。有益的實施方案可能包括下列特征中的一個或更多個。遍歷所述一個或更多個被引用的數(shù)據(jù)對象可以包括遞歸地遍歷所述一個或更多個被引用的數(shù)據(jù)對象的傳遞閉包(transitiveclosure)中的每一個數(shù)據(jù)對象。如果所述第一運行時類可共享,并且每一個被遍歷的數(shù)據(jù)對象的運行時類均可共享,則所述第一數(shù)據(jù)對象和每一個被遍歷的數(shù)據(jù)對象均能夠被分組到一個對象組中,并且所述對象組可以被復制到共享存儲器區(qū)域中。如果第一運行時類不可共享,或者如果至少一個被遍歷的數(shù)據(jù)對象的運行時類不可共享,則可以產生否定狀態(tài)指示。確定所述第一運行時類是否可共享可以包括確定所述第一運行時類先前是否已被聲明為可共享。所述第一運行時類可以從一個或更多個基類被派生,并且可以包括一個或更多個域。確定所述第一運行時類是否可共享可以包括確定所述第一運行時類是否實施了串行化接口;確定在所述第一運行時類的對象實例的串行化或者解串行化期間是否執(zhí)行了定制代碼(customcode);確定是否所有基類都是可串行化的;確定是否所有域都被串行化;以及,確定第一運行時類的對象實例是否影響垃圾回收。所述第一運行時類可以是Java類,并且串行化接口可以是java.io.Serializable。確定是否執(zhí)行了定制代碼可以包括確定第一運行時類是否包括預先確定的方法集合中的一種方法。預先確定的方法集合可以包括readObject()、wirteObject()、readExternal()、writeExternal()、readResolve()和writeReplace()方法。確定是否所有基類都可串行化可以包括確定基類中的每一個類是否均實施了串行化接口,并且,如果基類中的類未實施串行化接口,則確定該類是否包括平凡缺省構造器(trivialdefaultconstructor)。確定是否所有域都被串行化可以包括確定是否任一個域均為瞬態(tài)域。確定所有域是否都被串行化還可以包括確定是否任一個域均是serialPersisitentFields域。確定第一運行時類的對象實例是否影響垃圾回收可以包括確定第一運行時類是否包含平凡終結器(trivialfinalizer)。在第一運行時類是Java類的情況下,確定第一運行時類的對象實例是否影響垃圾回收還可以包括確定第一運行時類是否被從java.lang.ref.Reference類派生。確定第一運行時類是否可共享還可以包括確定第一運行時類的運行時表示是否可共享,和確定第一運行時類的類加載器是否可共享。確定第一運行時類的運行時表示是否可共享可以包括確定所述運行時表示是否被存儲在第一預先確定的位置。確定第一運行時類的類加載器是否可共享可以包括確定所述類加載器是否被存儲在第二預先確定的位置。在另一個方面,這些技術的特征是一種計算機程序產品,所述計算機程序產品可運行,以便使得數(shù)據(jù)處理裝置接收第一運行時系統(tǒng)中的第一數(shù)據(jù)對象的標識,所述第一數(shù)據(jù)對象引用零個或更多個被引用的數(shù)據(jù)對象;標識由第一數(shù)據(jù)對象和被引用的數(shù)據(jù)對象的傳遞閉包組成的數(shù)據(jù)對象共享閉包;以及,確定數(shù)據(jù)對象的所述共享閉包是否可在第二運行時系統(tǒng)中使用。有益的實施方案可以包括下列特征中的一個或更多個。第一和第二運行時系統(tǒng)可以是虛擬機,包括Java虛擬機或者公共語言運行時虛擬機。數(shù)據(jù)對象的共享閉包可以包括用戶上下文信息。確定共享閉包是否可在第二運行時系統(tǒng)中使用可以包括確定數(shù)據(jù)對象的共享閉包中的每一個數(shù)據(jù)對象是否均是無需執(zhí)行定制代碼就可串行化的。確定共享閉包是否可在第二運行時系統(tǒng)中使用可以包括確定所述共享閉包中的每一個數(shù)據(jù)對象的運行時類是否是可共享的。每一個數(shù)據(jù)對象均是其實例的運行時類可以被從一個或更多個基類派生,并且可以具有一個或更多個域,并且確定運行時類是否可共享可以包括確定所述運行時類是否實施了串行化接口;確定在所述運行時類的對象實例的串行化或者解串行化期間是否執(zhí)行了定制代碼;確定是否所有基類都是可串行化的;確定是否所有域都被串行化;以及,確定所述運行時類的對象實例是否影響垃圾回收。如果數(shù)據(jù)對象的共享閉包不可在第二運行時系統(tǒng)中使用,則可以產生否定狀態(tài)指示。數(shù)據(jù)對象的共享閉包可以被復制到共享存儲器區(qū)域。所述計算機程序產品還可運行,以便使得數(shù)據(jù)處理裝置確定在共享存儲器區(qū)域中是否存在數(shù)據(jù)對象的共享閉包的先前版本,并將版本號和數(shù)據(jù)對象的共享閉包相關聯(lián)。在又一個方面,這些技術的特征是一種計算機程序產品,所述計算機程序產品可運行,以便使得數(shù)據(jù)處理裝置接收標識符、標識與所述標識符相關聯(lián)的共享閉包、以及將所述共享閉包與運行時系統(tǒng)相關聯(lián)。所述共享閉包被置于共享存儲器區(qū)域中,并由第一數(shù)據(jù)對象和被所述第一數(shù)據(jù)對象引用的數(shù)據(jù)對象的傳遞閉包組成。有益的實施方案可以包括下列特征中的一個或更多個。所述運行時系統(tǒng)可以是Java虛擬機或者公共語言運行時虛擬機。標識共享閉包可以包括標識所述共享閉包的當前版本。通過將所述共享閉包映射或者復制到與所述運行時系統(tǒng)相關聯(lián)的地址空間,可以將所述共享閉包與所述運行時系統(tǒng)相關聯(lián)。在所述共享閉包被映射到和所述運行時系統(tǒng)相關聯(lián)的地址空間中的情況下,將所述共享閉包與所述運行時系統(tǒng)相關聯(lián)還可以包括防止對所述共享閉包的寫訪問,或者,在檢測到對所述共享閉包中的數(shù)據(jù)對象的第一次寫訪問時,將所述共享閉包復制到與所述運行時系統(tǒng)相關聯(lián)的地址空間中。共享閉包可以被標記為已刪除。將共享閉包標記為已刪除可以包括防止將所述共享閉包與額外的運行時系統(tǒng)相關聯(lián)。在又一個方面,這些技術的特征是一種計算機程序產品,所述計算機程序產品可運行,以便使得數(shù)據(jù)處理裝置標識數(shù)據(jù)對象的集合,所述數(shù)據(jù)對象的集合中的每一個數(shù)據(jù)對象均具有對關于第一運行時系統(tǒng)中的數(shù)據(jù)對象的運行時元數(shù)據(jù)的引用。所述計算機程序產品還可運行,以便使得所述數(shù)據(jù)處理裝置在每一個數(shù)據(jù)對象中用代理來代替對運行時數(shù)據(jù)的引用;以及,將所述數(shù)據(jù)對象集合發(fā)送到第二運行時系統(tǒng)。有益的實施方案可以包括下列特征中的一個或更多個。對于所述數(shù)據(jù)對象集合中的每一個數(shù)據(jù)對象,對關于數(shù)據(jù)對象的運行時元數(shù)據(jù)的引用可以包括對所述數(shù)據(jù)對象是其實例的類的運行時表示的引用。所述第一運行時系統(tǒng)可以包括第一虛擬機,并且所述第二運行時系統(tǒng)可以包括第二虛擬機。第一和第二虛擬機可以是Java虛擬機或者公共語言運行時虛擬機。第一運行時系統(tǒng)可以被置于第一物理機器上,并且第二運行時系統(tǒng)可以被置于不同的第二物理機器上。標識數(shù)據(jù)對象的集合可以包括標識一個或更多個被引用數(shù)據(jù)對象的傳遞閉包,其中每一個被引用的數(shù)據(jù)對象均是被第一數(shù)據(jù)對象引用的對象。在又一個方面,這些技術的特征是一種計算機程序產品,所述計算機程序產品可運行,以便使得數(shù)據(jù)處理裝置從第一運行時系統(tǒng)接收數(shù)據(jù)對象的集合,其中所述數(shù)據(jù)對象的集合中的每一個數(shù)據(jù)對象均包含代理;將所述數(shù)據(jù)對象的集合復制到第二運行時系統(tǒng)中;以及,對于所述數(shù)據(jù)對象的集合中的每一個數(shù)據(jù)對象,標識關于所述數(shù)據(jù)對象的運行時元數(shù)據(jù)并利用對關于所述數(shù)據(jù)對象的運行時元數(shù)據(jù)的引用來代替所述數(shù)據(jù)對象中的代理。有益的實施方案可以包括下列特征中的一個或更多個。所述計算機程序產品還可以運行,以便確定在第二運行時系統(tǒng)中是否可獲得關于每一個數(shù)據(jù)對象的運行時元數(shù)據(jù);以及,如果在第二運行時系統(tǒng)中不可獲得運行時元數(shù)據(jù),則將關于每一個數(shù)據(jù)對象的運行時元數(shù)據(jù)安裝在第二運行時系統(tǒng)中。對于每一個數(shù)據(jù)對象,對關于數(shù)據(jù)對象的運行時元數(shù)據(jù)的引用可以包括對數(shù)據(jù)對象是其實例的類的運行時表示的引用。所述計算機程序產品還可運行,以便確定在第二運行時系統(tǒng)中是否可獲得每一個對象實例的類的運行時表示;以及,如果在第二運行時系統(tǒng)中不可獲得所述運行時表示,則將每一個對象實例的類的運行時表示安裝在第二運行時系統(tǒng)中。第一運行時系統(tǒng)可以包括第一虛擬機,并且所述第二運行時系統(tǒng)可以包括第二虛擬機。第一和第二虛擬機可以是Java虛擬機或者公共語言運行時虛擬機。第一運行時系統(tǒng)可以被置于第一物理機器上,并且第二運行時系統(tǒng)可以被置于不同的第二物理機器上。所述數(shù)據(jù)對象的集合由第一數(shù)據(jù)對象和一個或更多個被引用的數(shù)據(jù)對象的傳遞閉包組成,其中,每一個被引用的數(shù)據(jù)對象均是被第一數(shù)據(jù)對象引用的對象。標識運行時元數(shù)據(jù)以及代替數(shù)據(jù)對象的集合中的每一個數(shù)據(jù)對象中的代理的操作大致可以在接收到數(shù)據(jù)對象集合之后立刻發(fā)生?;蛘?,當在第二運行時系統(tǒng)中訪問每一個數(shù)據(jù)對象時,可以發(fā)生那些操作。在又一個方面,這些技術的特征是一種計算機程序產品,所述計算機程序產品可運行,以便使得數(shù)據(jù)處理裝置為用戶會話初始化運行時系統(tǒng);在共享存儲器區(qū)域中創(chuàng)建數(shù)據(jù)對象的共享閉包;接收相應于用戶會話的請求;從操作系統(tǒng)進程的集合中選擇第一進程;將所述運行時系統(tǒng)綁定到第一進程;以及,將數(shù)據(jù)對象的共享閉包與所述運行時系統(tǒng)相關聯(lián)。所述數(shù)據(jù)對象的共享閉包由第一數(shù)據(jù)對象和一個或更多個被引用的數(shù)據(jù)對象的傳遞閉包組成,每一個被引用的數(shù)據(jù)對象均被第一數(shù)據(jù)對象引用。有益的實施方案可以包括下列特征中的一個或更多個。運行時系統(tǒng)可以包括虛擬機。所述虛擬機可以是Java虛擬機或者公共語言運行時虛擬機。數(shù)據(jù)對象的共享閉包可以包括相應于用戶會話的用戶上下文信息。將共享閉包與運行時系統(tǒng)相關聯(lián)可以包括將所述共享閉包綁定到第一進程。將共享閉包綁定到第一進程可以包括將所述共享閉包映射或者復制到第一進程的地址空間。如果所述共享閉包被映射到第一進程的地址空間中,則綁定所述共享閉包還可以包括防止對所述共享閉包的寫訪問,或者,在檢測到對共享閉包中的數(shù)據(jù)對象之一的第一次寫訪問時,將所述共享閉包復制到第一進程的地址空間中。所述計算機程序產品還可以運行,以便使得所述數(shù)據(jù)處理裝置為第二用戶會話初始化第二運行時系統(tǒng);接收相應于第二用戶會話的第二請求;從操作系統(tǒng)進程的集合中選擇第二進程;將所述第二運行時系統(tǒng)綁定到第二進程;以及,將數(shù)據(jù)對象的共享閉包與所述第二運行時系統(tǒng)相關聯(lián)。在又一個方面中,這些技術的特征是一種計算機程序產品,所述計算機程序產品可運行,以便使得數(shù)據(jù)處理裝置在共享存儲器區(qū)域中存儲相應于用戶會話的用戶上下文;接收相應于用戶會話的請求;從操作系統(tǒng)進程的集合中選擇具有地址空間的進程;從運行時系統(tǒng)的集合中選擇運行時系統(tǒng);將所述運行時系統(tǒng)綁定到所述進程;以及,將所述用戶上下文與所述運行時系統(tǒng)相關聯(lián)。有益的實施方案可以包括下列特征中的一個或更多個。運行時系統(tǒng)的集合中的每一個運行時系統(tǒng)均可以包括虛擬機。虛擬機可以是Java虛擬機或者公共語言運行時虛擬機。用戶上下文可以包括由第一數(shù)據(jù)對象和被第一數(shù)據(jù)對象引用的數(shù)據(jù)對象的傳遞閉包組成的共享閉包。運行時系統(tǒng)可以被存儲在共享存儲器區(qū)域中,并且將所述運行時系統(tǒng)綁定到所述進程可以包括將相應于所述運行時系統(tǒng)的共享存儲器區(qū)域部分映射到所述進程的地址空間中。將用戶上下文與所述運行時系統(tǒng)相關聯(lián)可以包括將用戶上下文綁定到所述進程。將所述用戶上下文綁定到所述進程可以包括將用戶上下文映射或者復制到所述進程的地址空間中。如果用戶上下文被映射到所述進程地址空間中,則綁定所述用戶上下文還可以包括在檢測到對所述用戶上下文的第一次寫訪問時將所述用戶上下文復制到所述進程的地址空間中。所述計算機程序產品還可以運行,以便使得數(shù)據(jù)處理裝置將所述用戶上下文從所述進程解除綁定。將所述用戶上下文從所述進程解除綁定可以包括將所述用戶上下文復制到共享存儲器區(qū)域。將所述用戶上下文從所述進程解除綁定還可以包括確定在共享存儲器區(qū)域中是否存在先前版本的所述用戶上下文;以及,如果先前版本的所述用戶上下文不存在,則在共享存儲器區(qū)域中創(chuàng)建新版本的所述用戶上下文。在檢測到所述進程被阻塞時,運行時系統(tǒng)和用戶上下文都可以被從所述進程解除綁定。檢測所述進程被阻塞可以包括檢測所述進程正在等待輸入/輸出(I/O)事件完成。在檢測到I/O事件已經完成時,可以從操作系統(tǒng)進程的集合中選擇可用的進程,并且可以將運行時系統(tǒng)和用戶上下文綁定到所述可用的進程。所述計算機程序產品還可以運行,以便使得所述數(shù)據(jù)處理裝置將所述運行時系統(tǒng)從所述進程解除綁定。操作系統(tǒng)進程的集合可以被跨越兩個或更多個物理機器分布,并且所述進程可以在來自所述兩個或更多個物理機器的第一機器上執(zhí)行。用戶上下文可以包括具有代理的第一數(shù)據(jù)對象。將用戶上下文與運行時系統(tǒng)相關聯(lián)可以包括用對關于第一數(shù)據(jù)對象的運行時元數(shù)據(jù)的引用代替所述代理,所述運行時元數(shù)據(jù)被存儲在第一機器上。在又一個方面,這些技術的特征是一種計算機服務器,所述計算機服務器具有進程集合、運行時系統(tǒng)的集合、用于存儲多個用戶上下文的共享存儲器區(qū)域,以及分派器(dispatcher)部件。所述分派器部件可運行,以便接收相應于所述多個用戶上下文中的一個用戶上下文的請求;從所述進程的集合中選擇可用的進程;從所述運行時系統(tǒng)的集合中選擇可用的運行時系統(tǒng);以及,將所述用戶上下文和可用的運行時系統(tǒng)的標識傳送到所述可用的進程,用于處理所述請求。有益的實施方案可以包括下列特征中的一個或更多個。所述運行時系統(tǒng)的集合中的每一個運行時系統(tǒng)均可以包括虛擬機。所述虛擬機可以是Java虛擬機或者公共語言運行時虛擬機??梢詫⑺鲞M程集合中的進程數(shù)量設置成小于或者等于所述運行時系統(tǒng)中的運行時系統(tǒng)數(shù)量。在又一個方面中,這些技術的特征是一種計算機程序產品,所述計算機程序產品可運行,以便使得數(shù)據(jù)處理裝置在進程的集合中的每一個進程中初始化運行時系統(tǒng);在共享存儲器區(qū)域中存儲相應于用戶會話的用戶上下文;接收相應于所述用戶會話的請求;從所述進程的集合中選擇進程;以及,將所述用戶上下文和所述被選擇的進程中的所述運行時系統(tǒng)相關聯(lián)以便處理所述請求。有益的實施方案可以包括下列特征中的一個或更多個。將所述用戶上下文和所述被選擇的進程中的運行時系統(tǒng)相關聯(lián)可以包括將所述用戶上下文綁定到所述被選擇的進程。每一個進程中的運行時系統(tǒng)可以包括虛擬機。所述虛擬機可以是Java虛擬機或者公共語言運行時虛擬機??梢詫嵤┻@里描述的技術來實現(xiàn)一個或更多個下列優(yōu)點。一般可以使用這些技術來分解一個運行時系統(tǒng)中的復雜數(shù)據(jù)結構,并以另一個運行時系統(tǒng)的本機格式(nativeformat)將其重裝。更具體地,可以使用這些技術來在運行時系統(tǒng)(例如VM)之間共享對象。可共享類和可共享對象實例可以被自動標識。未被自動標識為可共享的類可以被手工分析,以便確定它們是否仍是可共享的。可共享對象可以被分組成稱為共享閉包的集合,所述共享閉包可以和多個運行時系統(tǒng)相關聯(lián)??梢怨蚕矶鄠€類型的對象(例如包括構成用戶上下文的對象),并且可以創(chuàng)建和共享對象的多個版本??梢酝ㄟ^多個機制訪問被共享的對象,包括將所述被共享的對象從共享存儲器區(qū)域映射或復制到和一個或更多個運行時系統(tǒng)相關聯(lián)的地址空間中??梢韵拗茖蚕韺ο蟮脑L問,從而防止運行時系統(tǒng)以使得共享對象中的數(shù)據(jù)無效或無法在其他運行時系統(tǒng)中使用的方式將其覆蓋。還可以將共享對象標記為已刪除或垃圾回收(garbagecollected)??梢栽诓煌锢頇C器上(例如在集群架構(clusterarchitectures)中)的運行時系統(tǒng)之間共享對象。對源運行時系統(tǒng)中的運行時元數(shù)據(jù)的引用可以被用對目標運行時系統(tǒng)中的運行時元數(shù)據(jù)的引用標識和代替。運行時元數(shù)據(jù)可以被加載到目標系統(tǒng)中,并且可以主動或被動地(例如在被要求時)插入對這些運行時元數(shù)據(jù)的引用。共享對象可以降低資源消耗(例如可以使用更少的存儲器,因為對象可以由多個運行時系統(tǒng)共享)以及時間消耗(例如可以使用更少的時間,因為不必在多個運行時系統(tǒng)中創(chuàng)建或初始化被共享的對象)。還可以使用這里描述的技術在用戶會話之間以可擴展的方式提供隔離,從而使得服務器能夠穩(wěn)健地處理相應于大量用戶會話的請求。通過給每一個用戶會話分配一個VM并且將VM綁定到OS工作進程以便處理請求,可以將用戶會話隔離。工作進程的數(shù)量可以被調整,以便提高吞吐量(例如可以將工作進程的數(shù)量設置成和被分配給服務器的處理器的數(shù)量相匹配)。VM可以共享包括用戶上下文的對象,以便降低資源和時間消耗?;蛘撸皇墙o每一個用戶會話分配一個VM,而是也可以在用戶會話之間共享VM。因此,可以用固定數(shù)量的VM實施服務器。也可以用可變但是有限(例如最大)數(shù)量的VM實施服務器。在用戶會話之間共享VM可以降低每一個用戶會話的開銷,特別是在用戶上下文較小的環(huán)境中更是如此。盡管共享VM,但是通過只將一個VM和一個用戶上下文連接到每一個工作進程,并且使用被連接的VM來處理相應于被連接的用戶上下文的用戶會話的請求,仍能使用戶會話保持隔離。吞吐量仍舊可以被優(yōu)化,因為只要工作進程成為可用,用戶上下文和VM就都能夠被綁定到進程并在所述進程中執(zhí)行。為了以如上所述的隔離方式共享VM,可以將用戶上下文和VM解除關聯(lián)。用戶上下文可以被多個VM訪問或共享,例如,通過將用戶上下文存儲在可被服務器中的所有VM訪問的共享存儲器區(qū)域中。通過將VM綁定到工作進程,將相關用戶上下文和所述VM相關聯(lián),并利用相關聯(lián)的用戶上下文在所述工作進程中執(zhí)行VM,可以處理請求。通過一次只將一個VM和一個用戶上下文與進程相關聯(lián),用戶會話可以被彼此隔離,所以如果VM或者工作進程崩潰,只有相關聯(lián)的用戶會話才可能受到影響??梢允褂枚鄠€機制將用戶上下文與VM相關聯(lián),并且可以提供多個類型的對用戶上下文中的數(shù)據(jù)的訪問。通過使用低成本機制來將用戶上下文與VM相關聯(lián)(例如將用戶上下文和VM映射到進程中),以及通過將阻塞VM從其工作進程分離并使用那些工作進程來作用于其他請求,吞吐量可以被優(yōu)化。用戶上下文可以在集群架構中被共享,其中,VM跨越多個物理機器分布。可以使用分派器進程或部件以便以分布總體工作負荷或最小化跨越機器共享用戶上下文的需求的方式在VM中分布請求。即使VM被永久性地綁定到工作進程,也可以在VM之間共享用戶上下文(因此可以在用戶會話之間共享VM)。為每一個用戶會話分配單獨的VM或者以如上所述的隔離方式共享VM可以在資源消耗方面產生可計量性。盡管針對特定VM或操作系統(tǒng)進程監(jiān)視資源消耗可能是簡單易見的,但是確定在VM或進程中運行的程序的哪個部分對特定資源(例如存儲器、處理時間或用于垃圾回收的時間)的消耗負責卻可能很困難。但是,如果一次只有一個用戶上下文在VM中執(zhí)行,則可以以每用戶會話為基礎計量資源,這經常是令人期望的。本發(fā)明的一個實施方案提供了全部上述優(yōu)點。可以使用計算機程序、方法、系統(tǒng)或裝置,或者計算機程序、方法或系統(tǒng)的任意組合來實施這些一般和具體方面。在下面的描述和附圖中給出了本發(fā)明的一個或更多個實施例的細節(jié)。從這些描述、附圖和權利要求,本發(fā)明的其他特征、目的和優(yōu)點將很清晰。圖1是客戶端/服務器系統(tǒng)的框圖。圖2是圖1的客戶端/服務器系統(tǒng)中的服務器的框圖。圖3是圖2中服務器的另一個框圖。圖4是示出圖2服務器中對請求的處理的過程流程圖。圖5是示出服務器中共享對象的使用的框圖。圖6是示出用于對象實例是否可共享的過程的流程圖。圖7是示出用于確定類是否可共享的過程的流程圖。圖8和圖9是示出用于創(chuàng)建和使用共享對象的過程的流程圖。圖10是示出用于跨越多個機器共享對象的流程圖。圖11是示出用于在服務器中使用共享對象的流程圖。圖12是圖1的客戶端/服務器系統(tǒng)中的另一個服務器的框圖。圖13是圖12中的服務器的另一個框圖。圖14是示出在圖12的服務器中對請求的處理的框圖。圖15是示出在圖12的服務器中對請求的處理的過程流程圖。圖16是生成在圖1的客戶端/服務器系統(tǒng)中的另一個服務器中對請求的處理的過程流程圖。在各個附圖中相同的附圖標記和名稱指示相同的元件。具體實施例方式隔離用戶會話圖1示出了客戶端/服務器系統(tǒng)100,其中,網絡150將服務器200鏈接到客戶端系統(tǒng)102、104、106。服務器200是適于實施根據(jù)本發(fā)明的裝置、程序或方法的可編程數(shù)據(jù)處理系統(tǒng)。服務器200為處理用戶請求的一個或更多個運行時系統(tǒng)提供核心操作環(huán)境。服務器200包括處理器202和存儲器250。可以使用存儲器250存儲操作系統(tǒng)、用于在網絡150上進行通信的傳輸控制協(xié)議/互聯(lián)網協(xié)議(TCP/IP)堆棧,以及由處理器202執(zhí)行的機器可執(zhí)行指令。在一些實施方案中,服務器200可以包括多個處理器,每一個處理器均可用來執(zhí)行機器可執(zhí)行指令。存儲器250可以包括共享存儲器區(qū)域255(在后面的圖中示出),共享存儲器區(qū)域255可被在服務器200中執(zhí)行的多個操作系統(tǒng)進程訪問。可在客戶端/服務器系統(tǒng)100中使用的適當?shù)姆掌鞯睦邮荍ava2平臺企業(yè)版(J2EE)兼容服務器,例如由德國的SAPAG(SAP)開發(fā)的網絡應用服務器(WebApplicationserver)或由紐約州Armonk的IBM公司開發(fā)的網際應用服務器(WebSphereApplicationserver)??蛻舳讼到y(tǒng)102、104、106可以執(zhí)行多個應用或應用接口。應用或應用接口的每一個實例均可以構成用戶會話。每一個用戶會話均可以產生一個或更多個要被服務器200處理的請求。請求可以包括要在服務器200上的運行時系統(tǒng)(例如VM330)上執(zhí)行的指令。運行時系統(tǒng)是一種執(zhí)行用戶請求中的指令或者代碼,并為所述代碼提供運行時服務的代碼執(zhí)行環(huán)境。核心運行時服務可以包括例如進程、線程和存儲器管理(例如展示(layout)服務器存儲器250中的對象、共享對象、管理對對象的引用,以及將對象垃圾回收)的功能。增強的運行時服務可以包括例如錯誤處理和建立安全性和連接性的功能。運行時系統(tǒng)的一個例子是虛擬機。虛擬機(VM)是一種抽象的機器,它可以包括指令集、寄存器集合、堆棧、堆,以及方法區(qū)域,像是真實的機器或處理器。VM實際上擔任了程序代碼和實際處理器或硬件平臺之間的接口,所述程序代碼要在所述實際處理器或硬件平臺上執(zhí)行。所述程序代碼包括來自操縱VM的資源的VM指令集的指令。VM在該VM正在其上運行的處理器或硬件平臺上執(zhí)行指令,并操縱該處理器或硬件平臺的資源,以便實現(xiàn)所述程序代碼的指令。以這種方式,相同的程序代碼可以在多個處理器或者硬件平臺上執(zhí)行而不必針對每一個處理器或硬件平臺被重寫或重新編譯。相反,VM被針對每一個處理器或硬件平臺實施,并且相同的程序代碼可以在每一個VM中執(zhí)行。可以在由處理器或硬件平臺識別的代碼中實施VM。或者,可以在直接內置于處理器中的代碼中實施VM。例如,可以將Java源程序代碼編譯為叫做字節(jié)代碼(bytecode)的程序代碼。字節(jié)代碼可以在運行于任意處理器或平臺上的JavaVM上執(zhí)行。JavaVM可以一次一個指令地解釋所述字節(jié)代碼,或者,可以使用即時(just-in-time,JIT)編譯器針對真實的處理器或平臺進一步編譯所述字節(jié)代碼。除了JavaVM以外,VM的其他例子包括高級商業(yè)應用編程語言(AdvancedBusinessApplicationProgramming,ABAP)VM和公共語言運行時(CommonLanguageRuntime,CLR)VM。ABAP是用于為SAPR/3系統(tǒng)開發(fā)應用的編程語言,SAPR/3系統(tǒng)是一種由SAP開發(fā)的被廣泛安裝的商業(yè)應用系統(tǒng)。公共語言運行時是一種被管理的代碼執(zhí)行環(huán)境,由華盛頓州Redmond的微軟公司開發(fā)。為了簡潔的目的,本說明書中的討論集中在虛擬機上,但是要理解,這里描述的技術也可以用于其他類型的運行時系統(tǒng)。為了將用戶會話彼此隔離從而提高系統(tǒng)的魯棒性,服務器200可以被實施成為每一個用戶均提供其自己的VM。更具體地,可以為每一個用戶會話提供其自己的可連接進程虛擬機(process-attachablevirtualmachine,PAVM),可連接進程虛擬機是可以被連接到OS進程和從OS進程分離的VM。圖2示出了使用可連接進程VM(process-attachableVM)的服務器200的實施方案。可連接進程VM被實例化并被用于每一個用戶會話——例如,VM301被實例化并用于用戶會話1,并且VM303被實例化并用于用戶會話2。總的來說,如果有U個用戶會話,則服務器200將具有U個相應的VM。這在圖2中概念性地由VM309示出,VM309相應于用戶會話U。圖2中示出的服務器200的實施方案還包括用來存儲可連接進程VM的共享存儲器區(qū)域255、工作進程的進程池400,以及分派器進程410。工作進程的進程池400包含許多被分配給服務器200的操作系統(tǒng)進程——例如,工作進程401、403和409。總的來說,可以給服務器200分配P個工作進程,如在圖2中概念性地由工作進程409所示那樣。為了降低同步開銷和上下文切換(contextswitch)的數(shù)量,被分配給服務器200的操作系統(tǒng)進程數(shù)量P應該大致等于在服務器200運行于其上的計算機上可用的處理器數(shù)量。但是,即使服務器200只使用一個操作系統(tǒng)進程來處理用戶請求,也能夠獲得改善的隔離和魯棒性的益處。在操作中,當圖2中的服務器200接收到請求時,特殊的進程(分派器進程410)將所述請求分派給工作進程池400中的可用工作進程之一。假定所述請求相應于用戶會話1(用戶會話1轉而相應于VM301)并且分派器進程410將所述請求分派給工作進程401,為處理所述請求,服務器200將VM301連接或者綁定到工作進程401。在所述請求已被處理以后,服務器可以將VM301從工作進程401分離。然后,工作進程401可被用來處理另一個請求。例如,如果服務器200接收到相應于用戶會話2的新請求,并且分派器進程410將該請求分派給工作進程401,則相應的VM303能夠被連接到工作進程401以便處理該新的請求。繼續(xù)這個例子,如果在工作進程401仍在被用來處理相應于用戶會話2的請求時服務器200接收到另一個相應于用戶會話1的請求,則分派器進程410可以將所述來自用戶會話1的新請求分派給工作進程403,并且用于用戶會話1的VM301可以被連接到工作進程403,以便處理來自用戶會話1的新請求。不要求服務器200具有分派器進程410。例如,在另外的實施方案中,用戶請求可以被順次地分配到被分配給服務器200的進程。每一個進程均能夠維持請求隊列,并連接相應于所述隊列前端的請求的用戶會話的可連接進程VM,以便處理該請求。如上所述,可連接進程VM是能夠被連接到OS進程和從OS進程分離的VM。為了能夠將VM從進程分離(以及將VM連接到另一個進程),需要去除在所述VM和該VM在其中運行的進程之間的親和性。當VM被從進程分離時,所述VM的狀態(tài)需要是持久的。當所述VM被連接到另一個進程時,所述VM的狀態(tài)需要是非持久的。因此,需要以使得所述狀態(tài)能夠持久和非持久的方式產生和維持VM的狀態(tài)。而且,當將VM從進程分離時使所述VM的狀態(tài)持久以及當將所述VM連接到不同的進程時使所述VM的狀態(tài)非持久最好應該是低成本的操作。這可以通過將VM的狀態(tài)存儲在可由分配給所述服務器的OS進程訪問的共享存儲器中來實現(xiàn)。為了使被置于共享存儲器中的VM訪問相應于用戶會話的用戶上下文,所述用戶上下文——包括用戶堆(heap)和用戶堆棧(stack)——必須也被置于共享存儲器中。(或者,用戶上下文可以被復制到VM被綁定到的進程的地址空間——下面更詳細地討論這種實施方案)。因此,在服務器200的一個實施方案中,用戶上下文也被存儲在共享存儲器中。將用戶堆存儲在共享存儲器中是簡單易見的——可以簡單地從共享存儲器段分配用于堆的存儲器。存儲用戶堆??赡芨щy,因為在某些實例中,例如JavaVM,用戶堆棧和VM堆棧被混和在一起。在這種情形下,一個解決方案是將VM的完整堆棧,包括用戶堆棧,存儲在共享存儲器中。在一個實施方案中,這通過將VM實施為操作系統(tǒng)協(xié)同例程(co-routine)來實現(xiàn)。典型的子例程顯示了分層關系。例如,子例程A在調用子例程B時掛起,子例程B在結束時將控制返回子例程A,子例程A從掛起點繼續(xù)執(zhí)行。相反,協(xié)同例程具有平行的而非分層的關系。因此,例如協(xié)同例程A在調用協(xié)同例程B時掛起,但是協(xié)同例程B在將控制返回協(xié)同例程A時也掛起。對于協(xié)同例程B,這種返回控制好像是調用協(xié)同例程A。當協(xié)同例程A隨后調用協(xié)同例程B并掛起時,協(xié)同例程B表現(xiàn)得就好像其先前對協(xié)同例程A的調用已經返回一樣,并且它從該調用點繼續(xù)執(zhí)行。因此,控制在兩個協(xié)同例程之間反射,每一個均在其先前被暫停的地方繼續(xù)。協(xié)同例程可以被比做線程,因為在某些實施方案中協(xié)同例程的每一個均具有其自己的堆棧并共享堆。但是,線程和協(xié)同例程之間的一個差別是操作系統(tǒng)承擔線程之間的調度,而程序員必須承擔協(xié)同進程之間的調度。如下面所解釋的那樣,協(xié)同例程可以被用來模擬線程。例如,Linuxglibc庫內的函數(shù)集合,包括setcontext()、getcontext()、makecontext()和swapcontext()函數(shù),可被用來在進程內開始新的協(xié)同例程,在協(xié)同例程之間切換,并且重要的是為協(xié)同例程的堆棧提供存儲器。該最后一個特征可被用來從共享存儲器分配VM的堆棧(以及將堆棧存儲在共享存儲器中)。在服務器200的一個實施方案中,當用戶會話開始時,產生并初始化相應于用戶會話的可連接進程VM。共享存儲器的被稱為“會話存儲器”的專用塊(privateblock)被分配給VM。從共享存儲器的這個專用塊直接分配VM的堆和堆棧。使用共享存儲器來存儲VM的狀態(tài)使得將VM綁定或者連接到OS進程的過程實質上是空操作,因為操作系統(tǒng)進程可以簡單地將VM的會話存儲器映射到其地址空間中。類似地,將VM從OS進程分離的過程只要求將VM的會話存儲器簡單地從OS進程的地址空間解除映射。實際上沒有移動或者復制數(shù)據(jù)。為了能夠將VM從進程分離(以及將VM連接到另一個進程),VM使用的輸入/輸出(I/O)資源,例如文件句柄和套接字(socket),也需要是持久的。需要以使得I/O資源能夠是持久和非持久的方式來產生和保持VM使用的I/O資源。這可以通過使用額外的間接層次來訪問I/O資源(或這些資源的代理)實現(xiàn)。例如,VM看作文件或套接字描述符的東西實際上只不過是該文件或套接字的句柄。句柄自身就可以是可持久的,例如,文件句柄可以被存儲在VM的會話存儲器中?;蛘?,可以通過使用資源管理器使得句柄可持久——例如,在套接字的情況下,可以使用描述符傳遞來通知套接字管理器關于針對特定套接字的I/O請求;然后,當I/O請求完成時,套接字管理器可以通知分派器。某些VM可以是多線程的。線程實質上是占位符(placeholder)信息,該信息使得程序能夠在程序的單次使用中處理多個并發(fā)用戶或者服務請求。從程序的觀點,線程是為一個單獨用戶或者特定服務請求服務所需的信息。如果多個用戶正在并發(fā)地使用程序,或者如果程序接收到并發(fā)請求,則針對每一個這樣的用戶或者請求均創(chuàng)建和維持一個線程。當程序另外代表不同的用戶或者請求重新進入時,線程允許程序知道哪個用戶或請求正被服務。對于共享存儲器來說,本機OS線程不能很容易地持久。因此,為了能夠將多線程VM從進程分離(以及將VM連接到另一個進程),可以由用戶層機制模擬本機線程。采用用戶層機制模擬本機線程有時候被叫做提供“綠色線程”功能。綠色線程是由用戶而非操作系統(tǒng)調度的用戶層線程??杀挥脕砟M本機線程的一個機制是操作系統(tǒng)協(xié)同例程。如上面所說明的那樣,除了程序員(而非操作系統(tǒng))承擔在協(xié)同線程之間調度以外,協(xié)同例程類似于線程。因此,用來實施VM線程的本機OS線程可以被映射到協(xié)同例程。和線程管理與調度相關的所有數(shù)據(jù)結構,包括線程的調用堆棧、互斥體和用于Java監(jiān)視器的條件變量,可以被保存在VM的會話存儲器中。在JavaVM的情況下,它既可以包括Java堆棧也可以包括VM實施所用的C堆棧,例如動態(tài)方法調用的Java本機接口(JavaNativeInterface,JNI)實施的C堆棧。操作系統(tǒng)一般先發(fā)制人地調度線程,以便使公平性最大化(即給予每一個線程在某個時間點運行的機會)。相反,由程序員處理的協(xié)同例程調度通常不是先發(fā)制人的。但是,那不一定是個缺點,因為在服務器的上下文中,請求吞吐量經常比公平性更重要。請求吞吐量是可擴展性的基本目標,通過使用批處理策略來調度協(xié)同例程可以使其最大化。在批處理策略中,在每一個VM內,當進入等待狀態(tài)時(例如當I/O上或例如Java監(jiān)視器的監(jiān)視器上的阻塞時),每一個協(xié)同例程向調度器(有時仍稱為線程調度器)合作地讓步。作為上面描述的I/O重定向機制的一部分,可以包括阻塞I/O調用和線程調度器之間的協(xié)作。在會話存儲器中可以實施互斥體和條件變量而無需使用操作系統(tǒng)鎖定基元作為受調度器控制的變量。協(xié)同例程調用可以持續(xù)一個PAVM,直到其所有協(xié)同例程已經進入等待狀態(tài),指示用戶請求或者完成,或者在等待I/O。在任一情況下,PAVM均可被從工作進程分離。當下一個請求來自用戶會話時,或者當I/O請求完成時,分派器進程410能夠將PAVM重新連接到可用工作進程。如上所述,用來實施VM線程的本機線程可以被映射到協(xié)同例程。相反,只在VM中內部使用的例如用于垃圾回收的本機線程可以被用同步函數(shù)調用代替。使用同步函數(shù)調用可被認為是一種模擬內部本機線程的方法?;蛘撸绻蓛炔勘緳C線程執(zhí)行的函數(shù)要被異步地執(zhí)行,則可以在服務器內被指定的較低優(yōu)先級進程上調度和執(zhí)行該函數(shù)。而另一種選擇是將某些函數(shù)一起省略。例如,有可能在用戶會話終結時簡單地釋放所有的會話存儲器而非在用戶會話在活動時執(zhí)行垃圾回收。圖3示出了示范性Java2平臺企業(yè)版(J2EE)應用服務器200,它包括共享存儲器255和工作進程401、403。J2EE是針對對于大企業(yè)來說較為典型的大型機規(guī)模計算而設計的Java平臺。通過產生標準化的、可重用模塊化部件并使得各層能夠自動處理編程的很多方面,J2EE簡化了在分層、瘦客戶端環(huán)境中的應用開發(fā)。J2EE包括Java2平臺標準版(J2SE)的很多部件,例如Java2開發(fā)包(Java2DevelopmentKit,JDK)、對公共對象請求代理架構(CommonObjectRequestBrokerArchitecture,CORBA)、Java數(shù)據(jù)庫連接2.0(JavaDatabaseConnectivity2.0,JDBC)和安全性模型的支持。J2EE還包括對企業(yè)JavaBean(EnterpriseJavaBean,EJB)、Java服務器小程序應用編程接口(API)和Java服務器頁面(JavaServerPages,JSP)的支持。每一個工作進程401、403均可以包括容器204和例如遠程方法調用(RemoteMethodInvocation,RMI)接口206和數(shù)據(jù)庫管理系統(tǒng)(databasemanagementsystem,DB)接口208的服務接口。RMI是面向對象的編程技術,它使得不同計算機上的對象能夠通過分布式網絡交互作用。RMI是通常叫做遠程過程調用(remoteprocedurecall,RPC)的協(xié)議的Java版本,但是具有附加的將一個或更多個對象與請求一起傳遞的能力。容器204可以包括為服務器架構提供比由本機OS提供的框架更適合的框架的OS接口。該OS接口可以從本機OS接管某些函數(shù)的責任,例如調度、存儲器管理、進程架構、集群、負載平衡和聯(lián)網。通過接管這些函數(shù),容器204能夠以將例如請求吞吐量的某些目標進行優(yōu)化的方式控制關鍵資源的使用,所述關鍵資源例如處理器和存儲器。容器204也可以起到向在服務器上執(zhí)行的應用隱藏該服務器的本機操作系統(tǒng)細節(jié)的作用。此外,容器204起到接口的作用,通過所述接口,可連接進程VM可以被連接到進程、在所述進程中執(zhí)行,以及從所述進程分離。因此,在圖3中所示的服務器實施方案中,容器204提供了一些用于使用可連接進程VM的功能,例如使VM的狀態(tài)持久和非持久(例如,通過將分配給VM的共享存儲器塊映射到進程的地址空間中)和VM線程或協(xié)同例程的調度。在圖3中的例子中,第一用戶會話(用戶會話1)被綁定到工作進程401。用戶會話1包括相應的用戶上下文501和VM301。共享存儲器255的塊257被分派給用戶會話1。用戶上下文501和VM301的狀態(tài)被存儲在共享存儲器塊257中。在這個例子中,相應于用戶會話1的請求已被接收并分派到工作進程401。為了處理這個請求,相應于用戶會話1的VM301被綁定到工作進程401。因此,用戶上下文501和VM301的狀態(tài)都已經被從共享存儲器塊257映射到工作進程401的地址空間中。然后,VM301被工作進程401執(zhí)行,以便處理所述請求。當請求已被處理時,用戶會話1可以被從工作進程401解除綁定,意味著相應的VM和用戶上下文可以從工作進程401分離(例如通過將用戶上下文501和VM301的狀態(tài)從工作進程401的地址空間解除映射)。圖3還示出了被綁定到工作進程403的用戶會話2。用戶會話2包括相應的用戶上下文503和VM303。共享存儲器255的塊259被分配給用戶會話2。用戶上下文503和VM303的狀態(tài)被存儲在共享存儲器塊259中,并被映射到工作進程403的地址空間中。當來自用戶會話2的請求已經被處理時,用戶會話2可以從工作進程403解除綁定,意味著相應的VM和用戶上下文可以從工作進程403分離(例如通過將用戶上下文503和VM303的狀態(tài)從工作進程403的地址空間解除映射)。如果新請求自用戶會話1抵達,假定或者因為VM303處于等待狀態(tài),或者因為VM303已完成處理來自用戶會話2的請求,VM303已經從工作進程403分離,則該新請求可以被分派到例如工作進程403。然后,相應于用戶會話1的VM301和用戶上下文501可以被綁定到工作進程403。在一個實施方案中,這不要求移動或復制任何數(shù)據(jù)——而是將共享存儲器塊257(或者其適當部分)簡單地映射到工作進程403的地址空間中。然后,工作進程403可以執(zhí)行VM301以便處理來自用戶會話1的新請求。因此,用戶會話可以被綁定到不同進程并能在不同進程之間移動。以這種方式,只要工作進程成為可用,請求就可以被處理。而且,將用戶會話映射到不同進程一般是非常便宜的操作。結果,請求吞吐量得到優(yōu)化。使用可連接進程VM還導致了可擴展的服務器,因為可以通過給服務器分配更多進程進一步優(yōu)化請求吞吐量。還有可能給底層的計算機添加更多的處理器,以便更好地處理增加數(shù)量的進程。使用可連接進程VM還使得服務器穩(wěn)健。這是因OS在進程(例如服務器進程池400中的工作進程)之間提供的隔離所致。而且,還有可能通過一次只將一個用戶會話的存儲器和VM映射到工作進程中保護與用戶會話相關聯(lián)的存儲器和狀態(tài)。在服務器200的另一個實施方案中,兩個或更多個PAVM被連接到一個進程并在所述進程中執(zhí)行。例如,ABAPVM和JavaVM可以在一個進程中執(zhí)行。在一個進程中運行ABAPVM和JavaVM實現(xiàn)了在同一應用中既使用ABAP也使用Java部件。因此,可以開發(fā)應用以有利地利用來自ABAP和Java環(huán)境這兩者的有用部件。下面描述的技術可被用來在一個進程中執(zhí)行多個VM。例如,進程可被用來執(zhí)行JavaVM和ABAPVM以及CLRVM。通過使用協(xié)同例程可以實現(xiàn)在一個進程內執(zhí)行多個VM。在ABAPVM和JavaVM要在一個進程中運行的例子中,可以使用兩個協(xié)同例程——一個用于ABAPVM,一個用于JavaVM。除了包括JavaVM或者ABAPVM以外,每一個協(xié)同例程還可以包括容器(或容器的一部分),以便處理例如調度和兩個VM之間以及與服務器外部的應用的通信這些函數(shù)。繼續(xù)ABAP/Java例子,如果ABAPVM是應用將使用的主要VM,則執(zhí)行ABAPVM的協(xié)同例程可以包括如上所述的容器。在ABAPVM內執(zhí)行的請求第一次調用Java對象時,容器可以為JavaVM堆棧(包括Java用戶堆棧)分配存儲器,并開始新的協(xié)同例程來執(zhí)行JavaVM??梢员粋鬟f到新的協(xié)同例程的參數(shù)包括被分配的存儲器的位置和大小,以及所述新的協(xié)同例程的啟動函數(shù)(在這種情況下是JavaVM自身)。然后,JavaVM可以開始主類(mainclass),例如實施可被用來運行J2EE部件的J2EE容器,J2EE部件例如Java服務器小程序、企業(yè)JavaBean或Java服務器頁面。在其執(zhí)行的同時,JavaVM能夠調用容器功能,以便例如從消息區(qū)域讀取請求并將響應寫到所述消息區(qū)域。對于調度,JavaVM在其已經寫過響應或者請求之后能夠將控制返回ABAPVM。然后,在新請求或對其自己的請求的響應抵達后,該JavaVM可以被重新調度。圖4是示出范例過程450的流程圖,過程450用于在圖2中所示的服務器實施方案中處理請求。過程450通過使用可連接進程VM以可擴展的方式在用戶會話之間提供隔離。當用戶會話開始時,為該用戶會話產生并初始化可連接進程VM(452)。這個操作可以包括為該VM分配存儲器塊。所分配的存儲器可以是共享存儲器(以便使得該VM能夠被服務器中的多個進程訪問),但是它也可以被指定為專用的,意味著該存儲器塊將只屬于新創(chuàng)建的VM。在存儲器塊已經被分配給VM后,該VM可以被存儲在該存儲器塊中。VM的計算狀態(tài)(包括VM堆棧和堆)以及相應的用戶會話的用戶上下文(包括用戶堆棧和堆)都可以被存儲在該存儲器塊中。用戶上下文可以包括例如文件的I/O資源的句柄,以及例如套接字的I/O資源的代理(例如資源管理器)的句柄。初始化VM可能是昂貴的操作,因為它可能涉及加載、驗證和解析幾個類(例如Java系統(tǒng)類),以及執(zhí)行系統(tǒng)類中的許多靜態(tài)初始化器(staticinitializer)。通過使用預先初始化的“主”VM,可以降低這些初始化開銷。不是從零開始初始化新的VM,而是主VM的存儲器塊可以被簡單地復制到新VM的存儲器塊中。將主VM的存儲器塊的模板映像(image)復制到新VM的存儲器塊中使得新VM能夠在已經被初始化的狀態(tài)中開始運行。如果某些初始化操作只能在新VM實際啟動時被執(zhí)行,則可以使用部分初始化VM的模板映像,以便在開始后,新VM只需要執(zhí)行要求在實際啟動時間執(zhí)行的那些操作。通過另一種優(yōu)化可以進一步降低初始化(以及執(zhí)行)開銷將類型信息(例如被加載的類的運行時表示)存儲在共享存儲器可以被所有VM訪問的部分中。這個技術可以降低每一個VM所致的類加載、驗證和解析的開銷,并且如果用來共享可能被每一個用戶上下文使用的系統(tǒng)類的字節(jié)代碼,則可能特別有用??梢允褂妙愃频募夹g共享用戶類的字節(jié)代碼。在使用即時(JIT)編譯器的實施方案中也可以共享編譯過的代碼。在VM已經被初始化后,VM可被用來處理來自相應的用戶會話的用戶請求。當接收到來自相應的用戶會話的用戶請求時(454),選擇來自被分配給服務器的進程池的可用進程來處理請求(456)。然后,發(fā)送了該請求的用戶會話的PAVM被綁定到被選擇的進程(458)。如果用來存儲VM的存儲器塊是可被服務器的所有進程訪問的共享存儲器,則綁定實質上可能是空操作——例如,存儲器塊或其一部分,可以被簡單地映射到被選擇的進程的地址空間中。被映射的部分可以包括VM的計算狀態(tài)?;蛘?,在不同的方式中VM可以是非持久的。例如,VM的計算狀態(tài)可以被從文件復制。但是,這種操作的性能可能不好,特別是和將共享存儲器映射到進程地址空間中的高效操作相比,所述高效操作通常不要求復制或者移動數(shù)據(jù)。在VM已經被綁定到被選擇的進程后,VM可以被進程執(zhí)行,以便處理用戶請求(460)。這可能涉及執(zhí)行兩個或更多個協(xié)同例程來在VM內模擬線程。這還可能涉及執(zhí)行同步函數(shù)調用來模擬內部線程的執(zhí)行(例如執(zhí)行垃圾回收的線程)。如果這樣的內部線程或者另一個函數(shù)被異步地執(zhí)行,則被分配給服務器的進程中一個可以被指定為低優(yōu)先級進程,并被用來執(zhí)行用于VM的函數(shù)。例如,這個技術可被用來在VM中執(zhí)行垃圾回收??梢哉{度更重要的函數(shù)在正?;蜉^高優(yōu)先級進程中運行。在VM已經處理過用戶請求之后,VM從被選擇的進程分離(462)。然后,被選擇的進程可以被返回可用進程池(或者被標記為可用),以便它可以被用來處理服務器接收到的新請求。和綁定一樣,將VM從進程分離可能是簡單、低成本的操作VM的共享存儲器塊可以被簡單地從進程地址空間解除映射?;蛘?,使VM持久可能涉及更復雜或更昂貴的操作,例如將VM的計算狀態(tài)保存到文件。將VM連接或者綁定到進程并將該VM從該進程分離或者解除綁定可能是彼此的鏡像——即為使VM非持久而執(zhí)行的操作可以被逆轉,以便使VM持久。然后,服務器可以等待來自用戶會話的另一個請求(454)。當用戶會話終結時,其相應的VM也可以被終結,并且其全部資源,包括其被分配的存儲器,可以被釋放。如果VM的存儲器在用戶會話末尾被釋放,則有可能在VM的壽命期間省略垃圾回收。在用戶會話末尾終結VM的另一選擇是重新使用該VM,即將該VM與不同的用戶會話相關聯(lián)并使用該VM來處理來相應于該用戶會話的請求。對于要求保持非常小的用戶上下文(甚至沒有用戶上下文)的應用以及具有非常短的用戶會話的應用來說,這個技術可能特別有用(不要求保持用戶上下文的應用有時候被稱為無狀態(tài)應用)。對于所有這些應用,使用順次可重用VM池可以幫助將和創(chuàng)建、初始化、維持和終結VM相關聯(lián)的開銷最小化。關于可連接進程VM的實施和使用的額外細節(jié)可以在N.Kuck、H.Kuck、E.Lott、C.Rohland和O.Schmidt的SAPVMContainerUsingProcessAttachableVirtualMachinestoProvideIsolationandScalabilityforLargeServers(2002年8月1日)(在第二屆USENIXJava虛擬機研究和技術研討會(JavaVM’02)上作為正在開展的工作報告被提交和展示了未出版的摘要)中找到。創(chuàng)建和使用共享對象為每一個用戶會話分配一個VM意味著給每一個用戶會話均提供了其自己的VM堆(例如Java堆)。因此,在使用單個多線程VM的服務器200的實施方案中將只存在一次的VM堆中的數(shù)據(jù)對象被針對每一個用戶會話復制一次。這可能既導致資源消耗(例如用于存儲被復制的數(shù)據(jù)對象的存儲器)也導致時間消耗(例如用于建立和初始化被復制的數(shù)據(jù)對象的時間)。作為一個簡單的例子,考慮代表在應用啟動時刻被解析的可擴展標記語言(XML)配置文件的大型Java數(shù)據(jù)結構。在為相應于應用的每一個用戶會話復制這樣的數(shù)據(jù)結構時,服務器200浪費了除第一個VM和用戶會話以外全部的CPU時間(用于解析XML文件和構建數(shù)據(jù)結構)和存儲器(用于存儲數(shù)據(jù)結構)這兩者。為了緩和這個問題,服務器200的一個實施方案使得數(shù)據(jù)對象能夠在VM之間共享。在服務器200的這個實施方案中,共享存儲器區(qū)域或堆被用來存儲可被多個VM訪問的數(shù)據(jù)對象。共享存儲器堆中的數(shù)據(jù)對象一般應該不具有任何對任何專用堆(例如各VM的專用堆)的引用或者指針。這是因為如果共享存儲器堆中的對象具有帶有對一個特定VM中的專用對象的引用的成員變量,則該引用對于所有其他使用該共享對象的VM來說將是無效的。更正式地說,可以按如下考慮這個限制對于每一個共享對象,被初始對象引用的對象的傳遞閉包始終應該只包含共享對象。因此,在服務器200的一個實施方案中,對象不被單獨地放入共享存儲器堆——而是將對象按叫做“共享閉包”的組放入共享存儲器堆。共享閉包是初始對象加上被該初始對象引用的所有對象的傳遞閉包。在圖5中在概念上示出了通過共享閉包共享對象,其中,通過將第一對象601和第一對象601引用的所有對象的傳遞閉包分組在一起,已經在第一VM301中標識了共享閉包600。在已經標識了共享閉包600后,VM301能夠在共享存儲器區(qū)域255中創(chuàng)建共享閉包,例如通過將共享閉包600復制到共享存儲器區(qū)域255中。在已經在共享存儲器區(qū)域255中創(chuàng)建了共享閉包601之后,它可以被服務器中的VM訪問(例如VM301、303和305)。VM能夠通過例如將共享閉包600從共享存儲器區(qū)域255映射或者復制到該VM正在其中執(zhí)行的進程的地址空間中,訪問來自共享存儲器區(qū)域255的共享閉包600。下面更詳細地討論共享閉包的創(chuàng)建和使用。為了可在共享閉包中使用,對象必須“可共享”??偟膩碚f,如果一個運行時系統(tǒng)(例如JavaVM)中的復雜數(shù)據(jù)結構(例如堆或其一部分)可以被分解并且隨后被用第二運行時系統(tǒng)的本機格式重裝而不打破該數(shù)據(jù)結構的內部一致性或功能,則該數(shù)據(jù)結構可被與第二運行時系統(tǒng)共享。在服務器200的一個實施方案中,通過將共享閉包復制到共享存儲器和從共享存儲器復制共享閉包來共享對象。對象要在這個實施方案中可共享,所述對象必須能夠承受到另一個VM的地址空間中的透明深復制(transparentdeep-copy)而不打破對象的內部一致性或功能。下面更詳細地討論了針對這種實施方案的可共享性要求。盡管可共享性的大多數(shù)方面一般是對象類的屬性,但是對象實例的可共享性不僅依賴于其類的屬性,還依賴于對象實例的成員變量的類型。在成員變量可能具有直到運行時才能被確定的運行時類型的情況下,必須在運行時確定共享閉包內對象實例的可共享性。因此,在對象實例具有運行時類型的服務器實施方案中,可以在可共享類和可共享對象實例之間加以區(qū)別。如果類滿足可共享性標準,則該類可共享,下面提供了可共享性標準的例子。如果對象實例的運行時類型是可共享類,并且如果它引用的所有對象都是可共享對象實例,則該對象實例是可共享對象實例。換句話說,如果下面的條件都被滿足,則對象實例是可共享對象實例(i)對象的運行時類是可共享類,和(ii)對象實例的所有非空引用類型成員變量是可共享對象實例。第一個條件(對象的運行時類是可共享類)旨在保證運行時類的實例在語義上能夠應付共享。下面提供了用于確定運行時類是否可共享的示范標準。雖然確定運行時類是否可共享只需要每個類進行一次,但是這種特性不可繼承,因為派生類可能添加和共享不兼容的功能。第二個條件(對象實例的所有非空引用類型成員變量自身是可共享對象實例)旨在保證共享閉包中的所有對象可共享。通過遞歸檢查對象實例中的引用可以確定是否滿足這個條件。由于“可共享類”特性的非繼承性所致,簡單地檢查對象的所有成員變量的已聲明類型是不夠的,因為盡管已聲明類型可能是可共享的,但是運行時類型可能不是可共享的。圖6示出了范例過程650的流程圖,過程650可被用來確定對象實例是否是可共享對象實例。在圖6中所示的過程中,首先接收到對象實例的標識(652)。對象實例的運行時類被標識,并確定該運行時類是否是可共享類(654)。如果運行時類不是可共享類(判斷656的“否”分支),則過程以對象實例不可共享的指示結束(658)。例如,通過提出“不可共享”異常可以做出這樣的否定指示。如果對象實例的運行時類是可共享類(判斷656的“是”分支),則該對象實例引用的對象被標識(660)。然后,過程650遍歷被引用的對象以便確定被引用的對象是否是可共享對象實例。如果有更多的被引用對象(判斷662的“是”分支),則選擇剩余的被引用對象之一(664)。然后,確定被引用的對象是否是可共享對象實例(666)。如果被引用的對象不是可共享對象實例(判斷668的“否”分支),則過程650以初始對象實例不可共享的指示結束(658)。這是因為被初始對象實例引用的對象之一不是可共享對象實例,并且如先前所陳述的那樣,對于要可共享的對象,初始對象引用的所有對象必須都是可共享對象實例。如果被引用的對象是可共享對象實例(判斷668的“是”分支),則過程650查看是否有更多的被引用對象要被分析。如果有更多的被引用對象(判斷662的“是”分支),則過程650選擇剩余的被引用對象之一并和前面一樣繼續(xù)下去。如果不存在更多的被引用的對象(判斷662的“否”分支)并且過程還沒有終結,則那意味著所有被引用的對象已經被分析并被確定為可共享對象實例。因此,過程以初始對象實例是可共享的指示結束(670)。確定被引用的對象是否是可共享對象實例可以被遞歸地進行——即針對被引用的對象可以再次調用過程650,如圖6中虛線所示。換個說法,被引用的對象可以被遞歸地遍歷,所以可以針對被引用對象的傳遞閉包中的每一個對象做出確定。如果初始對象和被引用的對象的傳遞閉包中的所有對象都是可共享對象實例,則這些對象可以被分組到共享閉包中并被與另一個運行時系統(tǒng)共享(例如通過將共享閉包復制到共享存儲器區(qū)域)。過程650可以被認為最終確定共享閉包中的每一個對象的運行時類是否是可共享類。如先前所說明的那樣,在通過將共享閉包復制到共享存儲器和從共享存儲器復制共享閉包來共享對象的實施方案中,如果對象能夠承受到另一個VM的地址空間中的透明深復制(transparentdeep-copy)而不打破對象的內部一致性或功能,則對象一般被認為是可共享的。在這樣的實施方案中,如果VM串行化或解串行化類的對象實例時不執(zhí)行任何定制代碼,則一般可以認為類是可共享的。這個規(guī)則的基本原理是如果VM不需要執(zhí)行任何定制串行化或解串行化代碼,則用來將共享閉包復制到共享堆(或從共享堆復制到VM的地址空間)的深復制操作在語義上等同于共享閉包中的對象的串行化和解串行化。因此,如果共享閉包已經被復制到共享堆,則將該共享閉包映射或者復制到其自己的地址空間的VM應該能夠訪問共享閉包中的對象而無需任何額外的解串行化對象所需的動作。圖7示出了范例過程750的流程圖,過程750可被用來確定特定類是否是可共享類。例如,在過程650要求確定特定運行時類的可共享性的情況下(654)可以使用過程750。在圖7中所示的過程中,首先接收到類(例如對象實例的運行時類)的標識(752)。然后應用很多標準來確定該類是否可共享。具體來說,類要可共享,則該類必須滿足所有下列條件。首先,類必須可串行化(754)。在Java類的情況下,這可以通過檢查該類是否實施了標記接口(markerinterface)java.io.Serializable確定。實施java.io.Serializable表明類的對象實例通??梢员灰杂幸饬x的方式復制到另一個地址空間中。因此,如果類的確實施了java.io.Serializable接口,則第一個條件得到滿足。第二,類絕不可包括任何定制串行化或解串行化代碼(756)。在Java類的情況下,這可以通過檢查類是否實施了下列方法中的任何一個來確定privatevoidreadObject(ObjectInputStream);privatevoidwriteObject(ObjectOutputStream);publicvoidreadExternal(Objectlnput);publicvoidwriteExternal(ObjectOutput);{anyaccess}ObjectreadResolve();{anyaccess}ObjectwriteReplace();上面的方法構成了在串行化或者解串行化期間執(zhí)行的定制代碼。這些定制代碼不能被自動地證明等同于在創(chuàng)建共享閉包期間執(zhí)行的深復制操作。因此,在使用深復制操作來創(chuàng)建共享閉包的情況下,實施上面函數(shù)中的任何一個排除了在過程750中將類自動地視為可共享類的可能。第三,所討論的類的所有基類必須是可串行化的(758)。在Java類的情況下,這可以通過檢查是否所有的基類實施了java.io.Serializable或具有平凡缺省構造器來確定——如果是,則第三個條件得到滿足。如果任何基類沒有實施java.io.Serializable,則其缺省構造器被在解串行化期間執(zhí)行。如果缺省構造器是平凡的——即,如果構造器為空或者調用了基類的平凡缺省構造器,這可通過缺省構造器的遞歸查驗確定——則缺省構造器的調用對解串行化沒有任何影響。非平凡缺省構造器排除了在過程750中將類自動地視為可共享類的可能,因為缺省構造器可能包括不等同于深復制操作的定制代碼。第四,所討論的類的所有成員域必須被串行化(760)。在Java類的情況下,這可以通過檢查類是否具有任何瞬態(tài)域或serialPersistentFields域來確定。瞬態(tài)域是在解串行化期間被設置為其缺省值的域。因此,將具有瞬態(tài)域的類的對象實例解串行化可能不等同于對象實例的深復制。因此,在類中存在瞬態(tài)域排除了在過程750中將類自動地視為可共享類的可能。具有serialPersistentFields域的類也被排除,因為這些類只不過是指示具有瞬態(tài)域的類的另一種方式。第五,類絕不可具有任何垃圾回收副作用(762)。被共享的對象可能具有和使用它們的VM的生命周期不同的生命周期,因此可能影響在VM內執(zhí)行的垃圾回收算法。垃圾回收副作用排除了在過程750中將類自動地視為可共享類的可能,因為副作用可能妨礙垃圾回收算法的正確操作。在Java類的情況下,過程750能夠通過檢查類具有平凡終結器以及類不是從java.lang.ref.Reference類派生的來確定這個條件得到滿足。平凡終結器是為空或者調用基類的平凡終結器的終結器。如果所有上面五個條件都被滿足,則過程750以所討論的類是可共享類的指示結束(766)。另一方面,如果任一條件沒被滿足,則過程750以所討論的類不是可共享類的指示結束(764)。在服務器200的一個實施方案中,如果通過被自動施加的過程(例如過程750)發(fā)現(xiàn)類是可共享的,或者如果該類先前已經被聲明是可共享的,則該類被視為是可共享的。即,即使自動施加的對類的分析未能指示該類是可共享的,該類也可能是可共享的。如果類已經被檢查過(例如通過手工查閱其源代碼)并發(fā)現(xiàn)適于共享,則該類可以被聲明為可共享。例如,在通過將共享閉包復制到共享存儲器和從所述共享存儲器復制所述共享閉包來共享對象的實施方案中,如果語義檢查證明對上面規(guī)定的可共享性標準的所有違犯都是無害的,則類可以適于共享。如果盡管有那些違犯,但是可以說明用來將共享閉包復制到共享堆中(或者從共享堆復制到VM的地址空間中)的深復制操作在語義上等同于共享閉包中的對象的串行化和解串行化,則對可共享性標準的違犯一般是無害的。不滿足上面規(guī)定的可共享性標準但是仍適于共享的類的一個簡單例子是類java.lang.String(因為該類在Java2平臺標準版1.3中定義)。java.lang.String類違犯了上面規(guī)定的第四個條件,因為它包括serialPersistentFields域。手工檢查該類中的代碼指出,為了在串行化期間實施類的對象實例的特殊處理包括了該域,所述特殊處理是串行化協(xié)議的要求。盡管如此,能夠很容易地表明,對于該類來說,深復制的效果等同于串行化。因此,java.lang.String類可被聲明為可共享。不滿足上面規(guī)定的可共享性標準但是仍適于共享的類的更為復雜的例子是類java.util.Hashtable(因為該類在Java2平臺標準版1.3中定義)。java.util.Hashtable類違犯了上面規(guī)定的第二和第四個條件,因為它包含定制串行化方法和瞬態(tài)域。查閱該類中的代碼指出,因為在串行化期間不保留哈希代碼(hashcode),這迫使哈希表在解串行化期間重建其內容,所以要求定制串行化方法和瞬態(tài)域。但是由于深復制操作保留哈希代碼,所以可以說明深復制操作等同于串行化和解串行化。結果,類java.util.Hashtable也可以被聲明為可共享。通過在圖8和圖9中示出的范例過程850和950,可以實現(xiàn)共享閉包的創(chuàng)建和使用,這在圖5中被概念性地示出。過程850繪出了可用來創(chuàng)建共享閉包的示范過程。在過程850中,接收到第一運行時系統(tǒng)(例如VM)中的初始對象的標識(852)。然后,共享閉包——即初始對象加上該初始對象引用的所有對象的傳遞閉包——被標識(854),并確定該共享閉包是否可在另一運行時系統(tǒng)(例如另一個VM)中使用或者被其共享(856)。例如,可以通過確定共享閉包中的對象是否可共享(或者更準確地,通過確定共享閉包中的每一個對象實例是否是可共享對象實例)來做出這個確定。在一個實施方案中,標識共享閉包并確定共享閉包中的對象是否是可共享對象實例的操作(854、856)由圖6中所示的過程650實施。如果共享閉包不可以在另一個運行時系統(tǒng)中使用(判斷858的“否”分支),則過程850提出異常或者產生某種類型的否定指示。例如,如果共享閉包中的對象不都是可共享對象實例,則過程可以提出指示初始對象及其共享閉包不可共享的異常。如果共享閉包可以在其他的運行時系統(tǒng)中使用(判斷858的“是”分支),則過程850調用使得所述共享閉包對于其他的運行時系統(tǒng)可用的機制。例如,如果通過使用共享存儲器共享對象,則共享閉包可以被復制到共享存儲器區(qū)域(862)。在其他的實施方案中,通過使用消息或其他的通信方法,共享閉包可以被傳送到一個或更多個運行時系統(tǒng)(例如其他的VM)。創(chuàng)建共享閉包的過程也可能涉及將規(guī)定的名稱或者其他標識符和共享閉包相關聯(lián)(864)。隨后其他的運行時系統(tǒng)可以使用這樣的標識符來標識要被訪問的共享閉包。在某些實施方案中,創(chuàng)建共享閉包的過程還涉及使用版本管理(versioning)。在過程850中,通過使用和存儲在共享存儲器中的共享閉包相關聯(lián)的版本號實現(xiàn)版本管理。當利用給定名稱創(chuàng)建共享閉包時,確定在共享存儲器中是否已經存在具有那個名稱的共享閉包。如果的確存在這樣的共享閉包(判斷866的“是”分支),則增加和所述共享閉包相關聯(lián)的當前版本號(868),并且新的當前版本號被與新創(chuàng)建的共享閉包相關聯(lián)(872)。如果在共享存儲器中不存在具有給定名稱的共享閉包(判斷866的“否”分支),則新的共享閉包的當前版本號被設置為指示第一個版本的數(shù)字(例如0或者1)(870),并且被與新創(chuàng)建的共享閉包相關聯(lián)(872)??梢允褂冒姹竟芾韥砀鹿蚕黹]包——例如,可以在先前給予共享閉包的相同名稱下創(chuàng)建該共享閉包的新的、更新過的版本。在一個實施方案中,當創(chuàng)建新版本的被命名共享閉包時,所有將該被命名的共享閉包與VM相關聯(lián)的后續(xù)操作都使用新版本的共享閉包。已經在訪問共享閉包的VM(例如將先前版本的共享閉包映射到其地址空間中的VM)不受新版本影響——它們簡單地將所有對象引用保持在舊版本。在這個實施方案中,多個版本的共享閉包可以在共享存儲器中共存,直到過時版本不再被任何VM引用因而可以被垃圾回收為止。圖9示出了用于訪問和使用共享閉包的范例過程的流程圖。在過程950中,名稱或其他標識符被接收(952),并被用來標識相關聯(lián)的共享閉包(954)。所述名稱或者其他的標識符相應于在創(chuàng)建共享閉包時(例如在過程850中的操作864中)被與所述共享閉包相關聯(lián)的標識符。在實施了版本管理的情況下,如果存在多于一個版本的指定共享閉包,則標識指定共享閉包的最近被創(chuàng)建的版本。然后將被標識的共享閉包與運行時系統(tǒng)(例如VM)相關聯(lián)(956)。在一個實施方案中,可以用下面兩種方式之一將共享閉包與運行時系統(tǒng)相關聯(lián)——或者通過將共享閉包從共享存儲器區(qū)域映射到運行時系統(tǒng)的地址空間中,或者通過將共享閉包從共享存儲器區(qū)域復制到運行時系統(tǒng)的地址空間中。在共享閉包已經被與運行時系統(tǒng)相關聯(lián)之后,可以使用正常操作(例如正常Java操作)訪問共享閉包內的對象(962)。在某些實施方案中,對共享閉包中對象的訪問可能依賴于共享閉包如何被與運行時系統(tǒng)相關聯(lián)。例如,在一個實施方案中,如果共享閉包被映射到VM的地址空間中(判斷958的“被映射”分支),則對共享閉包中對象的訪問被限于只讀訪問(960)。由于這個限制,任何寫共享閉包中的對象實例的成員變量的嘗試將導致錯誤。為了防止VM通過例如利用對VM的專用堆的引用來覆蓋共享對象實例中的引用成員變量“打破”共享對象實例,或者防止VM打破共享對象的內部一致性或功能,這個限制可能很有用。在另一方面,如果共享閉包被復制到VM的地址空間中(判斷958的“被復制”分支),則準許VM對被復制的對象的完整讀—寫訪問。在這樣的實施方案中,因此可以通過將共享閉包復制到VM的地址空間中,修改共享閉包中對象的內容,然后在共享存儲器中創(chuàng)建新版本的共享閉包(例如使用圖8中所示的過程850)來更新所述共享閉包中的對象。可以使用其他方法來將共享閉包與運行時系統(tǒng)相關聯(lián)以及提供從運行時系統(tǒng)對共享閉包中對象的訪問。例如,可以使用按需求復制方法。在一個這樣的實施方案中,共享閉包被映射到VM的地址空間中而不將對共享閉包的訪問限于只讀訪問。相反,對共享閉包的訪問被監(jiān)視,并且在檢測到第一次對共享閉包企圖的寫訪問時,將共享閉包復制到VM的地址空間中,從而將共享閉包從被映射的共享閉包變換為被復制的共享閉包。然后,允許企圖的寫訪問完成,并且對被復制的共享閉包的后續(xù)讀和寫訪問可以按正常那樣繼續(xù)下去。如果在發(fā)生從被映射共享閉包到被復制共享閉包的變換時共享閉包的堆地址改變了,則對堆的現(xiàn)有引用必須被重定向到共享閉包的新創(chuàng)建的復本?;蛘撸梢允褂玫讓覱S特征,以允許OS提供按需要復制功能而無堆地址改變的方式映射共享閉包。除了用于創(chuàng)建、映射和復制共享閉包的函數(shù)以外,應用程序接口(API)可以包括額外的用于管理共享對象的函數(shù)。例如,API也可以包括“刪除”函數(shù)?!皠h除”函數(shù)的一個實施方案取名稱或者其他的標識符作為輸入參數(shù),并將共享存儲器中相關聯(lián)的共享閉包標記為被刪除。將共享閉包標記為被刪除不影響已經在訪問共享閉包的VM,但是排除了隨后試圖訪問共享閉包(例如通過將共享閉包映射或者復制到其地址空間中)的VM這么做。在服務器200的其中共享閉包可以被映射到VM的地址空間中的實施方案中,通過追蹤將共享閉包映射到地址空間中的VM的號碼,可以執(zhí)行被刪除或過時版本的共享閉包的垃圾回收。每次VM將共享閉包映射到其地址空間中時可以遞增計數(shù)。在其自己的垃圾回收過程中,當VM確定它不再包括對先前被映射的共享閉包的任何引用時,計數(shù)可以被遞減。當和特定共享閉包相關聯(lián)的計數(shù)達到零時,可以從共享存儲器刪除該共享閉包。在Java中,對象實例通常包括對對象實例的類的運行時表示的引用,并且類運行時表示依次包含對類的類加載器的引用。因此,與Java對象實例相關聯(lián)的類加載器和運行時表示被包括在對象實例的共享閉包中,這意味著運行時表示和類加載器自身必須是可共享的,以便對象實例是可共享的。因此,在包括類運行時表示和類加載器的服務器實施方案中,可以使用兩個額外的標準來確定特定的類是否可共享。所述類應該具有可共享運行時表示和可共享類加載器??梢允褂酶鞣N技術來處理類運行時表示和類加載器(即使得類運行時表示和類加載器“可共享”)。一種技術涉及實際地共享類運行時表示和類加載器。即,當對象實例被復制到共享存儲器時,相應于該對象實例的類的運行時表示和類加載器也被復制到共享存儲器,以使它們可以被所有的VM訪問(例如通過映射操作)。這個技術的各種優(yōu)化是可能的。例如,在將類的運行時表示復制到共享存儲器中之前,可以檢查共享存儲器以便確定在共享存儲器中是否已經存在該類的運行時表示——如果是,則在被復制到共享存儲器中的對象實例中對運行時表示的引用可以被簡單地設置為參考已經存在于共享存儲器中的運行時表示。第二種用于處理運行時表示和類加載器的技術不是共享它們,而是保證它們在每一個VM中被置于固定的位置。換句話說,每一個類的運行時表示和類加載器在每一個VM中必須被置于相同的固定地址。然后,對每一個對象實例中運行時表示的引用可以被設置到相應于該對象實例的類的運行時表示的位置。利用這種方法,無論對象實例被從共享存儲器映射還是復制到地址空間中,對運行時表示的引用都是有效的。但是,固定每一個類的運行時表示的位置可能不實用。因此,用于處理運行時表示和類加載器的第三種方法是在對象實例被復制到VM中時調整對每一個對象實例的運行時表示的引用。和前面的技術一樣,在這種技術中不共享運行時表示和類加載器——即每一個VM為每一個類存儲其自己的運行時表示和類加載器。但是,和前面的技術不同,這種技術不要求每一個運行時表示和類加載器的位置在每一個VM中固定。相反,運行時表示和類加載器的位置在每一個VM中可以不同。當對象實例被復制到特定VM中時,合適的類運行時表示的位置被確定,并且對象實例中相應的引用被設置到那個位置。用于處理運行時表示的第三種技術——調整每一個VM中對運行時表示的引用——排除了將對象實例同時映射到多個VM的可能。這是因為如前所示,被共享的對象實例不能具有對任何專用堆的引用。由于第三種技術調整引用以便參考每一個VM中的專用運行時表示,所以該技術只能在對象被復制到VM的地址空間中時使用,或者在對象一次只被一個VM訪問的其他情況中(例如在對象實例可以被“排它地”映射,所以當對象實例被映射到一個VM中時,沒有其他的VM能夠映射該對象實例的實施方案中)使用。上面討論的第三種技術在集群架構中可能有用,在集群架構中,VM可以在多個物理機器上執(zhí)行。運行時表示一般不被跨越多個物理機器共享,所以當對象實例被跨越多個物理機器共享時(例如當在一個物理機器上的VM中正被使用的對象實例被傳送到第二個物理機器以便在該機器上的VM中使用時),必須調整對運行時表示的引用。圖10示出了用于跨越多個機器使用對象的技術。該技術是上面討論的用于處理運行時表示的第三種技術的一般化版本,它包括在源運行時系統(tǒng)中可以執(zhí)行的某些操作和在目標運行時系統(tǒng)中可以執(zhí)行的某些操作的組合。圖10中的過程1000示出了在源運行時系統(tǒng)中可以執(zhí)行的操作的例子,并且過程1050示出了在目標運行時系統(tǒng)中可以執(zhí)行的操作的例子??偟膩碚f,該技術涉及產生和使用動態(tài)存根(stubonthefly)——對運行時元數(shù)據(jù)的引用被源運行時系統(tǒng)中的代理(proxy)代替,并且代理依次被用對目標運行時系統(tǒng)中的運行時元數(shù)據(jù)的引用代替。更具體地說,在過程1000中,在源運行時系統(tǒng)中首先標識要被與目標運行時系統(tǒng)共享或者在目標運行時系統(tǒng)中使用的對象的集合(1002)。例如,這個操作可能涉及標識源運行時系統(tǒng)中對象的共享閉包和驗證該共享閉包中的所有對象都是可共享對象實例,如圖6中的過程650。但是,這個操作也可能非常簡單——例如,可以選擇單個對象在目標運行時系統(tǒng)中使用(但是如果選擇了單個對象,則在被選擇的對象中對源運行時系統(tǒng)中的一個或更多個被引用對象的任何引用在目標運行時系統(tǒng)中將不是有效的,除非做出特殊的安排,例如通過將被引用的對象在兩個運行時系統(tǒng)中置于相同地址,或者如上面描述的那樣,調整被選擇對象中的引用。)然后遍歷被標識的對象集合中的對象。如果在對象集合中有更多的對象(判斷1004的“是”分支),則取出下一個對象(1006),并且將該對象中對運行時元數(shù)據(jù)的任何引用(例如對對象類的運行時表示的引用)用代理代替(1008)。在所有對象已經被遍歷之后(判斷1004的“否”分支),對象集合被發(fā)送到目標運行時系統(tǒng)(1010)。當然,過程1000中的操作可以被以不同的順序執(zhí)行——例如,代理可以被放在對象中,并且對象可以在整個對象集合已被標識之前被發(fā)送到目標運行時系統(tǒng)。例如,這些操作可以作為標識共享閉包的遞歸過程的一部分被動態(tài)地執(zhí)行。過程1050示出了在目標運行時系統(tǒng)中(例如在不同機器上執(zhí)行的不同于源VM的目標VM中)可以使用的相應過程。數(shù)據(jù)對象集合被接收(1052),并被復制到目標運行時系統(tǒng)中(1054)。然后遍歷接收到的對象集合中的對象。如果在接收到的對象集合中有更多的對象(判斷1056的“是”分支),則取出下一個對象(1058)。然后,標識相應于該對象的相關運行時信息(1060)。這些信息可以包括例如對象的運行時類。然后,基于運行時信息,對象中的代理可以被用對目標運行時系統(tǒng)中的運行時元數(shù)據(jù)的引用代替(1066)。例如,一旦已經標識了對象的運行時類,則該對象中運行時表示的代理可以被用在目標運行時系統(tǒng)中對該類的運行時表示的引用代替。在某些情況中,在將對象中的一個或更多個代理用對目標運行時系統(tǒng)中的運行時元數(shù)據(jù)的引用代替之前,首先進行檢查以便確定這些元數(shù)據(jù)是否已經被加載到目標運行時系統(tǒng)中。如果元數(shù)據(jù)還未被加載到目標運行時系統(tǒng)中(判斷1062的“否”分支),則可以按需要加載元數(shù)據(jù)(1064)。例如,在將代理用對運行時表示的引用代替之前,可以調用類加載器將類的所述運行時表示加載到VM中。和過程1000一樣,可以以不同的順序執(zhí)行過程1050中的操作——例如,當接收到對象時(即在已經接收到整個對象的集合之前),可以將代理用對運行時元數(shù)據(jù)的引用代替。進一步的變化也是可能的。例如,在接收到對象時或者在“按需要”的基礎上(例如當對象在目標運行時系統(tǒng)中被首次訪問時),代理可以被用對運行時元數(shù)據(jù)的引用代替。上面討論的技術,包括共享閉包的創(chuàng)建和使用,以及對運行時元數(shù)據(jù)引用的處理,是將一個運行時系統(tǒng)中的復雜數(shù)據(jù)結構分解并以另一個運行時系統(tǒng)的本機格式重裝所述數(shù)據(jù)結構的一般概念的特定實施方案。例如,這些技術可用來在服務器環(huán)境中共享對象,在服務器環(huán)境中,復雜數(shù)據(jù)結構是堆(或其一部分,例如堆內的對象集合),并且運行時系統(tǒng)是VM。下面更詳細地提供了使用上面的技術的例子。圖11是用于在服務器中使用共享對象的范例過程1150的流程圖。過程1150示出了共享對象可以怎樣被結合可連接進程VM使用。在過程1150中,為用戶會話創(chuàng)建VM(1152),并且對象的共享閉包被創(chuàng)建并存儲在共享存儲器中(1154)。當服務器接收到相應于用戶會話的用戶請求時(1156),它從分配給服務器的進程池中選擇可用進程(1158),并將為該用戶會話創(chuàng)建的VM綁定到被選擇的進程(1160)。如果VM不需要訪問共享閉包中的對象(判斷1162的“否”分支),則VM可以簡單地處理請求(1164),在那之后VM可以從進程解除綁定(1166)。然后,進程可以被返回到可用進程池,并且服務器在其接收到新請求時(1156)可以再次將VM綁定到所述進程。在另一方面,如果VM的確需要訪問共享閉包中的對象(判斷1162的“是”分支),則共享閉包被與該VM相關聯(lián)??梢杂酶鞣N方法將共享閉包與VM相關聯(lián)——例如,可以通過將共享閉包映射或者復制到被選擇的進程的地址空間中將共享閉包綁定到被選擇的進程。共享閉包與VM相關聯(lián)的確切方式依賴于VM所需要的訪問類型。如上所示,在一個服務器實施方案中,被映射的共享閉包總是被限于只讀訪問,以便防止映射VM通過將成員變量設置為在其他VM中無效的值而打破共享閉包中的共享對象實例。在這樣的實施方案中,如果在過程1150中和用戶會話相關聯(lián)的VM只需要對對象的讀訪問(即如果VM不需要修改共享閉包中的任何對象,如判斷1168的“否”分支所指示的那樣),則共享對象可以被映射到被選擇的進程的地址空間中(1170)。然后,VM可以處理請求(1164),按需要從共享對象讀取信息。如果VM需要對共享對象的讀-寫訪問(即如果VM需要修改一個或更多個對象,如判斷1168的“是”分支所指示的那樣),則共享閉包被復制到被選擇的進程的地址空間中(1172)。然后VM具有對共享對象完整的讀-寫訪問,并且它能夠按需要處理請求并修改對象(1174)。當VM完成修改共享對象時,它能夠將共享閉包復制回共享存儲器(1176)。如先前所指示的那樣,在一個服務器實施方案中,通過重新創(chuàng)建共享閉包(例如通過調用“創(chuàng)建”函數(shù),將先前使用過的同一名稱分配給共享閉包,并且如果在共享存儲器中仍存在具有那個名稱的舊版本共享閉包,則創(chuàng)建新版本的共享閉包),可以將共享閉包復制到共享存儲器。和前面一樣,在請求已被處理以后,VM可以被從進程解除綁定(1166),進程可以被返回可用進程池,并且服務器能夠再次等待接收新請求(1156)。共享閉包中的對象可以包括任何類型的對象,包括存儲用戶上下文信息的對象,如下面的例子中所討論的那樣。而且,盡管過程1150只示出了一個訪問共享閉包的VM,但是共享閉包也可以被其他的VM訪問(例如,其他的VM可以映射或復制該共享閉包,從而訪問該共享閉包中的對象)。共享虛擬機圖2和圖3中所示的服務器實施方案很適于用戶會話相應于較大的用戶上下文的環(huán)境。但是,這些實施方案在用戶上下文相當小(例如均小于10千字節(jié))的環(huán)境中可能不是最佳的。即使具有在VM之間共享對象的能力,在這種環(huán)境中為每一個用戶會話分配單獨的VM可能也不實用,因為它導致每用戶會話巨大的開銷。圖12示出了服務器200的不同的實施方案,所述實施方案在預期用戶上下文相當小的環(huán)境中使用可能更實用。不是為每一個用戶會話創(chuàng)建一個VM,圖12中所示的服務器200的實施方案使用共享VM(例如VM301、303、305、307和309)的池300。服務器200為每一個用戶會話創(chuàng)建用戶上下文(例如用戶上下文501、503、505、507、509、511、513、515和519)。用戶上下文被存儲在共享存儲器區(qū)域255中,VM池300中的VM也是一樣。和先前所討論的實施方案一樣,服務器200使用工作進程(例如工作進程401、403、404和409)的池400和分派器進程410。在工作中,圖12中所示的服務器200的實施方案如下工作。當服務器200接收到用戶請求時,分派器進程410從工作進程池400選擇可用的工作進程(例如工作進程404),并將用戶請求分派給被選擇的工作進程404。然后,工作進程404從VM池300選擇可用的VM(例如VM305)。然后,通過將VM305從共享存儲器255映射到被選擇的工作進程404的地址空間中,將被選擇的VM305綁定到被選擇的工作進程404。接著,工作進程404標識相應于用戶請求的用戶會話和相關聯(lián)的用戶上下文(例如用戶上下文501)。然后,例如通過將用戶上下文501從共享存儲器區(qū)域255復制到工作進程404的地址空間中,將被標識的用戶上下文501綁定到工作進程404?,F(xiàn)在,通過聯(lián)合用戶上下文501在工作進程404中執(zhí)行VM305,可以處理用戶請求。為了標識相關的用戶上下文和將該上下文與被選擇的VM相關聯(lián),其他的實施方案是可能的。例如,分派器進程410能夠標識相關的用戶上下文并將標識該上下文的信息傳遞到被選擇的VM,然后,該用戶上下文(例如構成該上下文的對象的共享閉包)可以被映射或者復制到被選擇的工作進程的地址空間中,所述被選擇的工作進程代表被選擇的VM。在概念上,這可以被看作這樣的次序,其中被標識的用戶上下文被插入被選擇的VM,然后,被選擇的VM被插入被選擇的工作進程,盡管從技術角度,可以通過簡單地將代表被選擇的VM和被標識的用戶上下文的共享存儲器部分映射或者復制到被選擇的工作進程的地址空間中來完成這個概念步驟。當請求已經被處理之后,VM305和用戶上下文501被從工作進程404解除綁定(例如通過將VM305從工作進程404解除映射,以及將用戶上下文501復制回共享存儲器區(qū)域255)。然后,VM305和工作進程404被再次標記為可用,并且它們可被用來處理服務器200接收到的額外請求。當然,VM305和工作進程404在處理新請求時可能不配對在一起——例如,如果新請求被分派給工作進程404并且VM305忙于處理另一個請求,則工作進程404必須從VM池300選擇另一個VM(或者等待VM池300中的VM變得可用)。以這種方式,在圖12中所示的服務器實施方案中的VM被共享(即服務器不是每用戶會話分配一個VM),卻彼此隔離,因為每一個VM一次只專用于一個用戶會話。而且,由于每一個VM均在隔離的進程中運行,如果VM崩潰了,則這樣的崩潰可能只影響相應于正在崩潰的VM中被處理的請求的用戶會話(依賴于操作系統(tǒng)將進程彼此隔離得有多好)。因此,這種使用共享但專用VM池的方法導致了穩(wěn)健的服務器,但是具有比先前討論的實施方案更少的開銷。在為每一個用戶會話分配一個VM的服務器實施方案中,可用使用各種優(yōu)化來實現(xiàn)相同的益處——減小的開銷。例如,在VM相應的用戶會話末尾VM不是被終結,而是可以重用所述VM。即,VM可被與不同的用戶會話相關聯(lián)并用來處理相應于新的用戶會話的請求。盡管有幫助,但是在存在大量同時發(fā)生的用戶會話時,這種方法仍要求巨大的開銷,因為服務器需要為每一個用戶會話實例化至少一個VM。相反,圖12中所示的服務器實施方案將VM的數(shù)量限制為有多少VM被分配給VM池300。如先前所討論的那樣,這個實施方案很適于具有大量同時發(fā)生的用戶會話和較小的用戶上下文的環(huán)境。這樣的環(huán)境一般可用由方程P<=V<<U刻畫,其中,P是分配給工作進程池400的工作進程的數(shù)量,V是分配給VM池的VM的數(shù)量,并且U是正被服務器處理的用戶會話的數(shù)量。這個方程的左邊部分指示,分配給VM池的VM的數(shù)量一般應該大于或等于工作進程池中的工作進程的數(shù)量(因為否則即使所有的VM都在被使用,也將存在某些空閑的未使用進程)。方程的右邊部分指示,VM的數(shù)量可用遠遠小于用戶會話的數(shù)量。再一次地,這是可能的,因為每一個VM可以被不同的用戶會話共享,盡管不是在同一時間。通過在VM之間共享對象實現(xiàn)了圖12中所示的服務器200的實施方案。在圖3中所示的服務器實施方案中,每一個用戶上下文(例如用戶上下文301)被與一個VM(例如VM501)相關聯(lián)了相應的用戶會話的壽命那么長時間,并且,當從相應的用戶會話接收到用戶請求時,該用戶上下文和其相關聯(lián)的VM都被映射到工作進程中。因此,在圖3中的實施方案中,每一個VM被與一個用戶會話相關聯(lián),并且VM只能訪問相關聯(lián)的用戶上下文——VM不可能訪問相應于另一個會話的用戶上下文。例如,VM301只能訪問用戶上下文501,并且VM303只能訪問用戶上下文503。因此,每一個VM只能處理相應于其相關聯(lián)的用戶上下文的請求。但是,上面討論的共享技術使得VM有可能共享對象,包括構成用戶上下文的對象。例如,用戶上下文可以被作為共享閉包存儲在共享存儲器堆中。然后,共享閉包——因而用戶上下文——可以被多個VM訪問。因此可以如下描述圖12中所示的服務器實施方案首先,將VM和用戶上下文與彼此解除關聯(lián);其次,用戶上下文被存儲在可被VM池中的所有VM訪問的共享存儲器堆中;最后,通過將相應的用戶上下文和可用的VM映射到可用工作進程中來處理用戶請求。在圖13中概念性地示出了上面的方案。如圖13中那樣,圖13中的VM和用戶上下文被存儲在共享存儲器區(qū)域255中。但是,和圖3中不同,圖13中的VM不再被與特定用戶上下文相關聯(lián)——任何可用的VM均能和任何用戶上下文一起工作。例如,在圖3中,VM301只能與其相關聯(lián)的用戶上下文501一起工作。相反,在圖13中,VM301能夠與共享存儲器中的任何一個用戶上下文一起工作,例如用戶上下文519。在某些實施方案中,一旦VM已經和一個用戶上下文配對,則該VM必須和該用戶上下文保持配對,直到相應的用戶請求已經被處理為止。具體來說,在處理當前用戶請求時,即使VM當前被阻塞(例如因為它正等待I/O事件),該VM也不能被標記為可用并被用來處理另一個用戶請求。例如,在Java實施方案中,在請求正被處理時,不容易將VM(它包括VM堆和VM堆棧)從用戶上下文(它包括用戶堆和用戶堆棧)分開,因為VM堆棧被與用戶堆?;旌显谝黄稹R虼?,VM必須和該用戶上下文保持配對,直到相應的請求被處理并且用戶堆棧變空為止。圖14根據(jù)上面的方案示出了VM和用戶上下文的配對。在服務器接收到相應于用戶上下文501的請求之前,用戶上下文501被存儲在共享存儲器中,并且VM301可用于處理相應于任何用戶上下文的請求。當接收到相應于用戶上下文501的請求時(1402),用戶上下文501和VM301都被綁定到工作進程401。因此,當VM301利用用戶上下文501在工作進程401中運行時,用戶上下文501和VM301被與彼此配對。在處理請求時的某一點,VM中所有的線程或者協(xié)同例程可以阻塞(例如,如果它們都在等待I/O事件完成)。當它發(fā)生時(1404),VM301和用戶上下文501被從工作進程401解除綁定,從而釋放工作進程401來作用于另一個請求。但是,VM301未被標記為可用——它和用戶上下文501保持配對,并保持空閑,直到至少一個線程能夠再次運行為止(例如當被指示的I/O事件完成時)。當它發(fā)生時(1406),VM301和用戶上下文501能夠被再次綁定到工作進程,以便VM能夠繼續(xù)利用該用戶上下文執(zhí)行。VM301和用戶上下文501可以不被綁定到它們先前被綁定到的同一工作進程401——例如,如果另一個VM當前被綁定到工作進程401,則VM301和用戶上下文501被綁定到另一個可用的工作進程。最后,當請求已被處理并且響應被發(fā)送時(1408),VM301和用戶上下文501被從工作進程解除綁定。用戶上下文501被再次存儲在共享存儲器中,并且VM301和工作進程都被標記為可用,以便作用于另一個請求。圖15是示出用于在圖12中所示的服務器實施方案中處理請求的范例過程1550的流程圖。在過程1550中,操作系統(tǒng)進程池和VM池被首先初始化(1552)。為每一個用戶會話創(chuàng)建用戶上下文,并且所述用戶上下文被存儲在服務器中的共享存儲器區(qū)域中(1554)。例如,每一個用戶上下文可以被作為對象的共享閉包存儲。當服務器從用戶會話接收到請求時(1556),它標識相應的用戶上下文(1558),并從工作進程池選擇可用進程(1560)以及從VM池選擇可用VM(1562)。然后,被選擇的VM被綁定到被選擇的進程(1564)(例如,通過將VM從共享存儲器區(qū)域映射到被選擇進程的地址空間中)。在VM可以被用來處理請求之前,用戶上下文必須被與VM相關聯(lián)(1566)。例如,這可以通過將用戶上下文綁定到被選擇的進程完成。如上所述,在一個實施方案中,如果共享閉包被復制到了進程中,則對該共享閉包中對象的訪問不受限制,但是,如果該共享閉包被映射到進程中,則被限于只讀訪問。在這樣的實施方案中,用戶上下文被復制而不是映射到進程中,因為VM在處理請求的過程中可能需要修改用戶上下文。但是,其他的實施方案是可能的——例如,用戶上下文可以被映射到進程中,并且可以設置鎖定變量,以便防止其他的進程或者VM在映射進程中的VM使用并可能修改那些對象時,訪問該用戶上下文中的對象。為了給予被選擇的VM和進程對用戶上下文的排他訪問,額外的變化是可能的。一旦被選擇的VM已經被綁定到被選擇的進程并且用戶上下文已經被與VM相關聯(lián),則通過在進程中利用用戶上下文執(zhí)行VM可以處理請求(1568)。如上所述,在一個實施方案中,如果由于某個原因VM阻塞并且不能繼續(xù)處理(例如,如果VM正等待I/O事件發(fā)生),則VM可以被從工作進程解除綁定。然后,該工作進程可以被標記為可用,并被用來作用于另一個請求。該VM也可以被標記為可用并被用來處理另一個請求,除非直到已經完成用戶請求的處理才可能將VM和用戶上下文解除關聯(lián)。在后一情況下,VM必須和用戶上下文保持配對。當VM不再被阻塞時,VM和用戶上下文可以再次被綁定到可用工作進程,并且VM能夠繼續(xù)處理用戶請求。當用戶請求已被處理時,將VM綁定到工作進程和將用戶上下文和VM相關聯(lián)的操作可以被逆轉——例如,用戶上下文可以被和VM解除關聯(lián)(1570),并且VM可以被從工作進程解除綁定(1572)。用戶上下文被和VM解除關聯(lián)的方式依賴于用戶上下文被與VM相關聯(lián)的方式。如上所述,在一個實施方案中,用戶上下文被復制到被綁定到該VM的進程中,在這種情況下,通過將用戶上下文復制回共享存儲器區(qū)域,可以將用戶上下文和VM解除關聯(lián)。還是和先前所描述的一樣,在某些實施方案中,如果現(xiàn)有版本的用戶上下文仍存在于共享存儲器區(qū)域中,則將用戶上下文復制到共享存儲器區(qū)域中可能導致創(chuàng)建新版本的用戶上下文。和將VM綁定到工作進程一樣,將VM從工作進程解除綁定也可以是簡單的低成本操作??梢院唵蔚貙⒐蚕泶鎯ζ鞯腣M塊從工作進程的地址空間解除映射。在用戶上下文已經被和VM解除關聯(lián)并且VM已經被從工作進程解除綁定以后,VM和工作進程都可以被標記為可用,并被服務器用來處理其他的請求。過程1550中的操作可以被按不同的順序(例如,可用進程的選擇可以發(fā)生在可用VM的選擇之前、之后或者甚至同一時間)并由服務器的不同部件執(zhí)行。例如,分派器進程(例如圖12中的分派器進程410)可以選擇可用工作進程,并簡單地將用戶請求傳送到被選擇的進程,由進程決定選擇可用VM,將VM綁定到進程,標識相應于用戶請求的用戶上下文,并將用戶上下文和被選擇的VM相關聯(lián)。或者,分派器進程可以自己執(zhí)行那些操作中的一些——例如,分派器進程能夠選擇可用的VM,標識相關的用戶上下文,并將被選擇的VM和被標識的用戶上下文的標識發(fā)送到工作進程。其他的選擇是可能的,其中,分派器進程、工作進程或者服務器中額外的部件執(zhí)行這些操作。上面描述的技術,包括共享對象和用戶上下文,也可以在其他的環(huán)境中使用。例如,可以在VM未被連接到進程并從進程分離的服務器實施方案中使用這些技術。圖16是示出用于在這種服務器中處理請求的范例過程1650的流程圖。在過程1650中,工作進程池被分配給服務器,并且在每一個工作進程中初始化VM(1652)。在VM的壽命期內,每一個VM被綁定到其工作進程,意味著該VM不能被從該工作進程分離并被連接到另一個工作進程。和在過程1550中一樣,為每一個用戶會話創(chuàng)建用戶上下文,并將其存儲在服務器中的共享存儲器區(qū)域中(1654)。當服務器從用戶會話接收到請求時(1656),它標識相應的用戶上下文(1658),并從工作進程池選擇可用的進程(1660)。然后,用戶上下文被和被選擇的進程中的VM相關聯(lián)(1666)(例如,通過將用戶上下文綁定到被選擇的進程)。然后,通過利用用戶上下文在被選擇的進程中執(zhí)行VM可以處理請求(1668)。當用戶請求已經被處理時,用戶上下文可以被和VM解除關聯(lián)(1670)(例如,通過將用戶上下文從被選擇的進程復制回共享存儲器區(qū)域)。然后,工作進程(及其相關聯(lián)的VM)可以被標記為可用,并被服務器用來處理其他的請求。從圖15和圖16的比較可以看出,過程1550和1650類似,只不過后一過程不包括將VM綁定到工作進程和將其從工作進程解除綁定的操作。盡管過程1650包括更少的操作,但是實施該過程的服務器——即其中VM不被連接到工作進程并從工作進程分離的服務器——不太可能和使用可連接進程VM的服務器一樣有效率,因為在前一服務器中當VM阻塞時,VM在其中執(zhí)行的工作進程不能被用來處理其他的請求。相反,在具有可連接進程VM的服務器中,當VM阻塞時,該VM可以被從其工作進程分離,并且另一個VM可以被連接到它的位置并被用來作用于另一個請求。本說明書中描述的技術的各種替代和優(yōu)化是可能的。例如,通過將所有VM公有的數(shù)據(jù)存儲在共享存儲器中,并將這些數(shù)據(jù)映射到所有的工作進程中,可以進一步改善資源消耗和性能。如果類型信息(例如被加載的Java類的運行時表示)被以這種方式共享,則針對每一個VM用于類加載、驗證和解析的開銷可以降低。又例如,可以使用另外的機制來共享數(shù)據(jù)和信息(既包括VM也包括用戶上下文)——例如,可以通過使用文件或消息系統(tǒng)而非共享存儲器來共享信息。但是,這樣的機制可能不像共享存儲器一樣令人期望,因為它們可能需要更復雜或更昂貴的操作來使得要被共享的信息持久和非持久。又例如,為了獲得期望的結果,這里描述的過程不要求示出的特定次序或者順序。例如,在圖15和圖16中繪出的過程中,創(chuàng)建、標識和將用戶上下文與VM相關聯(lián)的操作可以被在整個過程內很多不同的地方執(zhí)行。在這里所描述的過程的某些實施方案中,多任務和并行處理可能更佳。而且,可以使用各種部件或者實體來執(zhí)行這里所描述的過程中的操作。例如,過程1550中的操作可以由服務器內不同的部件執(zhí)行。例如,在一個實施方案中,分派器進程(例如圖12中的分派器進程410)選擇可用的工作進程,并簡單地將用戶請求傳送到被選擇的進程,由進程決定選擇可用的VM,將VM綁定到進程,標識相應于用戶請求的用戶上下文,并將用戶上下文和被選擇的VM相關聯(lián)。或者,分派器進程可以自己執(zhí)行那些操作中的一些——例如,分派器進程能夠選擇可用的VM,標識相關的用戶上下文,并將被選擇的VM和被標識的用戶上下文的標識發(fā)送到工作進程。其他的選擇是可能的,其中,分派器進程、工作進程或者服務器中額外的部件執(zhí)行這些操作。例如,沒有分派器進程就可以實施服務器,并且可以使用另一種機制在工作進程之間分布請求。本發(fā)明以及本說明書中描述的所有功能操作,可以被實施在數(shù)字電子電路中或計算機軟件、固件或硬件中,或者被實施在其組合中,所述計算機軟件、固件或硬件包括在本說明書中公開的結構裝置及其結構等同物。本發(fā)明可以被實施為一個或更多個計算機程序產品,即一個或更多個有形地具體實施在信息載體中的計算機程序,例如,具體實施在機器可讀存儲設備中或者在供數(shù)據(jù)處理裝置執(zhí)行或控制其操作的傳播信號中,該數(shù)據(jù)處理裝置例如是可編程處理器、計算機或多個計算機。計算機程序(也被稱為程序、軟件、軟件應用或代碼)可以用任何形式的編程語言書寫,包括匯編或解釋語言,并且它可以被以任何形式部署,包括作為獨立程序或作為模塊、部件、子例程或其他適于在計算機環(huán)境中使用的單元。計算機程序不必對應于文件。程序可被存儲在文件的一部分中,該文件可以具有其它程序或數(shù)據(jù),程序可以被存儲為專用于所關心的程序的單一文件,或者,程序可以被存儲為多個協(xié)調的文件(例如存儲一個或多個模塊、子程序或代碼部分的多個文件)。計算機程序可以被部署成在一個或多個計算機上執(zhí)行,所述計算機在一個地點或跨過多個地點分布,并通過通信網絡互連。這里所描述的過程和邏輯流,包括本發(fā)明的方法步驟,可以由一個或更多個可編程處理器執(zhí)行,所述處理器執(zhí)行一個或更多個計算機程序,以便通過操作輸入數(shù)據(jù)并產生輸出來執(zhí)行本發(fā)明的功能。所述過程和邏輯流也可以由專用邏輯電路執(zhí)行,并且本發(fā)明的裝置可以被實施為專用邏輯電路,所述專用邏輯電路例如FPGA(現(xiàn)場可編程門陣列)或ASIC(專用集成電路)。例如,適于計算機程序的執(zhí)行的處理器包括通用和專用微處理器,以及任何種類的數(shù)字計算機的任何一個或更多個處理器。通常,處理器將從只讀存儲器或隨機訪問存儲器或這兩者接收指令和數(shù)據(jù)。計算機的必要元件是用于執(zhí)行指令的處理器和用于存儲指令和數(shù)據(jù)的一個或更多個存儲器設備。通常,計算機也將包括一個或更多個海量存儲設備用于存儲數(shù)據(jù),或者計算機將被可操作地耦合成從所述海量存儲設備接收數(shù)據(jù)或將數(shù)據(jù)轉移到所述海量存儲設備,或者進行這兩者,所述海量存儲設備例如是磁盤、磁光盤或光盤。適于具體實施計算機程序指令和數(shù)據(jù)的信息載體包括所有形式的非易失存儲器,例如包括半導體存儲器,如EPROM、EEPROM和快閃存儲器器件;例如內置硬盤或可移動盤的磁盤;磁光盤;和CDROM和DVDROM盤。處理器和存儲器可以被專用邏輯電路補充或包含在專用邏輯電路中。本發(fā)明可以被實施在計算系統(tǒng)中,所述計算系統(tǒng)包括后端部件(例如數(shù)據(jù)服務器),或者所述計算系統(tǒng)包括中間件部件(例如應用服務器);或者所述計算系統(tǒng)包括前端部件(例如具有圖形用戶界面或網絡瀏覽器的客戶端計算機,用戶可以通過所述圖形用戶界面或網絡瀏覽器和本發(fā)明的實施方案進行交互作用),或者,所述計算系統(tǒng)可以包括這些后端、中間件或前端部件的任意組合。系統(tǒng)的部件可以通過任何數(shù)字數(shù)據(jù)通信的形式或介質互連,例如通信網絡。通信網絡的例子包括局域網(“LAN”)和廣域網(“WAN”),例如國際互聯(lián)網。計算系統(tǒng)可以包括客戶端和服務器。客戶端和服務器通常彼此距離遙遠,并且一般通過通信網絡交互作用。通過在各自計算機上運行并且彼此具有客戶端-服務器關系的計算機程序產生了客戶端和服務器的關系。已經按照具體實施例描述了本發(fā)明,但是其他的實施例可以被實施并處于所附權利要求書的范圍內。例如,如上所述,本發(fā)明的操作可以被按不同的次序執(zhí)行并仍獲得期望的結果。其他的實施例處于所附權利要求書的范圍內。權利要求1.一種計算機程序產品,存儲在機器可讀介質上,所述計算機程序產品可運行,以便使得數(shù)據(jù)處理裝置接收第一數(shù)據(jù)對象的標識,所述第一數(shù)據(jù)對象是第一運行時類的實例;確定所述第一運行時類是否可共享;確定所述第一數(shù)據(jù)對象是否引用一個或更多個被引用的數(shù)據(jù)對象;以及如果所述第一數(shù)據(jù)對象引用了一個或更多個被引用的數(shù)據(jù)對象,則遍歷所述一個或更多個被引用的數(shù)據(jù)對象;針對每一個被遍歷的數(shù)據(jù)對象,確定所述被遍歷的數(shù)據(jù)對象是其實例的運行時類是否可共享。2.如權利要求1所述的計算機程序產品,其中,遍歷所述一個或更多個被引用的數(shù)據(jù)對象包含遞歸地遍歷所述一個或更多個被引用的數(shù)據(jù)對象的傳遞閉包中的每一個數(shù)據(jù)對象。3.如權利要求1或2所述的計算機程序產品,其中,所述計算機程序產品還可運行,以便使得所述數(shù)據(jù)處理裝置如果所述第一運行時類可共享,并且每一個被遍歷的數(shù)據(jù)對象的運行時類均可共享,則將所述第一數(shù)據(jù)對象和每一個被遍歷的數(shù)據(jù)對象分組到一個對象組中;以及將所述對象組復制到共享存儲器區(qū)域中。4.如前面的權利要求中的任何一個所述的計算機程序產品,其中,所述計算機程序產品還可運行,以便使得所述數(shù)據(jù)處理裝置如果第一運行時類不可共享,或者至少一個被遍歷的數(shù)據(jù)對象的運行時類不可共享,則產生否定狀態(tài)指示。5.如前面的權利要求中的任何一個所述的計算機程序產品,其中,確定所述第一運行時類是否可共享包含確定所述第一運行時類先前是否已經被聲明為可共享。6.如前面的權利要求中的任何一個所述的計算機程序產品,其中,所述第一運行時類是從一個或更多個基類派生的,并且包含一個或更多個域,并且其中,確定所述第一運行時類是否可共享包含確定所述第一運行時類是否實施了串行化接口;確定在所述第一運行時類的對象實例的串行化或者解串行化期間是否執(zhí)行了定制代碼;確定是否所有基類都是可串行化的;確定是否所有域都被串行化;以及確定所述第一運行時類的所述對象實例是否影響垃圾回收。7.如權利要求6所述的計算機程序產品,其中,所述第一運行時類是Java類,并且其中,所述串行化接口是java.io.Serializable。8.如權利要求6或7所述的計算機程序產品,其中,確定是否執(zhí)行了定制代碼包含確定所述第一運行時類是否包含預先確定的方法集合中的一種方法。9.如權利要求8所述的計算機程序產品,其中,所述預先確定的方法集合包含readObject()、wirteObject()、readExternal()、writeExternal()、readResolve()和writeReplace()方法。10.如權利要求6到9中的任何一個所述的計算機程序產品,其中,確定是否所有基類都可串行化包含對于所述基類中的每一個類確定所述類是否實施了所述串行化接口;以及如果所述類未實施所述串行化接口,則確定所述類是否包括平凡缺省構造器。11.如權利要求6到10中的任何一個所述的計算機程序產品,其中,確定是否所有域都被串行化包含確定是否域中的任何一個為瞬態(tài)域。12.如權利要求6到11中的任何一個所述的計算機程序產品,其中,確定所有域是否都被串行化包含確定是否域中的任何一個為serialPersisitentFields域。13.如權利要求6到12中的任何一個所述的計算機程序產品,其中,確定所述第一運行時類的所述對象實例是否影響垃圾回收包含確定所述第一運行時類是否包含平凡終結器。14.如權利要求6到13中的任何一個所述的計算機程序產品,其中,所述第一運行時類是Java類,并且其中,確定所述第一運行時類的所述對象實例是否影響垃圾回收包含確定所述第一運行時類是否是從java.lang.ref.Reference類派生的。15.如權利要求6到14中的任何一個所述的計算機程序產品,其中,確定所述第一運行時類是否可共享還包含確定所述第一運行時類的運行時表示是否可共享;以及確定所述第一運行時類的類加載器是否可共享。16.如權利要求15所述的計算機程序產品,其中確定所述第一運行時類的運行時表示是否可共享包含確定所述運行時表示是否被存儲在第一預先確定的位置;以及確定所述第一運行時類的類加載器是否可共享包含確定所述類加載器是否被存儲在第二預先確定的位置。17.一種計算機程序產品,存儲在機器可讀介質上,所述計算機程序產品可運行,以便使得數(shù)據(jù)處理裝置接收第一運行時系統(tǒng)中的第一數(shù)據(jù)對象的標識,所述第一數(shù)據(jù)對象引用零個或更多個被引用的數(shù)據(jù)對象;標識數(shù)據(jù)對象的共享閉包,該數(shù)據(jù)對象的共享閉包由所述第一數(shù)據(jù)對象和所述被引用的數(shù)據(jù)對象的傳遞閉包組成;以及確定所述數(shù)據(jù)對象的共享閉包是否可在第二運行時系統(tǒng)中使用。18.如權利要求17所述的計算機程序產品,其中,所述第一運行時系統(tǒng)包含第一虛擬機并且所述第二運行時系統(tǒng)包含第二虛擬機。19.如權利要求18所述的計算機程序產品,其中,所述第一虛擬機和所述第二虛擬機是Java虛擬機或者公共語言運行時虛擬機。20.如權利要求17到19中的任何一個所述的計算機程序產品,其中,所述數(shù)據(jù)對象的共享閉包包括用戶上下文信息。21.如權利要求17到20中的任何一個所述的計算機程序產品,其中,確定所述共享閉包是否可在第二運行時系統(tǒng)中使用包含針對所述數(shù)據(jù)對象的共享閉包中的每一個數(shù)據(jù)對象,確定所述數(shù)據(jù)對象是否是無需執(zhí)行定制代碼就可串行化的。22.如權利要求17到21中的任何一個所述的計算機程序產品,其中,確定所述共享閉包是否可在第二運行時系統(tǒng)中使用包含針對所述數(shù)據(jù)對象的共享閉包中的每一個數(shù)據(jù)對象,確定所述數(shù)據(jù)對象是其實例的運行時類是否可共享。23.如權利要求22所述的計算機程序產品,其中,所述數(shù)據(jù)對象是其實例的所述運行時類是從一個或更多個基類派生的,并且包含一個或更多個域,并且其中,確定所述運行時類是否可共享包含確定所述運行時類是否實施了串行化接口;確定在所述運行時類的對象實例的串行化或者解串行化期間是否執(zhí)行了定制代碼;確定是否所有基類都是可串行化的;確定是否所有域都被串行化;以及確定所述運行時類的對象實例是否影響垃圾回收。24.如權利要求17到23中的任何一個所述的計算機程序產品,其中,所述計算機程序產品還可運行,以便使得所述數(shù)據(jù)處理裝置如果所述數(shù)據(jù)對象的共享閉包不可在所述第二運行時系統(tǒng)中使用,則產生否定狀態(tài)指示。25.如權利要求17到24中的任何一個所述的計算機程序產品,其中,所述計算機程序產品還可運行,以便使得所述數(shù)據(jù)處理裝置將數(shù)據(jù)對象的所述共享閉包復制到共享存儲器區(qū)域。26.如權利要求25所述的計算機程序產品,其中,所述計算機程序產品還可運行,以便使得所述數(shù)據(jù)處理裝置確定在所述共享存儲器區(qū)域中是否存在數(shù)據(jù)對象的所述共享閉包的先前版本;和將版本號和所述數(shù)據(jù)對象的共享閉包相關聯(lián)。27.一種計算機程序產品,存儲在機器可讀介質上,所述計算機程序產品可運行,以便使得數(shù)據(jù)處理裝置接收標識符;標識與所述標識符相關聯(lián)的共享閉包,該共享閉包被置于共享存儲器區(qū)域中,并由第一數(shù)據(jù)對象和被所述第一數(shù)據(jù)對象引用的數(shù)據(jù)對象的傳遞閉包組成;以及將所述共享閉包與運行時系統(tǒng)相關聯(lián)。28.如權利要求27所述的計算機程序產品,其中,所述運行時系統(tǒng)是Java虛擬機或者公共語言運行時虛擬機。29.如權利要求27或28所述的計算機程序產品,其中,標識所述共享閉包包含標識所述共享閉包的當前版本。30.如權利要求27到29中的任何一個所述的計算機程序產品,其中,將所述共享閉包與所述運行時系統(tǒng)相關聯(lián)包含將所述共享閉包映射到與所述運行時系統(tǒng)相關聯(lián)的地址空間中。31.如權利要求27到30中的任何一個所述的計算機程序產品,其中,將所述共享閉包與所述運行時系統(tǒng)相關聯(lián)包含防止對所述共享閉包的寫訪問。32.如權利要求30所述的計算機程序產品,其中,所述計算機程序產品還可運行,以便使得所述數(shù)據(jù)處理裝置在檢測到對所述共享閉包中的數(shù)據(jù)對象的第一次寫訪問時,將所述共享閉包復制到與所述運行時系統(tǒng)相關聯(lián)的所述地址空間中。33.如權利要求27到32中的任何一個所述的計算機程序產品,其中,將所述共享閉包與所述運行時系統(tǒng)相關聯(lián)包含將所述共享閉包復制到與所述運行時系統(tǒng)相關聯(lián)的地址空間中。34.如權利要求27到33中的任何一個所述的計算機程序產品,其中,所述計算機程序產品還可運行,以便使得所述數(shù)據(jù)處理裝置將所述共享閉包標記為已刪除。35.如權利要求34所述的計算機程序產品,其中,將所述共享閉包標記為已刪除包含防止所述共享閉包被與附加的運行時系統(tǒng)相關聯(lián)。36.一種用計算機實施的方法,包含接收第一數(shù)據(jù)對象的標識,所述第一數(shù)據(jù)對象是第一運行時類的實例;確定所述第一運行時類是否可共享;確定所述第一數(shù)據(jù)對象是否引用一個或更多個被引用的數(shù)據(jù)對象;以及如果所述第一數(shù)據(jù)對象引用了一個或更多個被引用的數(shù)據(jù)對象,則遍歷所述一個或更多個被引用的數(shù)據(jù)對象;針對每一個被遍歷的數(shù)據(jù)對象,確定所述被遍歷的數(shù)據(jù)對象是其實例的運行時類是否可共享。37.一種裝置,包含用于接收第一數(shù)據(jù)對象的標識的裝置,所述第一數(shù)據(jù)對象是第一運行時類的實例;用于確定所述第一運行時類是否可共享的裝置;用于確定所述第一數(shù)據(jù)對象是否引用一個或更多個被引用的數(shù)據(jù)對象的裝置;用于如果所述第一數(shù)據(jù)對象引用了一個或更多個被引用的數(shù)據(jù)對象,則遍歷所述一個或更多個被引用的數(shù)據(jù)對象的裝置;以及用于針對每一個被遍歷的數(shù)據(jù)對象,確定所述被遍歷的數(shù)據(jù)對象是其實例的運行時類是否可共享的裝置。38.一種用計算機實施的方法,包含接收第一運行時系統(tǒng)中的第一數(shù)據(jù)對象的標識,所述第一數(shù)據(jù)對象引用零個或更多個被引用的數(shù)據(jù)對象;標識數(shù)據(jù)對象的共享閉包,該數(shù)據(jù)對象的共享閉包由所述第一數(shù)據(jù)對象和所述被引用的數(shù)據(jù)對象的傳遞閉包組成;以及確定所述數(shù)據(jù)對象的共享閉包是否可在第二運行時系統(tǒng)中使用。39.一種裝置,包含用于接收第一運行時系統(tǒng)中的第一數(shù)據(jù)對象的標識的裝置,所述第一數(shù)據(jù)對象引用零個或更多個被引用的數(shù)據(jù)對象;用于標識數(shù)據(jù)對象的共享閉包的裝置,該數(shù)據(jù)對象的共享閉包由所述第一數(shù)據(jù)對象和所述被引用的數(shù)據(jù)對象的傳遞閉包組成;以及用于確定所述數(shù)據(jù)對象的共享閉包是否可在第二運行時系統(tǒng)中使用的裝置。40.一種用計算機實施的方法,包含接收標識符;標識與所述標識符相關聯(lián)的共享閉包,該共享閉包被置于共享存儲器區(qū)域中,并由第一數(shù)據(jù)對象和被所述第一數(shù)據(jù)對象引用的數(shù)據(jù)對象的傳遞閉包組成;以及將所述共享閉包與運行時系統(tǒng)相關聯(lián)。41.一種裝置,包含用于接收標識符的裝置;用于標識與所述標識符相關聯(lián)的共享閉包的裝置,該共享閉包被置于共享存儲器區(qū)域中,并由第一數(shù)據(jù)對象和被所述第一數(shù)據(jù)對象引用的數(shù)據(jù)對象的傳遞閉包組成;以及用于將所述共享閉包與運行時系統(tǒng)相關聯(lián)的裝置。全文摘要用于在運行時系統(tǒng)中共享數(shù)據(jù)對象的方法和裝置,包括計算機系統(tǒng)和程序產品。接收第一運行時系統(tǒng)中的第一數(shù)據(jù)對象的標識。所述第一數(shù)據(jù)對象引用零個或更多個被引用的數(shù)據(jù)對象。由所述第一數(shù)據(jù)對象和所述被引用的數(shù)據(jù)對象的傳遞閉包組成的數(shù)據(jù)對象共享閉包被標識,并確定數(shù)據(jù)對象的所述共享閉包是否可在第二運行時系統(tǒng)中使用。在某些實施方案中,確定共享閉包是否可在第二運行時系統(tǒng)中使用包括確定所述共享閉包中的每一個數(shù)據(jù)對象是否無需執(zhí)行定制代碼就可串行化,或者確定所述共享閉包中的每一個對象實例的運行時類是否可共享。使用共享閉包在運行時系統(tǒng)之間共享對象能夠在用戶會話之間提供隔離。文檔編號G06F9/46GK1989486SQ200580024787公開日2007年6月27日申請日期2005年5月20日優(yōu)先權日2004年5月20日發(fā)明者奧利弗·施米特,諾伯特·庫克,埃德加·洛特,馬丁·斯特拉斯伯格,阿爾諾·希爾根伯格,拉爾夫·施梅爾特申請人:Sap股份公司
網友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1