專利名稱:用于嵌入設(shè)備的java應(yīng)用程序管理程序的制作方法
在嵌入設(shè)備環(huán)境中,在設(shè)備上常安裝一個與硬件無關(guān)的處理機(jī)例如Java虛擬機(jī),以便允許下載程序和在設(shè)備上執(zhí)行。這樣一個系統(tǒng)允許一個以與硬件無關(guān)的語言例如Sun Micro Systems Java編寫的程序下載到任何硬件支持Java環(huán)境,以便為一特殊用途定制它。這個定制常被稱為設(shè)備的“個性”。多個應(yīng)用程序可以在一個嵌入設(shè)備一齊被運(yùn)行,以便確定該設(shè)備的個性。用這種方法可以使設(shè)備動態(tài)地以不同的獨(dú)特方式起作用。例如,一個嵌入設(shè)備如一臺冰箱可以被定制為自動地跟蹤其內(nèi)容。就象食物類型和同類食物的命名習(xí)慣可能隨文化背景不同而異一樣,嵌入設(shè)備冰箱可能通過下載一個描述食物類型和命名習(xí)慣的新的個性到Java使能嵌入冰箱設(shè)備來定制用戶的特定文化。
在嵌入設(shè)備域中,在設(shè)備上安裝一個與硬件無關(guān)的處理機(jī)例如Java虛擬機(jī),以便允許下載應(yīng)用程序和在設(shè)備上執(zhí)行。Java語言提供建造動態(tài)地裝載新程序的程序的基本功能。然而,Java語言不提供程序的裝入程序的實(shí)現(xiàn),也沒有能力在裝載后管理程序。Java語言也不提供在存儲器受限制的嵌入設(shè)備內(nèi)下載和管理應(yīng)用程序的工具。
幾種現(xiàn)有的Java技術(shù)支持程序的裝入程序類型的功能。SunMicrosystem’s Servlet API允許一個Java使能Web服務(wù)器動態(tài)地?cái)U(kuò)充服務(wù)器的能力。Servlet API主要被創(chuàng)建來替代Web服務(wù)器中典型的CGI功能。Servlets較之CGI類型程序的優(yōu)點(diǎn)包括與平臺無關(guān)、復(fù)用性(通過面向目標(biāo)技術(shù)重復(fù)使用Java類的能力)、性能效率(Servlet的可配置的啟動方式,其允許相同的Servlet實(shí)例處理許多請求)(與為每個至CGI原來的調(diào)用創(chuàng)建一個新進(jìn)程相反))和管理效率(基于Web服務(wù)器的Sun’s Java提供一個Java管理小應(yīng)用程序,其很容易管理增添的新Servlet類,以及啟動和停止Servlets)。
Servlet API通過委托所有Servlets實(shí)現(xiàn)三個方法init()、Service()和destroy()來規(guī)定一個Servlet的生存日期。當(dāng)Servlet第一次被調(diào)用時(shí),調(diào)用init()方法;Service()方法被調(diào)用來處理來自一個客戶的每個請求;以及當(dāng)Serlet被停止(即Web服務(wù)器關(guān)閉)時(shí)調(diào)用destroy()。Servlet API不直接支持存儲器管理或提供一個管理Servlets的公共包。
HP公司的Embedded Java Lab SmallWeb提供一個在JVM中執(zhí)行的至基于Java目標(biāo)的基于Web的接口。SmallWeb當(dāng)需要時(shí)可以裝載目標(biāo),同時(shí)對目標(biāo)提供一個把它們的功能(通過方法調(diào)用)轉(zhuǎn)出到Web瀏覽器的裝置。SmallWeb不直接提供停止應(yīng)用程序目標(biāo)或存儲器管理特性。此外,SmallWeb通常要求一個文件系統(tǒng),同時(shí)對某些嵌入環(huán)境,SmallWeb的輔助操作要求可能太大。
在許多嵌入領(lǐng)域中使用Java的一個問題是Java存儲器子系統(tǒng)的非確定的方面。Java語言的非確定存儲器管理方案允許通過一個垃圾回收站方法gc()回收未引用目標(biāo);然而,垃圾回收站沒有規(guī)定如何或何時(shí)回收這些目標(biāo)。原來的應(yīng)用程序一般通過調(diào)用JavaRuntime類gc()方法來使垃圾回收站出現(xiàn)。如果JVM運(yùn)行存儲器溢出,則出現(xiàn)一個OutofMemory.Error錯誤。雖然不必管理存儲器是Java語言的一個優(yōu)點(diǎn),但大多數(shù)嵌入應(yīng)用程序需要在如何管理存儲器方面較之在Java語言中目前提供的更嚴(yán)格的控制。需要更嚴(yán)格的控制是因?yàn)橛行┣度霊?yīng)用程序必須繼續(xù)在低存儲器環(huán)境中執(zhí)行。這一般通過在原來的非Java嵌入應(yīng)用程序中補(bǔ)充一個存儲器管理程序來解決,以確保為了繼續(xù)執(zhí)行有足夠存儲器仍是可用的。
因此,為了下載到Java使能嵌入設(shè)備中和控制在Java使能嵌入設(shè)備中的應(yīng)用程序的壽命,對通用方法存在一個需求。對一個存儲器管理處理程序也存在一個要求,存儲器管理處理程序處理在設(shè)備上執(zhí)行應(yīng)用程序期間檢測到的低存儲器或沒有存儲器的情況,同時(shí)該處理程序按照基于優(yōu)先的算法釋放存儲器。
本發(fā)明是一個新穎的系統(tǒng)和方法,用于管理在存儲器受限制的嵌入設(shè)備環(huán)境中應(yīng)用程序的下載和生存周期。一個基于Java的應(yīng)用程序管理程序控制在嵌入設(shè)備上安裝的單個Java虛擬機(jī)(JVM-JavaVirtual Machine)內(nèi)運(yùn)行的Java應(yīng)用程序的下載、執(zhí)行和高速緩存器。一個有網(wǎng)絡(luò)能力的應(yīng)用程序接口(API-Application ProgramInterface)被規(guī)定,它提供裝載類文件、啟動、初始化和停止應(yīng)用程序執(zhí)行的功能,以及在Java使能嵌入設(shè)備中存儲器管理的功能。本發(fā)明使嵌入設(shè)備能方便地重新編程以及單獨(dú)管理嵌入設(shè)備使用的硬件類型。
根據(jù)閱讀下面的詳細(xì)描述并結(jié)合附圖將會更好地理解本發(fā)明,在附圖中,同樣的參考標(biāo)志被用來標(biāo)記相同的元件,其中附圖如下所示
圖1是本發(fā)明工作的網(wǎng)絡(luò)系統(tǒng)的系統(tǒng)圖;圖2是本發(fā)明所實(shí)現(xiàn)的嵌入設(shè)備的方塊圖;圖3是說明應(yīng)用程序如何完成生命的流程圖;圖4是按照本發(fā)明實(shí)現(xiàn)的一個應(yīng)用程序管理程序的一個實(shí)施例的工作流程圖;圖5是按照本發(fā)明實(shí)現(xiàn)的一個應(yīng)用程序管理程序的一個實(shí)現(xiàn)的類圖;圖6是說明為執(zhí)行一個裝載操作在圖5所示的類之間通信的流程圖;圖7是說明為執(zhí)行一個啟動操作在圖5所示的類之間通信的流程圖;圖8是說明為執(zhí)行一個停止操作在圖5所示的類之間通信的流程圖;以及圖9是說明為處理一個存儲器溢出狀態(tài)在圖5所示的類之間通信的流程圖。
下面詳述嵌入設(shè)備的一種新穎的應(yīng)用程序管理程序。雖然本發(fā)明從Java環(huán)境的角度加以描述,但業(yè)內(nèi)專業(yè)人士將會懂得,本發(fā)明的原理適用于由處理以與硬件無關(guān)的語言編寫的代碼的一個與硬件無關(guān)的處理器組成的任何系統(tǒng)。
現(xiàn)在回到圖1,其中示出一個網(wǎng)絡(luò)系統(tǒng)10,其包含一個經(jīng)由網(wǎng)絡(luò)14與一嵌入設(shè)備20通訊的計(jì)算機(jī)系統(tǒng)12。網(wǎng)絡(luò)14可以是普通的陸上連接的有線網(wǎng)絡(luò)如LAN(局域網(wǎng))或WAN(廣域網(wǎng)),或者可以是一個無線網(wǎng)絡(luò),或者它們的任何組合。
計(jì)算機(jī)系統(tǒng)12在這個系統(tǒng)中用作為一個客戶,執(zhí)行一個客戶應(yīng)用程序2,其經(jīng)由一個客戶接口4通過網(wǎng)絡(luò)14與服務(wù)器設(shè)備(例如,嵌入設(shè)備20)相連。在這個例子中,客戶應(yīng)用程序又發(fā)送請求(例如,下載Appl3,啟動Appl3,停止Appl2)到嵌入設(shè)備20,其用作一個服務(wù)器以便服務(wù)該請求。客戶應(yīng)用程序2可以在計(jì)算機(jī)系統(tǒng)12上它自己的環(huán)境中執(zhí)行,或者用另一個辦法在一個Java使能Web瀏覽器(未示出)內(nèi)執(zhí)行,該瀏覽器包含它自己的Java虛擬機(jī)(JVM-JavaVirtual Machine)(未示出)。Web瀏覽器用嵌入的Java小應(yīng)用程序解釋W(xué)eb文件,Java小應(yīng)用程序規(guī)定主客戶應(yīng)用程序小應(yīng)用程序類文件的地點(diǎn)。Web瀏覽器啟動它的JVM并傳送客戶應(yīng)用程序小應(yīng)用程序類文件的地點(diǎn)到它自己的類裝入程序6。每個類文件知道它請求的任何附加的類文件的名字。這些附加的類文件可以來自于網(wǎng)絡(luò)14(即與網(wǎng)絡(luò)14相連的其它機(jī)器)或客戶計(jì)算機(jī)系統(tǒng)12。
嵌入設(shè)備20是一個Java使能設(shè)備,具有安裝在它上面的Java虛擬機(jī)(JVM)22。圖2是更詳細(xì)說明嵌入設(shè)備的一個方塊圖。嵌入設(shè)備20包括一個JVM22、一個由應(yīng)用程序高速緩存器52和數(shù)據(jù)高速緩存器54組成的存儲器50以及一個網(wǎng)絡(luò)接口25。JVM22包括一個類裝入程序42和一個執(zhí)行單元46。最好JVM22也包括一個字節(jié)代碼檢驗(yàn)器44,雖然在有些存儲器受限制的設(shè)備中這不可能實(shí)現(xiàn)。按照本發(fā)明,類裝入程序42采用本發(fā)明的應(yīng)用程序管理程序24來實(shí)現(xiàn)。應(yīng)用程序管理程序24是一個負(fù)責(zé)下載、執(zhí)行和高速緩存器其它基于Java的程序的Java程序。當(dāng)JVM22開始在嵌入設(shè)備20上執(zhí)行時(shí),它開始執(zhí)行應(yīng)用程序管理程序24。
應(yīng)用程序管理程序24是一個服務(wù)器設(shè)備,用作一個基于網(wǎng)絡(luò)的類裝入程序,能通過網(wǎng)絡(luò)14經(jīng)由一個網(wǎng)絡(luò)協(xié)議48接收應(yīng)用程序類文件40,并把在應(yīng)用程序類文件40中包含的應(yīng)用程序類傳到文件中。如本專業(yè)技術(shù)人員所知,一個類文件40是包括與硬件體系結(jié)構(gòu)無關(guān)的由Java編譯程序產(chǎn)生的字節(jié)代碼的一個文件。字節(jié)代碼僅由JVM例如JVM22才可執(zhí)行。應(yīng)用程序管理程序24是一個非典型的基于網(wǎng)絡(luò)的Classloader,根據(jù)需要從網(wǎng)絡(luò)14裝載類40。不是象由典型類裝入程序通常所做的那樣通過Javaload Class()方法裝載類文件40,應(yīng)用程序管理程序24代之以在服務(wù)器套接字或其它協(xié)議48上等待下載類文件40的一個請求。當(dāng)接收到一個下載請求時(shí),應(yīng)用程序管理程序24從網(wǎng)絡(luò)14接收類文件40,把它傳到類28a、28b,然后調(diào)用JavaClassLoader.define class()方法。類28a、28b應(yīng)被解析以確保通過調(diào)用JavaClass Loader、resolve Class()方法它準(zhǔn)備好用于目標(biāo)實(shí)例。
圖3說明應(yīng)用程序26a、26b、26c如何帶來生命力。如圖所示,這通過例示一個應(yīng)用程序的Java類28a、28b,創(chuàng)建類28a、28b的一個實(shí)例目標(biāo)30a、30b、30c,然后調(diào)用在目標(biāo)30a、30b、30c上的一個main方法以運(yùn)行應(yīng)用程序26a、26b、26c來完成。相同應(yīng)用程序的多個實(shí)例可以通過創(chuàng)建相同Java類的多個實(shí)例同時(shí)被執(zhí)行。例如,如圖3所示,目標(biāo)30a和30b是相同類28a的實(shí)例,而目標(biāo)30c是不同類28b的一個實(shí)例。因此,應(yīng)用程序26a和26b是相同應(yīng)用程序的不同實(shí)例,其可以同時(shí)運(yùn)行,而應(yīng)用程序26c是一個完全不同的應(yīng)用程序。
應(yīng)用程序管理程序24提供下載、啟動、停止、查詢和存儲器管理能力。為了通過網(wǎng)絡(luò)14提供這些能力,嵌入設(shè)備20包括一個實(shí)現(xiàn)網(wǎng)絡(luò)協(xié)議48的網(wǎng)絡(luò)接口25,其允許客戶12發(fā)送請求到嵌入設(shè)備20的應(yīng)用程序管理程序24。在優(yōu)選實(shí)施例中,網(wǎng)絡(luò)接口25使用由應(yīng)用程序管理程序24規(guī)定的一種通用Java語言應(yīng)用程序接口(API)對應(yīng)用程序管理程序24說話。通用API給遠(yuǎn)程設(shè)備例如計(jì)算機(jī)系統(tǒng)12提供規(guī)定設(shè)備20的所希望的管理的能力。附錄A列出在本發(fā)明示例性實(shí)施例中定義的APIs。
特別是,應(yīng)用程序管理程序24允許新應(yīng)用程序通過網(wǎng)絡(luò)14下載到設(shè)備20。在優(yōu)選實(shí)施例中,這經(jīng)由API的loadApplClass()方法來實(shí)現(xiàn)。loadApplClass()方法處理Java類文件40的下載和檢驗(yàn),把在類文件40中包含的應(yīng)用程序類28a、28b裝載到設(shè)備20上的Java環(huán)境,以及準(zhǔn)備通過采用一個Java解釋程序或一個Just in Time(JIT)編譯程序(未示出)例示應(yīng)用程序目標(biāo)30a、30b、30c來執(zhí)行的類28a、28b。應(yīng)用程序管理程序24也管理在嵌入設(shè)備20上的Java應(yīng)用程序26a、26b、26c的啟動和停止,以便允許在計(jì)算機(jī)系統(tǒng)12或其它連網(wǎng)設(shè)備上的一個用戶控制在嵌入設(shè)備20上所裝載的Java應(yīng)用程序26a、26b、26c的執(zhí)行。在優(yōu)選實(shí)施例中,這經(jīng)由通用API的StartAppl()方法和stopAppl()方法來完成。應(yīng)用程序管理程序24也允許查詢應(yīng)用程序信息例如哪個類目標(biāo)28a、28b目前被裝載,哪個類具有應(yīng)用程序?qū)嵗?0a、30b、30c,以及每個應(yīng)用程序?qū)嵗幱谑裁磮?zhí)行狀態(tài)(例如;“初始化”、“執(zhí)行”、“停止”)。這在優(yōu)選實(shí)施例中分別經(jīng)由方法applClasses( )、applications()和appllnstances()來完成。每個被裝載的類目標(biāo)28a、28b的名字在應(yīng)用程序管理程序24目標(biāo)內(nèi)被作為一個屬性,最好作為一個散列表被保存在一個應(yīng)用程序列表23中。應(yīng)用程序管理程序24也允許從Java環(huán)境中查詢信息,例如可用存儲器數(shù)量和總存儲器數(shù)量。在優(yōu)選實(shí)施例中,這個信息采用freeMemory()方法和totalMemory()方法來查詢。應(yīng)用程序管理程序24也提供存儲器管理能力,包括在一個已裝載應(yīng)用程序必須被卸載之前設(shè)置所要求的空閑存儲器數(shù)量的范圍的能力,以及設(shè)置卸載已高速緩存器的應(yīng)用程序的次序的能力。這在優(yōu)選實(shí)施例中采用SetFreeMemoryLimit()和SetFreeAppsFirst()方法來完成??臻e存儲器范圍和卸載應(yīng)用程序的次序可以采用getFreeMemoryLimit()和getFreeAppsFirstPolicy()方法來查詢。這個信息保存在應(yīng)用程序管理程序24目標(biāo)內(nèi)的一個散列表中,無論是作為每個應(yīng)用程序列表23入口的一個單獨(dú)字段,或是作為一個單獨(dú)的卸載優(yōu)先權(quán)列表21。
網(wǎng)絡(luò)協(xié)議48被用作提供經(jīng)由網(wǎng)絡(luò)接口25對應(yīng)用程序管理程序24的網(wǎng)絡(luò)訪問。網(wǎng)絡(luò)協(xié)議48可以按照幾種可供選擇的實(shí)施例中的任何一種來實(shí)現(xiàn)。
在第一個實(shí)施例中,網(wǎng)絡(luò)協(xié)議48采用Java遠(yuǎn)程方法支持(RMI)實(shí)現(xiàn)Java RMI允許在駐留在其它JVMs中的目標(biāo)上進(jìn)行直接方法調(diào)用。RMI一般要求大量存儲器以支持目標(biāo)連續(xù)、識別和方法發(fā)送。如果嵌入設(shè)備支持運(yùn)行RMI的高存儲器輔助操作,包括支持RMI名字服務(wù)器的運(yùn)行,那么RMI是一個好的實(shí)現(xiàn)選擇,如果與嵌入設(shè)備20相互作用的客戶應(yīng)用程序和應(yīng)用程序管理程序24是基于Java的話。其它分布式目標(biāo)機(jī)理(例如CORBA、DCOM)與RMI之間確實(shí)存在橋梁,同樣允許客戶以其它語言編寫。使用RMI,應(yīng)用程序管理程序24可以接受來自遠(yuǎn)程客戶12的直接調(diào)用,以裝載、啟動和管理應(yīng)用程序26a、26b、26c。基于RMI的應(yīng)用程序管理程序接口的一個簡單例子在附錄B中給出。
在第二個可供選擇的實(shí)施例中,網(wǎng)絡(luò)協(xié)議48采用網(wǎng)絡(luò)套接字(例如TCP/IP套接字協(xié)議)實(shí)現(xiàn)。如果在客戶12側(cè)也使用Java,那么把協(xié)議48包裝在一個Java類(或多個類)內(nèi)是有利的,以確保協(xié)議48在客戶12側(cè)和服務(wù)器(嵌入設(shè)備20)側(cè)保持一致。為了確保網(wǎng)絡(luò)協(xié)議48不執(zhí)行由客戶12或應(yīng)用程序管理程序24可能拖延引起的網(wǎng)絡(luò)的阻塞閱讀,最好經(jīng)由JavaSocket.setSoTimeout()方法或通過使用JavaInputStream.available()方法對read()操作設(shè)置一個等待超時(shí),以確定多少數(shù)據(jù)可以無阻塞地閱讀。
在這樣一個網(wǎng)絡(luò)套接字協(xié)議方案的一個實(shí)現(xiàn)中,識別所調(diào)用方法的單個字節(jié),后面跟著由包裝程序?yàn)槟莻€特定方法譯碼的附加數(shù)據(jù)被傳送。例如,要下載一個類文件40,客戶12傳送一個‘D’字符字節(jié)以表示該請求是為下載,后面跟著被傳送的總數(shù)據(jù)長度,后面再跟著嵌入設(shè)備20的網(wǎng)絡(luò)地址。在另一個實(shí)施例中,實(shí)際的數(shù)據(jù)是一個零終止字符類名字,后面跟著一個表示該類是否包括一個main方法的字節(jié),后面再跟著包含類數(shù)據(jù)的字節(jié)。一個支持虛擬譯碼方法的目標(biāo)模型被創(chuàng)建以執(zhí)行協(xié)議譯碼。返回方法調(diào)用結(jié)果到客戶12也可以在所使用的類似協(xié)議情況下被包裝,以這一方法,結(jié)果被異步地從請求被返回,同時(shí)客戶12實(shí)際上可以用作結(jié)果的一個網(wǎng)絡(luò)服務(wù)器。如果客戶12僅與一個嵌入JVM22交談,同時(shí)是空閑地等待結(jié)果,那么可以采用一個較簡單的方案,其中客戶12等待(在一個超時(shí)情況下)結(jié)果同步地返回來。
在優(yōu)選實(shí)施例中,應(yīng)用程序管理程序被作為一個Java網(wǎng)絡(luò)服務(wù)器應(yīng)用程序來實(shí)現(xiàn),其接受編碼成一個應(yīng)用程序協(xié)議48的請求,例如Java遠(yuǎn)程方法支持(RMI)協(xié)議、Web主機(jī)請求的超級文本傳送協(xié)議(HTTP),或在TCP/IP套接字上的一個應(yīng)用程序級協(xié)議。如前所述,在協(xié)議48中一個請求類型是一個應(yīng)用程序的Java類文件40的下載。在優(yōu)選實(shí)施例中,類文件40的下載通過調(diào)用方法loadApplClass()或方法loadAndlnit()實(shí)現(xiàn)。如前所述,類文件40是由JVM22使用的一個二進(jìn)制Java字節(jié)代碼流,以創(chuàng)建一個Java類目標(biāo)30a、30b、30c。除了下載應(yīng)用程序類文件40到存儲器50外,應(yīng)用程序26a、26b、26c繼承的任何基(base)類或具有在類文件40中包含的應(yīng)用程序類28a、28b的接口也被下載到存儲器50中的一個應(yīng)用程序高速緩存器52中。因?yàn)閼?yīng)用程序管理程序24允許在存儲器50中的類文件40的高速緩存器,所以應(yīng)用程序協(xié)議48允許經(jīng)由跟隨一個startAppl()方法調(diào)用的方法initAppl()執(zhí)行駐留在存儲器50中的已被下載的類文件。一旦一個類文件40被下載,JavaClassLoaderAPI就被用于例示與類文件40有關(guān)的類目標(biāo)28a、28b。ClassLoader.defineClass()方法從類文件字節(jié)數(shù)組中建立一個類目標(biāo)28a、28b。一旦被定義,該類必須被解析以執(zhí)行類鏈接,其允許實(shí)例目標(biāo)創(chuàng)建和方法調(diào)用。解析進(jìn)程通過調(diào)用JavaClassLoader.resolveClass()API被初始化。
一旦一個類28a、28b被裝載和定義,類28a、28b的一個實(shí)例目標(biāo)30a、30b、30c被創(chuàng)建,在示例性實(shí)施例中通過JavaClass.newlnstance()API創(chuàng)建。需要目標(biāo)30a、30b、30c,以便調(diào)用所希望的方法啟動應(yīng)用程序26a、26b、26c。為了調(diào)用newInstance(),類28a、28b必須有一個缺省的設(shè)計(jì)函數(shù),其沒有自變量。
應(yīng)用程序26a、26b、26c通過調(diào)用在前面創(chuàng)建的目標(biāo)30a、30b、30c上所希望的方法,傳遞任何自變量到該方法來執(zhí)行。應(yīng)用程序管理程序24必須知道訪問目標(biāo)的方法和傳遞什么自變量(如果有的話)。這可以用幾種方法中的一種來完成。
在一個實(shí)施例中,要求所有應(yīng)用程序以便實(shí)現(xiàn)規(guī)定所調(diào)用的方法的一個Java接口。下面示出一個簡單接口。
公共接口ApplBase{公共空主線(InetAddress O);}這個接口規(guī)定一個實(shí)例方法“main()”,其是當(dāng)一個應(yīng)用程序26a、26b、26c執(zhí)行時(shí)被調(diào)用的第一個方法。因?yàn)樗且粋€實(shí)例方法,所以在執(zhí)行main()之前必須由應(yīng)用程序管理程序24創(chuàng)建類28a、28b的一個目標(biāo)30a、30b、30c。這個目標(biāo)在應(yīng)用程序管理程序24中可以是一個JavaApplBase目標(biāo),因?yàn)閮H僅main()被調(diào)用。在這個例子中,main()方法接收一個lnetAddress自變量,其包含下載類的客戶12的網(wǎng)絡(luò)地址。以這個方法,如果需要的話,應(yīng)用程序可以通過一已知端口返回去與客戶12通訊。
在另一個實(shí)施例中,如果JVM22支持反射,例如通過JavaRMI。那么方法名字被下載到應(yīng)用程序管理程序24以及反射被用來搜索所希望方法的應(yīng)用程序類。一旦類28a、28b被裝載,則JavagetDeclaredMethod()被調(diào)用在該類上以便查找所希望的方法。getDeclaredMethod()返回一個Method目標(biāo),其可以通用調(diào)用invoke()依次被用于執(zhí)行該方法。
在還有一個實(shí)施例中,從所有應(yīng)用程序都從中繼承的一個公共基類擴(kuò)充的一個方法被調(diào)用。
一旦執(zhí)行之后,應(yīng)用程序管理程序24記錄應(yīng)用程序26a、26b、26c的新運(yùn)行狀態(tài)。每個應(yīng)用程序類28a、28b包括一個各自的實(shí)例列表29a、29b,其識別它的類存在的每個實(shí)例。在實(shí)例列表29a、29b中每個入口包括一個執(zhí)行狀態(tài)變量,它在實(shí)例應(yīng)用程序26a、26b、26c的生存周期內(nèi)由應(yīng)用程序管理程序24更新。
應(yīng)用程序管理程序24處理在應(yīng)用程序26a、26b、26c中產(chǎn)生的所有Java異?;蝈e誤,其要不然會引起JVM22終止。在應(yīng)用程序終止情況下,應(yīng)用程序管理程序24記錄應(yīng)用程序26a、26b、26c不再在運(yùn)行(通過更新相應(yīng)于在實(shí)例列表29a、29b中所識別的實(shí)例的執(zhí)行狀態(tài)),同時(shí)如果類28a、28b沒有被高速緩存器到存儲器50,則讓類目標(biāo)28a、28b作為垃圾被回收。
類28a、28b的高速緩存器是本發(fā)明的一個獨(dú)特的特性,它便于獲得更好的性能。每一次一個應(yīng)用程序26a、26b被執(zhí)行時(shí)不是下載應(yīng)用程序類,而是應(yīng)用程序管理程序24最好按照缺省高速緩存器類目標(biāo)28a、28b,同時(shí)只有當(dāng)明顯地請求使用unloadAppl()方法或只有當(dāng)存儲器管理處理程序27由于低存儲器或無存儲器狀態(tài)選擇類被卸載時(shí)才卸載類28a、28b。在優(yōu)選實(shí)施例中,當(dāng)前已裝載的類由存儲器管理處理程序27卸載的次序采用SetFreeAppsFirst()方法設(shè)置。setFreeAppsFirst()方法允許客戶在低存儲器或無存儲器狀態(tài)中設(shè)置或更改應(yīng)用程序被卸載的次序。這可以用幾種方法中的任何一種來完成,包括通過在應(yīng)用程序列表中增添一個卸載優(yōu)先權(quán)字段到每個入口,它表示卸載類用的應(yīng)用程序的順序。通過高速緩存器類,應(yīng)用程序管理程序24對該類保留一個標(biāo)記,因而使Java虛所機(jī)22不會當(dāng)垃圾回收28a、28b。應(yīng)用程序類28a、28b則可以被重新使用以便創(chuàng)建類28a、28b的新實(shí)例30a、30b、30c,同時(shí)重新執(zhí)行應(yīng)用程序功能度。
應(yīng)用程序管理程序24最好也允許將應(yīng)用程序數(shù)據(jù)高速緩存器到存儲器50中的數(shù)據(jù)高速緩存器54中,甚至在一個應(yīng)用程序已終止和/或被卸載之后也是如此。一個例子是在電子試驗(yàn)域中的Java應(yīng)用程序。應(yīng)用程序的第一次執(zhí)行應(yīng)保存安裝信息,這使得該應(yīng)用程序?qū)磉\(yùn)行時(shí)能較快地執(zhí)行。在這個例子中,應(yīng)用程序管理程序24能高速緩存器試驗(yàn)系統(tǒng)校準(zhǔn)信息。另外,通過高速緩存器試驗(yàn)系統(tǒng)校準(zhǔn)信息進(jìn)數(shù)據(jù)高速緩存器54,應(yīng)用程序管理程序54保留對一個數(shù)據(jù)的標(biāo)記,因而使Java虛擬機(jī)不會當(dāng)垃圾回收數(shù)據(jù)。因此,以這個方式的數(shù)據(jù)高速緩存器允許信息被保存以供同一應(yīng)用程序或不同應(yīng)用程序下次運(yùn)行用。
應(yīng)用程序管理程序24企圖讓應(yīng)用程序26a、26b、26c能繼續(xù)在低存儲器或無存儲器狀態(tài)下執(zhí)行。如果在應(yīng)用程序26a、26b、26c執(zhí)行期間JVM22運(yùn)行存儲器溢出,則產(chǎn)生OutOfMemoryError錯誤。應(yīng)用程序管理程序24包括一個存儲器管理處理程序27。它處理低存儲器或無存儲器狀態(tài)。在優(yōu)選實(shí)施例中,存儲器管理處理程序27通過由JVM22產(chǎn)生的OutOfMemoryError的出現(xiàn)被觸發(fā)進(jìn)入運(yùn)行。在一個實(shí)施例中,存儲器管理處理程序27通過來自它的應(yīng)用程序高速緩存器的明智地轉(zhuǎn)儲類目標(biāo)28a、28b和應(yīng)用程序目標(biāo)30a、30b和30c來起反應(yīng)。卸載被高速緩存器的類目標(biāo)28a、28b和應(yīng)用程序目標(biāo)30a、30b和30c的次序采用setFreeAppsFirst()方法設(shè)置。另一方面,該次序按照在存儲器管理處理程序27本身內(nèi)被編碼的一個預(yù)定算法來確定。通過調(diào)用JavaRuntime.gc()方法,應(yīng)用程序管理程序通知JVM22卸載的類目標(biāo)28a、28b和應(yīng)用程序目標(biāo)30a、30b和30c是可以用來被回收。來自應(yīng)用程序高速緩存器52的類目標(biāo)28a、28b的卸載迫使與類28a、28b有關(guān)的應(yīng)用程序目標(biāo)30a、30b和30c被終止以及同樣被卸載。因此,如果應(yīng)用程序執(zhí)行的啟動速度是重要的話,那么可能最好是在卸載類目標(biāo)28a、28b之前卸載應(yīng)用程序目標(biāo)30a、30b和30c。另一方面,如果保持一個特定的應(yīng)用程序無論如何總運(yùn)行是重要的,那么可能最好是與那些目標(biāo)有關(guān)的類一道卸載另一個類的所有應(yīng)用程序目標(biāo),以便釋放足夠的存儲器來保持該特定應(yīng)用程序運(yùn)行。讓應(yīng)用程序終止的解決辦法是單獨(dú)監(jiān)視對低存儲器狀態(tài)起反應(yīng)的存儲器水平,或到檢驗(yàn)點(diǎn)應(yīng)用程序結(jié)果允許在一個檢驗(yàn)點(diǎn)之后繼續(xù)重新啟動應(yīng)用程序。這些方法可以允許執(zhí)行應(yīng)用程序使之繼續(xù)不間斷,或至少盡可能地接近不間斷。
應(yīng)用程序管理程序24最好提供存儲器管理功能度。在一個實(shí)施例中,應(yīng)用程序管理程序24標(biāo)記類目標(biāo)28a、28b,應(yīng)用程序目標(biāo)30a、30b以及在各自的應(yīng)用程序52和數(shù)據(jù)54高速緩存器中的全局?jǐn)?shù)據(jù),因而確保它們有關(guān)的目標(biāo)不會被當(dāng)作垃圾回收。
在另一個實(shí)施例中,存儲器管理處理程序27不斷地監(jiān)視空閑存儲器水平,同時(shí)在低存儲器或無有用存儲器場合,從它的高速緩存器52、54中刪除目標(biāo)并啟動垃圾回收站以便釋放如所需要的那樣更多的存儲器。如前所述,在從應(yīng)用程序高速緩存器52或數(shù)據(jù)高速緩存器54中刪除入口之后,通過調(diào)用JavaRuntime.ge()方法啟動垃圾回收站。關(guān)于應(yīng)用程序管理程序24如何在低存儲器狀態(tài)管理存儲器50,在實(shí)現(xiàn)一個應(yīng)用程序管理程序24時(shí)必須進(jìn)行選擇。一個選擇是哪個高速緩存器,應(yīng)用程序高速緩存器52或是數(shù)據(jù)高速緩存器54,具有當(dāng)?shù)陀杏么鎯ζ鳟a(chǎn)生時(shí)首先從中被刪除的入口。在大多數(shù)情況下,它可能很容易刪除應(yīng)用程序目標(biāo)和30a、30b、30c和有關(guān)的類目標(biāo)28a、28b,同時(shí)當(dāng)需要時(shí)重新下載它們。這個決定在它可以使用的長時(shí)間內(nèi)被預(yù)測,以重新創(chuàng)建全局?jǐn)?shù)據(jù)。
應(yīng)用程序和全局?jǐn)?shù)據(jù)目標(biāo)最好被設(shè)計(jì)成盡可能地獨(dú)立,以使高速緩存器方案能正確地工作。如果一個全局?jǐn)?shù)據(jù)類被標(biāo)記為類目標(biāo)28a、28b的一個成員,則未被標(biāo)記的數(shù)據(jù)類對釋放存儲器毫無作為,除非類目標(biāo)28a、28b也未被標(biāo)記。一個標(biāo)記為類目標(biāo)28a、28b的全局?jǐn)?shù)據(jù)類的相反情況也引起相同結(jié)果。類目標(biāo)28a、28b應(yīng)僅標(biāo)記為在方法中,而不是在類成員中的全局?jǐn)?shù)據(jù)類。最好全局?jǐn)?shù)據(jù)目標(biāo)決不標(biāo)記為類目標(biāo)28a、28b。
圖4是說明應(yīng)用程序類高速緩存器52的管理的一個示例性實(shí)施例的工作流程圖。應(yīng)用程序管理程序24接收402來自一個客戶12的請求。如果該請求的執(zhí)行導(dǎo)致有用存儲器的使用(例如,loadAppl()、loadAndlnit()、lniAppl()),則對于所接收請求的執(zhí)行是否會導(dǎo)致一個低存儲器或無存儲器狀態(tài)作出一個決定404。如果是的話,類目標(biāo)28a、28b和/或應(yīng)用程序目標(biāo)30a、30b、30c被選擇406,以便從應(yīng)用程序高速緩存器52中卸載。所選的目標(biāo)則從應(yīng)用程序高速緩存器42中被卸載408。如果所接收的請求是一個loadAppl()或ladAndlnitAppl()請求,則一個類目標(biāo)從網(wǎng)絡(luò)14被裝載和被定義410。如果請求是一個loadApp()請求,則該請求被完成。如果請求是一個loadAndlnitAppl()請求或一個lnitAppl()請求,則應(yīng)用程序目標(biāo)30a、30b、30c被例示412同時(shí)請求被完成。如果請求是一個startAppl()請求,則應(yīng)用程序被啟動414,一般通過調(diào)用在應(yīng)用程序目標(biāo)30a、30b、30c上的一個main()方法來實(shí)現(xiàn)。如果請求是一個stopAppl()請求,則應(yīng)用程序被停止416。如果請求是一個unload()請求,則類目標(biāo)28a、28b被卸載418。如果請求是一setFreeMemoryLimit()請求,則作為低存儲器狀態(tài)依據(jù)的空閑存儲器閾值被設(shè)置420。如果請求是一個setFreeAppsFirst()請求,則為了在檢測到低存儲器或無存儲器狀態(tài)時(shí)卸載,選擇應(yīng)用程序類28a、28b和目標(biāo)類30a、30b、30c的次序被設(shè)置422。如果請求是一個查詢(例如,哪個應(yīng)用程序類被裝載(applClasses()),哪個應(yīng)用程序被初始化(applications()),哪個應(yīng)用程序目前正在運(yùn)行(appllnstances()),存在多少可用存儲器(freeMemory()),存在多少總存儲器(totalMemory()),已存在的空閑存儲器范圍閾值是什么(getFreeMemoryLimit()),或已存在的卸載類和應(yīng)用程序目標(biāo)的次序是什么(getFreeAppsFirstPolicy()),則查詢被執(zhí)行,返回被請求參數(shù)424。
當(dāng)已確定404一個低存儲器或無存儲器狀態(tài)存在時(shí),在示例性實(shí)施例中應(yīng)用程序管理程序24刪除被選擇為卸載的目標(biāo)的標(biāo)記,并通過調(diào)用javaRuntime.gc()方法使得未標(biāo)記目標(biāo)從應(yīng)用程序高速緩存器52中被刪除。如前所述,僅僅未標(biāo)記的類28a、28b被從高速緩存器52中刪除,因?yàn)橹挥形礃?biāo)記的類可以通過JavaRuntime.gc()方法作為垃圾被回收。在有些JVM22實(shí)現(xiàn)中,類的ClassLoader目標(biāo)可能也必須是未被標(biāo)記為當(dāng)作垃圾被回收的類。
圖5是說明采用本發(fā)明的一個系統(tǒng)500的一個示例實(shí)現(xiàn)的一個類圖。在圖5的示例實(shí)現(xiàn)中所定義和使用的每個類的說明示于下面表1中。表2包含在圖5的示例實(shí)現(xiàn)中所使用的每個類中所定義的主要屬性的說明。如在圖5中所示,類ApplMgr502管理應(yīng)用程序類的一對多實(shí)例510。類ApplMgr502使用一個ServerProtocol類504,其與ClientProtocol類506交談,以便與一個客戶類ApplClient相連通。如在表1中所示,類ApplMgr502是實(shí)現(xiàn)應(yīng)用程序管理程序24的類。應(yīng)用程序類510模擬一個單一應(yīng)用程序。ServerProtocol類504和ClientProtocol類506實(shí)現(xiàn)客戶接口4。同時(shí)它們包裝在應(yīng)用程序管理程序類ApplMgr502和客戶類ApplClient508之問的網(wǎng)絡(luò)協(xié)議48。表1<
表2
圖6是說明類之間的通訊以完成一個新類的裝載的系統(tǒng)500的方塊圖。表3規(guī)定初始假設(shè)、裝載操作的結(jié)果和為完成裝載所要求的代理程序。如所描述的那樣,假設(shè)一個應(yīng)用程序管理程序類ApplMgr 502正在嵌入設(shè)備20的JVM22中運(yùn)行,同時(shí)通過指令A(yù)pplClient 508在客戶計(jì)算機(jī)12上運(yùn)行以便把新類下載到嵌入設(shè)備20,一個用戶已請求一個下載。
表3<
如圖6中所示,一個下載操作用從一個客戶用戶應(yīng)用程序例如客戶用戶類ApplclientU 516至客戶應(yīng)用程序ApplClient 508的一個用戶請求602開始。在這個例子中,客戶用戶類ApplclientU516通過遵照先傳送一個‘D’字符,后跟包含類數(shù)據(jù)的文件名,再后跟類數(shù)據(jù)所要傳送抵達(dá)的網(wǎng)絡(luò)結(jié)點(diǎn)的協(xié)議產(chǎn)生一個下載請求。在這個例子中,類數(shù)據(jù)起名為‘test’,嵌入設(shè)備20的網(wǎng)絡(luò)結(jié)點(diǎn)地址起名為‘HP’。請求602使得Applclient 508被運(yùn)行以便下載類‘test’到結(jié)點(diǎn)‘HP’。Applclient508讀出在‘test’中所包含的類數(shù)據(jù)到存儲器中,然后調(diào)用Client Protocol.Load Class()方法604下載該類。ClientProtocol 506形成一個至結(jié)點(diǎn)‘HP’的ServerProtocol的網(wǎng)絡(luò)14連接,同時(shí)經(jīng)由網(wǎng)絡(luò)14發(fā)送606與類數(shù)據(jù)文件‘test’有關(guān)的類數(shù)據(jù)。ServerProtocol 504譯碼該請求和類數(shù)據(jù),然后調(diào)用ApplMgr.loadClass()方法608裝載類。如果需的話(即類已經(jīng)不被高速緩存器在應(yīng)用程序高速緩存器中),ApplMgr 502創(chuàng)建用于該類的一個應(yīng)用程序目標(biāo)610。ApplMgr502則調(diào)用在應(yīng)用程序510上的loadClass()方法612,傳送與類‘test’有關(guān)的所有類數(shù)據(jù)。新應(yīng)用程序目標(biāo)被添加616到應(yīng)用程序的ApplMgr高速緩存器,應(yīng)用程序列表ApplMgr.iapps23被更新616以反映類‘test’添加到它管理的它們應(yīng)用程序目標(biāo)的事實(shí)。如果被裝載的類‘test’是一個main類,則應(yīng)用程序定義和解析該類,創(chuàng)建該類的一個實(shí)例,同時(shí)調(diào)用實(shí)例的init()方法,618。一個真正的結(jié)果被傳送620回到Applclient通知成功地裝載類。
在實(shí)現(xiàn)中,如果希望的話,ServerProtocol類504可以創(chuàng)建處理每個請求的一個單獨(dú)的線索表,讓多個請求同時(shí)被處理。如果以這個方式實(shí)現(xiàn),由類ApplMgr502和Application510實(shí)現(xiàn)的方法必須適當(dāng)?shù)乇煌健?br>
如果一個應(yīng)用程序510被配制為多個類,則對每個類將進(jìn)行一個loadClass()請求。這要求ApplMgr502能查找并添加類到一個已存在的應(yīng)用程序目標(biāo)510。應(yīng)用程序用一個唯一的名字,與main類相同的名字來識別。按照慣例,在裝載main類之前先裝載base類和接口,以確保main類的實(shí)例被正確地創(chuàng)建。另一個方案是創(chuàng)建一個新ApplMgr方法以創(chuàng)建一個應(yīng)用程序的一個實(shí)例。這使得相同類的多個應(yīng)用程序能同時(shí)被執(zhí)行。
圖7是說明為執(zhí)行一個應(yīng)用程序的啟動在類之間的通訊的系統(tǒng)500的一個方塊圖。表4規(guī)定初始假設(shè)、啟動操作的結(jié)果和為執(zhí)行啟動所要求的代理程序。如所描述的那樣,假設(shè)一個應(yīng)用程序管理程序類ApplMgr正在嵌入設(shè)備20的JVM22中運(yùn)行,同時(shí)通過指令A(yù)pplClient在用戶的機(jī)器上運(yùn)行來啟動嵌入設(shè)備20上的應(yīng)用程序,一個用戶已請求一個啟動。
表4
如圖7中所示,一個啟動操作用從一個客戶用戶應(yīng)用程序例如客戶用戶類ApplClientu 516至客戶應(yīng)用程序Applclient 508的一個用戶請求702來開始。在這個例子中,客戶用戶類ApplClientu 516通過遵照先傳送一個‘B’字符(為‘begin’),后面跟應(yīng)用程序名‘test’,再后面跟類數(shù)據(jù)要傳送抵達(dá)的網(wǎng)絡(luò)結(jié)點(diǎn)‘HP’的協(xié)議產(chǎn)生一個啟動請求。請求702使得ApplClient 508被運(yùn)行以便啟動在結(jié)點(diǎn) ‘HP’上的應(yīng)用程序‘test’。ApplClient 508調(diào)用ClientProtocol.StartAppl()方法704啟動應(yīng)用程序。ClientProtocol 506形成一個至結(jié)點(diǎn)上的ServerProtocol 504的網(wǎng)絡(luò)連接,同時(shí)發(fā)送706一個啟動消息。ServerProtocol 504譯碼啟動請求,然后調(diào)用ApplMgr.StarAppl()方法708。ApplMgr 502查出正確的應(yīng)用程序目標(biāo)510,然后調(diào)用710在應(yīng)用程序510上的startAppl()方法。應(yīng)用程序目標(biāo)510創(chuàng)建712一個新線索表518以便執(zhí)行714它自己的run()方法。在run()方法內(nèi),ApplBase實(shí)例514的main方法被調(diào)用716,傳遞任何參數(shù)。如果沒有參數(shù)被傳遞到應(yīng)用程序?qū)嵗瑒trun()方法應(yīng)被直接調(diào)用。應(yīng)用程序目標(biāo)510則更改718應(yīng)用程序?qū)嵗臓顟B(tài)以便執(zhí)行。
在另一個實(shí)施例中,一個ApplClass目標(biāo)(即一個類裝入程序512)管理模擬應(yīng)用程序類510的一個實(shí)例的應(yīng)用程序類。
圖8是說明為執(zhí)行一個應(yīng)用程序的停止在類之間通訊的系統(tǒng)500的方塊圖。表5規(guī)定初始假設(shè)、停止操作的結(jié)果和執(zhí)行停止所要求的代理程序。如所描述的那樣,假設(shè)一個應(yīng)用程序管理程序類ApplMgr正在嵌入設(shè)備20的JVM22中運(yùn)行,同時(shí)通過指令A(yù)pplClient在用戶的機(jī)器上運(yùn)行來停止嵌入設(shè)備20上的應(yīng)用程序,一個用戶已請求一個停止。
表5
如圖8中所示,一個停止操作用從一個客戶用戶應(yīng)用程序例如客戶用戶類ApplClientU 516至客戶應(yīng)用程序ApplClient 508的一個用戶請求802來開始。在這個例子中,客戶用戶類ApplClientU 516通過遵照先傳送一個‘E’字符(為‘end’),后面跟應(yīng)用程序名‘test’,再后面跟類數(shù)據(jù)要傳送抵達(dá)的網(wǎng)絡(luò)結(jié)點(diǎn)‘HP’的協(xié)議產(chǎn)生一個停止請求。請求802使得ApplClient 508被運(yùn)行以便停止在結(jié)點(diǎn)‘HP’上應(yīng)用程序‘test’的執(zhí)行。ApplClient 508調(diào)用ClientProtocol.StopAppl()804方法停止應(yīng)用程序。ClientProtocol 506形成一個至結(jié)點(diǎn)‘HP’上的ServerProtocol 504的網(wǎng)絡(luò)連接,同時(shí)發(fā)送806一個停止消息。ServerProtocol 504譯碼停止請求,然后調(diào)用ApplMgr.StopAppl()方法808。ApplMgr 502查出正確的應(yīng)用程序目標(biāo)510,然后調(diào)用810在應(yīng)用程序510上的stopAppl()方法。應(yīng)用程序目標(biāo)510通過傳遞到stopAppl()的名字查出ApplBase 514實(shí)例,同時(shí)調(diào)用它的terminate()方法812。應(yīng)用程序則使用Thread.join()以確保ApplBase已終止。應(yīng)用程序目標(biāo)510更好ApplBase 514實(shí)例的狀態(tài)814以便終止。
停止一個ApplBase 514實(shí)例是一個異步事件,因?yàn)閼?yīng)用程序正在以它自己的線索表執(zhí)行。可能希望實(shí)際上不等待應(yīng)用程序停止,因?yàn)槿绻麘?yīng)用程序不輪詢它的終止標(biāo)志,它將不停止。因此,在實(shí)現(xiàn)中,設(shè)計(jì)可以另外使用一個具有超時(shí)的join()方法,然后通過調(diào)用stop()迫使終止。
圖9是說明當(dāng)在執(zhí)行應(yīng)用程序510的一個實(shí)例期間出現(xiàn)低存儲器或無存儲器狀態(tài)時(shí)類之間通訊的系統(tǒng)500的一個方塊圖。表6規(guī)定初始假設(shè),存儲器溢出狀態(tài)的結(jié)果和執(zhí)行處理該狀態(tài)所要求的代理程序。如所描述的那樣,假設(shè)一個應(yīng)用程序管理程序類ApplMgr 502正在嵌入設(shè)備20的JVM22中運(yùn)行,同時(shí)一個或多個應(yīng)用程序類被裝載和執(zhí)行。
表6
如圖9中所示,一個運(yùn)行應(yīng)用程序510的一個實(shí)例ApplBase 514產(chǎn)生一個OutofMemoryError 902。最好Out of Memory Error由Application.run()方法內(nèi)的存儲器管理處理程序27處理904。處理程序27通過調(diào)用一個ApplMgr.out of Memory()方法906把狀態(tài)通知ApplMgr 502。應(yīng)用程序510則從run()返回以便停止ApplBase514線索表908。ApplMgr 502反復(fù)通過它的應(yīng)用程序高速緩存器52,通過調(diào)用Application applcount()方法908發(fā)現(xiàn)不具有已執(zhí)行的ApplBases的類。那些沒有執(zhí)行的ApplBases的應(yīng)用程序被指示到freeMemory()910,其使得它們能從應(yīng)用程序高速緩存器52中轉(zhuǎn)除它們的類。ApplMgr 502則從它的應(yīng)用程序高速緩存器52中刪除912那些應(yīng)用程序,同時(shí)調(diào)用Runtime.gc()914以使垃圾回收站回收未標(biāo)記的目標(biāo)因而釋放存儲器。
如上面詳細(xì)描述的那樣,本發(fā)明提供一個應(yīng)用程序管理程序和API特性,其在一個Java虛擬機(jī)內(nèi)運(yùn)行,打算將該Java虛擬機(jī)用于電子設(shè)備或裝置中以及在具有有限資源限制環(huán)境的其它嵌入系統(tǒng)中。當(dāng)存儲器資源變得有限時(shí)本發(fā)明提供高速緩存器和終止應(yīng)用程序供將來運(yùn)行的靈活性,以便為較高優(yōu)先權(quán)的應(yīng)用程序釋放存儲器。
權(quán)利要求
1.一個應(yīng)用程序管理程序(24),它管理在一個嵌入設(shè)備(20)中的一個或多個應(yīng)用程序(26a,26b,26c),所說的嵌入設(shè)備(20)包括一個存儲類目標(biāo)(28a、28b)的應(yīng)用程序高速緩存器(52)、一個在網(wǎng)絡(luò)(14)上與客戶(12)通訊的網(wǎng)絡(luò)接口(25)、和一個被安裝在所說的嵌入設(shè)備(20)并在其上運(yùn)行的Java虛擬機(jī)(JVM)(22),所說的應(yīng)用程序管理程序(24)包括一個具有入口的類目標(biāo)列表(23),它的每個入口標(biāo)識一個當(dāng)前裝載在所說的嵌入設(shè)備(20)中的類目標(biāo)(28a、28b);一個類裝入程序方法(loadAppl()、loadAndlnit()),其裝載一個經(jīng)由所說的網(wǎng)絡(luò)接口(25)從所說的客戶(12)所接收的應(yīng)用程序類(28a、28b),為所說的應(yīng)用程序類創(chuàng)建一個新的類目標(biāo)(28a、28b),把所說的新的類目標(biāo)(28a、28b)存儲在所說的應(yīng)用程序高速緩存器(52),同時(shí)把一個新的入口添加到所說的類目標(biāo)列表(23)以便當(dāng)被裝載在所說的應(yīng)用程序高速緩存器(52)中時(shí)標(biāo)識所說的新的類目標(biāo)(28a、28b)。
2.按照權(quán)利要求1的一個應(yīng)用程序管理程序(24),其中在所說的類目標(biāo)列表(23)中被標(biāo)識的每個類目標(biāo)包括一個具有入口的實(shí)例列表(29a、29b),其中每個入口標(biāo)識在所說的嵌入設(shè)備(20)上當(dāng)前所例示的所說的類目標(biāo)的一個實(shí)例(30a、30b)。
3.按照權(quán)利要求2的一個應(yīng)用程序管理程序(24),其中在所說的實(shí)例列表(29a、29b)中的每個入口包括一個執(zhí)行狀態(tài)屬性,它表示相應(yīng)于所說的入口的所說的實(shí)例(30a、30b)的一個當(dāng)前執(zhí)行狀態(tài)。
4.按照權(quán)利要求3的一個應(yīng)用程序管理程序(24),包括一個啟動應(yīng)用程序方法(Init()、Start()),它創(chuàng)建一個類目標(biāo)(28a、28b)的一個新的實(shí)例(30a、30b),同時(shí)把所說的新實(shí)例(30a、30b)添加到所說的類目標(biāo)(28a、28b)的所說的實(shí)例列表(29a、29b),如果所說的被啟動的實(shí)例不存在,則使得所說的被啟動的實(shí)例(30a、30b)開始執(zhí)行,同時(shí)更新相應(yīng)于在所說的被啟動的實(shí)例的所說的實(shí)例列表(29a、29b)中的所說的入口的所說的執(zhí)行狀態(tài)屬性,以便表示所說的被啟動的實(shí)例(30a、30b)當(dāng)前正在運(yùn)行。
5.按照權(quán)利要求4的一個應(yīng)用程序管理程序(24),包括一個停止應(yīng)用程序方法(stopAppl()),它使得在所說的嵌入設(shè)備(20)上的當(dāng)前正在執(zhí)行的和被停止的一個實(shí)例停止執(zhí)行,同時(shí)更新相應(yīng)于在所說的實(shí)例(30a、30b)的所說的實(shí)例列表(29a、29b)中所說的入口的所說的執(zhí)行狀態(tài)屬性,以表示所說的被停止的實(shí)例(30a、30b)沒有在執(zhí)行。
6.按照權(quán)利要求1、2、3、4或5的一個應(yīng)用程序管理程序(24),包括一個響應(yīng)于低存儲器或無存儲器狀態(tài)(OutOfMemoryError())檢測的存儲器管理處理程序(27),選擇高速緩存器在所說的應(yīng)用程序高速緩存器(52)中的被卸載的一個類目標(biāo)(28a、28b),同時(shí)從所說的應(yīng)用程序高速緩存器(52)中卸載所說的所選擇的類目標(biāo)(28a、28b)。
全文摘要
一個Java應(yīng)用程序管理程序(24)控制在一個單個Java虛擬機(jī)(JVM)(22)內(nèi)運(yùn)行的Java應(yīng)用程序(26a、26b、26c)的下載、執(zhí)行和高速緩存器。應(yīng)用程序管理程序(24)接受應(yīng)用程序類下載(load()/Loadandlnit())、實(shí)例應(yīng)用程序類(lnit())和控制應(yīng)用程序(26a、26b、26c)的生存周期。
文檔編號G06F9/54GK1265489SQ00103710
公開日2000年9月6日 申請日期2000年3月1日 優(yōu)先權(quán)日1999年3月1日
發(fā)明者F·P·賈奇, C·C·多蘭 申請人:惠普公司