專利名稱:用于發(fā)現(xiàn)內(nèi)存泄漏和運(yùn)行期信息的對(duì)象堆分析技術(shù)的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及分析(例如優(yōu)化、查錯(cuò)或“調(diào)試”)軟件應(yīng)用程序的技術(shù)。更具體來(lái)說(shuō),本發(fā)明涉及將JavaTM虛擬機(jī)上應(yīng)用程序在運(yùn)行期期間存在的對(duì)象有關(guān)的信息存儲(chǔ)起來(lái)供以后分析的技術(shù)。
JavaTM程序設(shè)計(jì)語(yǔ)言是由Sun Microsystem開(kāi)發(fā)的一種面向?qū)ο蟮母呒?jí)程序設(shè)計(jì)語(yǔ)言,其輕便性設(shè)計(jì),足以使得其能在范圍從小型設(shè)備(例如尋呼機(jī)、蜂窩電話和智能卡)到超級(jí)計(jì)算機(jī)的各種計(jì)算機(jī)上執(zhí)行。用Java(和其它語(yǔ)言)編寫的計(jì)算機(jī)程序可以被編譯成虛擬機(jī)指令由Java虛擬機(jī)執(zhí)行。一般來(lái)說(shuō),Java虛擬機(jī)是一個(gè)解碼并執(zhí)行虛擬機(jī)指令的解釋程序。
用于Javs虛擬機(jī)的虛擬機(jī)指令是字節(jié)代碼,即它們包括一個(gè)或多個(gè)字節(jié)。字節(jié)代碼以一種特定的文件格式存儲(chǔ),該文件格式稱作“類文件”,它包括一個(gè)類的方法(method)的字節(jié)代碼。除了一個(gè)類的方法的字節(jié)代碼之外,類文件還包括一個(gè)符號(hào)表以及其它輔助信息。
以一個(gè)或多個(gè)類文件中的Java字節(jié)代碼體現(xiàn)的計(jì)算機(jī)程序是獨(dú)立于平臺(tái)的。這種計(jì)算機(jī)程序不加改變就可以在能運(yùn)行Java虛擬機(jī)一個(gè)實(shí)現(xiàn)的任何計(jì)算機(jī)上執(zhí)行。Java虛擬機(jī)是一個(gè)“通用”計(jì)算機(jī)的軟件仿真程序,這是Java虛擬機(jī)的計(jì)算機(jī)程序能獨(dú)立于平臺(tái)的一個(gè)主要因素。
Java虛擬機(jī)通常是以一個(gè)軟件解釋程序?qū)崿F(xiàn)的。常規(guī)的解釋程序在執(zhí)行期間解碼并執(zhí)行被解釋程序的虛擬機(jī)指令,每次一條指令,這與編譯程序不同,編譯程序?qū)⒃创a解碼成本機(jī)機(jī)器指令,然后執(zhí)行,在執(zhí)行期間不再執(zhí)行解碼。一般來(lái)說(shuō),Java虛擬機(jī)要用Java程序設(shè)計(jì)語(yǔ)言以外的一種程序設(shè)計(jì)語(yǔ)言(例如,C++程序設(shè)計(jì)語(yǔ)言)來(lái)編寫。因此,Java程序的執(zhí)行會(huì)涉及執(zhí)行用多種程序設(shè)計(jì)語(yǔ)言寫成的功能。此外,字節(jié)代碼本身也可能會(huì)調(diào)用不是用Java程序設(shè)計(jì)語(yǔ)言編寫的函數(shù)(例如用于輸入/輸出的系統(tǒng)函數(shù))。因此執(zhí)行JAVA程序會(huì)導(dǎo)致執(zhí)行用多種程序設(shè)計(jì)語(yǔ)言寫成的函數(shù),這是很正常的。
盡管面向?qū)ο蟮某绦虻囊粋€(gè)目標(biāo)是允許重用測(cè)試過(guò)的源代碼,由此減少運(yùn)行期出錯(cuò)的次數(shù),Java程序仍然能從提供一個(gè)在運(yùn)行期進(jìn)入程序操作的窗口的分析技術(shù)中獲得好處。例如,分析可用于優(yōu)化程序或者尋找代碼中的錯(cuò)誤。因此,提供分析Java虛擬機(jī)上執(zhí)行的應(yīng)用程序的革新技術(shù),這是人們所希望的。此外,提供應(yīng)用程序在運(yùn)行期存在的對(duì)象的快照(snapshot),以便例如能夠發(fā)現(xiàn)內(nèi)存泄漏,這也是有益的。
總的來(lái)說(shuō),本發(fā)明的實(shí)施例提供了分析面向?qū)ο蟮挠?jì)算機(jī)程序的革新技術(shù)。在運(yùn)行期期間某特定時(shí)刻處于活動(dòng)狀態(tài)的對(duì)象(“活動(dòng)對(duì)象”)的快照可以被存儲(chǔ)起來(lái)??梢岳靡环N分析工具來(lái)生成允許用戶分析活動(dòng)對(duì)象的超文本文檔。例如,用戶通過(guò)瀏覽超文本標(biāo)記語(yǔ)言(HTML)文檔,并判定某類的實(shí)例比預(yù)期的多,就能夠識(shí)別內(nèi)存泄漏。用戶然后就可以跟蹤指向不必要的實(shí)例的引用(或指針),以便判定是什么引起了內(nèi)存泄漏。此外,用戶還可以比較兩個(gè)不同運(yùn)行期的活動(dòng)對(duì)象的兩個(gè)不同的快照,以便例如可以容易地識(shí)別某類的新實(shí)例。下面描述本發(fā)明的幾個(gè)實(shí)施例。
在一個(gè)實(shí)施例中,計(jì)算機(jī)實(shí)現(xiàn)的、分析面向?qū)ο蟮某绦虻膱?zhí)行的方法包括在運(yùn)行期期間接受輸入,以存儲(chǔ)關(guān)于活動(dòng)對(duì)象的信息。為了定位活動(dòng)對(duì)象,系統(tǒng)可以從對(duì)象的根集的成員的對(duì)象開(kāi)始掃描活動(dòng)對(duì)象。然后,可以識(shí)別由對(duì)象的根集(root set)引用的對(duì)象,以及由這些對(duì)象引用的對(duì)象,如此等等,直到所有的活動(dòng)對(duì)象都被識(shí)別。關(guān)于活動(dòng)對(duì)象的信息可以被存儲(chǔ)(例如存儲(chǔ)在一個(gè)文件中)。在最佳實(shí)施例中,活動(dòng)對(duì)象是Java類的實(shí)例。
在另一個(gè)實(shí)施例中,計(jì)算機(jī)實(shí)現(xiàn)的、分析面向?qū)ο蟮某绦虻膱?zhí)行的方法包括檢索執(zhí)行中某個(gè)時(shí)刻的活動(dòng)對(duì)象的有關(guān)信息??梢赃f歸掃描該信息以確認(rèn)哪些對(duì)象是根集的成員,并保持活動(dòng)對(duì)象的層次關(guān)系。可以生成一個(gè)超文本文檔以提供有關(guān)活動(dòng)對(duì)象的信息,供用戶分析。
在另一個(gè)實(shí)施例中,計(jì)算機(jī)實(shí)現(xiàn)的、分析面向?qū)ο蟮某绦虻膱?zhí)行的方法包括存儲(chǔ)兩個(gè)不同運(yùn)行期的活動(dòng)對(duì)象的有關(guān)信息。第一和第二運(yùn)行期之間的差別,例如新實(shí)例,于是就可以被確定。可以生成超文本文檔,以表示這種差別,供用戶分析。
結(jié)合附圖參閱下面的詳細(xì)描述后,本發(fā)明的其他特點(diǎn)和優(yōu)點(diǎn)將變得非常明顯。
圖1表示的是可用于執(zhí)行本發(fā)明實(shí)施例的軟件的一例計(jì)算機(jī)系統(tǒng)。
圖2表示圖1的計(jì)算機(jī)系統(tǒng)的系統(tǒng)框圖。
圖3表示Java源代碼程序是如何執(zhí)行的。
圖4表示一個(gè)Java運(yùn)行期系統(tǒng)的一個(gè)實(shí)現(xiàn)的部件。
圖5表示在一個(gè)Java堆棧上存儲(chǔ)的函數(shù)的幀。
圖6表示存儲(chǔ)在運(yùn)行期期間獲得的活動(dòng)對(duì)象有關(guān)的信息的過(guò)程。
圖7表示表現(xiàn)在運(yùn)行期期間獲得的活動(dòng)對(duì)象有關(guān)的信息的過(guò)程。
圖8A~8E表示在快照被攝取時(shí)具有活動(dòng)的實(shí)例的所有類的超文本文檔。
圖9表示在快照被攝取時(shí)具有活動(dòng)的實(shí)例的一個(gè)類的超文本文檔。
圖10表示不含子類的一個(gè)類的實(shí)例的超文本文檔。
圖11表示包含子類的一個(gè)類的實(shí)例的超文本文檔。
圖12表示一個(gè)活動(dòng)對(duì)象的有關(guān)信息的超文本文檔。
圖13表示根集引用到一個(gè)不含弱引用的活動(dòng)對(duì)象的超文本文檔。
圖14表示根集引用到一個(gè)包含弱引用的活動(dòng)對(duì)象的超文本文檔。
圖15A和15B表示從一個(gè)活動(dòng)對(duì)象可達(dá)到的所有對(duì)象的超文本文檔。
圖16A~16E表示根集所有成員的超文本文檔。
圖17表示兩個(gè)不同運(yùn)行期的活動(dòng)對(duì)象之間的差別(例如新實(shí)例)的確定過(guò)程。
圖18表示一個(gè)類的新實(shí)例的超文本文檔。
圖19表示一個(gè)包含子類的類的新實(shí)例的超文本文檔。
圖20A~20B描述可用于存儲(chǔ)活動(dòng)對(duì)象的有關(guān)信息的數(shù)據(jù)結(jié)構(gòu)。
圖21表示BOD服務(wù)器的一個(gè)實(shí)施例。
定義類-一種面向?qū)ο蟮臄?shù)據(jù)類型,它定義共享相同特征的對(duì)象,一般包括數(shù)據(jù)以及以該數(shù)據(jù)為操作對(duì)象的函數(shù)。
對(duì)象(或?qū)嵗?-類的一個(gè)例化的成員。
對(duì)象的根集-不通過(guò)其它對(duì)象鏈接能被直接引用的對(duì)象。
活動(dòng)對(duì)象-已經(jīng)被例化、并且是根集的成員或者可被根集的成員直接或間接引用的對(duì)象。
本機(jī)方法(或代碼)-用Java程序設(shè)計(jì)語(yǔ)言以外的其它程序設(shè)計(jì)語(yǔ)言寫成的函數(shù)。
概述在以下的說(shuō)明中,將結(jié)合對(duì)執(zhí)行期間Java程序(例如字節(jié)代碼)的執(zhí)行進(jìn)行分析的最佳實(shí)施例來(lái)說(shuō)明本發(fā)明。具體來(lái)說(shuō),將要說(shuō)明例子中,有用C++程序設(shè)計(jì)語(yǔ)言寫成Java模擬機(jī)。然而,本發(fā)明不局限于任何特定語(yǔ)言、計(jì)算機(jī)結(jié)構(gòu)、或特定的實(shí)現(xiàn)。因此,以下對(duì)實(shí)施例的說(shuō)明的目的是示范性而不是限制性的。
圖1表示可用于執(zhí)行本發(fā)明一個(gè)實(shí)施例的軟件的一例計(jì)算機(jī)系統(tǒng)。圖1所示的計(jì)算機(jī)系統(tǒng)1包括顯示器3、屏幕5、機(jī)箱7、鍵盤9和鼠標(biāo)11。鼠標(biāo)11可以有一個(gè)或多個(gè)用于與圖形用戶界面交互作用的按鈕。機(jī)箱7內(nèi)安裝了CD-ROM驅(qū)動(dòng)器13、系統(tǒng)內(nèi)存和硬盤驅(qū)動(dòng)器(見(jiàn)圖2),它們可用于存儲(chǔ)和檢索實(shí)現(xiàn)本發(fā)明的含有計(jì)算機(jī)代碼的軟件程序、用于本發(fā)明的數(shù)據(jù),等等。盡管CD-ROM13被顯示為典型的計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),其它計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),包括軟盤、磁帶、快速存儲(chǔ)器、系統(tǒng)內(nèi)存以及硬盤驅(qū)動(dòng)器,也都可以使用。此外,在載波中(例如在包括因特網(wǎng)在內(nèi)的網(wǎng)絡(luò)中)實(shí)現(xiàn)的數(shù)據(jù)信號(hào)也可以是計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)。
圖2表示用于執(zhí)行本發(fā)明一個(gè)實(shí)施例的軟件的計(jì)算機(jī)系統(tǒng)1的系統(tǒng)框圖。如圖1所示,計(jì)算機(jī)系統(tǒng)1包括監(jiān)視器3、鍵盤9和鼠標(biāo)11。計(jì)算機(jī)系統(tǒng)1進(jìn)一步包括數(shù)個(gè)子系統(tǒng),諸如中央處理器51、系統(tǒng)內(nèi)存53、固定式存儲(chǔ)器55(例如硬盤驅(qū)動(dòng)器)、可卸式存儲(chǔ)器57(例如CD-ROM驅(qū)動(dòng)器)、顯示適配器59、聲卡61、揚(yáng)聲器63、以及網(wǎng)絡(luò)接口65。其它適于本發(fā)明使用的計(jì)算機(jī)系統(tǒng)可以包括更多或更少的子系統(tǒng)。例如,另一種計(jì)算機(jī)系統(tǒng)可包括多個(gè)處理器(即多處理器系統(tǒng)),或包括一個(gè)高速緩存。
計(jì)算機(jī)系統(tǒng)1的系統(tǒng)總線體系結(jié)構(gòu)由箭頭67表示。然而,這些箭頭是表示用于連接各個(gè)子系統(tǒng)的互連方案。例如,可以用本地總線連接中央處理器到系統(tǒng)存儲(chǔ)器和顯示適配器。圖2中所示的計(jì)算機(jī)系統(tǒng)1只是適合本發(fā)明使用的計(jì)算機(jī)系統(tǒng)的一例。其它具有不同子系統(tǒng)配置的計(jì)算機(jī)結(jié)構(gòu)也可以使用。
一般來(lái)說(shuō),用Java程序設(shè)計(jì)語(yǔ)言寫成的計(jì)算機(jī)程序要被編譯成字節(jié)代碼或Java虛擬機(jī)指令,然后由Java虛擬機(jī)執(zhí)行。字節(jié)代碼被存儲(chǔ)在一個(gè)類文件中輸入到Java虛擬機(jī)用于解釋。圖3表示一段簡(jiǎn)單的Java源代碼被一個(gè)解釋程序-Java虛擬機(jī)執(zhí)行的過(guò)程。
Java源代碼101包括用Java編寫的經(jīng)典Hello World程序。源代碼然后被輸入到字節(jié)代碼編譯器103,后者把源代碼編譯成字節(jié)代碼。字節(jié)代碼被稱為虛擬機(jī)指令,因?yàn)樗麄儗⒈灰粋€(gè)軟件仿真的計(jì)算機(jī)執(zhí)行。一般來(lái)說(shuō),虛擬機(jī)指令是通用的(即不是專門為任何特定的微處理器和計(jì)算機(jī)結(jié)構(gòu)設(shè)計(jì)的),但是這并不是非這樣不可。字節(jié)代碼編譯器輸出一個(gè)包括Java程序的字節(jié)代碼的Java類文件105。
該Java類文件被輸入到Java虛擬機(jī)107。Java虛擬機(jī)是一個(gè)解碼并執(zhí)行Java類文件中字節(jié)代碼的解釋器。Java虛擬機(jī)是一個(gè)解釋器,但是它通常被稱作Java虛擬機(jī),因?yàn)樗密浖抡嬉粋€(gè)微處理器或計(jì)算機(jī)結(jié)構(gòu)(例如硬件上可能不存在的微處理器和計(jì)算機(jī)結(jié)構(gòu))。
圖4表示一個(gè)Java運(yùn)行期系統(tǒng)的一個(gè)實(shí)現(xiàn)的部件。Java虛擬機(jī)的實(shí)現(xiàn)被稱為Java運(yùn)行期系統(tǒng)。Java運(yùn)行期系統(tǒng)201可以接受輸入Java類文件203、標(biāo)準(zhǔn)內(nèi)嵌Java類205和本機(jī)方法207,以便執(zhí)行一個(gè)Java程序。標(biāo)準(zhǔn)內(nèi)嵌Java類可以是諸如線程、串等等對(duì)象的類。本機(jī)方法可以用Java程序設(shè)計(jì)語(yǔ)言之外的其它程序設(shè)計(jì)語(yǔ)言編寫。本機(jī)方法一般存儲(chǔ)在動(dòng)態(tài)鏈接庫(kù)(DDL)或共享庫(kù)中。
Java運(yùn)行期系統(tǒng)也可以與一個(gè)操作系統(tǒng)209連接。例如,可以由操作系統(tǒng)來(lái)處理輸入-輸出函數(shù),包括提供Java運(yùn)行期系統(tǒng)與Java類文件203、標(biāo)準(zhǔn)內(nèi)嵌Java類205和本機(jī)方法207的連接。
動(dòng)態(tài)類加載器和檢驗(yàn)器211通過(guò)操作系統(tǒng)209將Java類文件203和標(biāo)準(zhǔn)內(nèi)嵌Java類205裝入內(nèi)存213。此外,動(dòng)態(tài)類加載器和檢驗(yàn)器還可以檢驗(yàn)Java類文件中字節(jié)代碼的正確性,報(bào)告所發(fā)現(xiàn)的任何錯(cuò)誤。
本機(jī)方法鏈接器215通過(guò)操作系統(tǒng)209連接本機(jī)方法207到Java運(yùn)行期系統(tǒng)并將本機(jī)方法存儲(chǔ)在內(nèi)存213。如圖所示,內(nèi)存213可以為Java類保留一個(gè)類和方法區(qū),為本機(jī)方法保留一個(gè)本機(jī)方法區(qū)。內(nèi)存213中的類和方法區(qū)可以被存儲(chǔ)在一個(gè)垃圾回收堆中。在一個(gè)新的對(duì)象被創(chuàng)建時(shí),他們?nèi)鎯?chǔ)在垃圾收集堆中。當(dāng)空間不再使用時(shí),由Java運(yùn)行期系統(tǒng)而不是應(yīng)用程序,負(fù)責(zé)回收垃圾回收堆中的內(nèi)存。
圖4所示的Java運(yùn)行期系統(tǒng)的核心是一個(gè)執(zhí)行引擎217。該執(zhí)行引擎執(zhí)行存儲(chǔ)在內(nèi)存213中的指令,并且可以用軟件、硬件、或二者的組合來(lái)實(shí)現(xiàn)。執(zhí)行引擎支持面向?qū)ο蟮膽?yīng)用程序,并且在概念上說(shuō),有多個(gè)執(zhí)行引擎在并行地運(yùn)行,每個(gè)Java線程有一個(gè)執(zhí)行引擎。執(zhí)行引擎217也可以利用后援代碼221(support code)。后援代碼可以提供與例外、線程、安全等等有關(guān)的功能。
當(dāng)Java程序執(zhí)行時(shí),函數(shù)在每個(gè)線程內(nèi)部被順序調(diào)用。每個(gè)線程有一個(gè)執(zhí)行堆棧,存儲(chǔ)每個(gè)尚未完成執(zhí)行的函數(shù)的幀。幀存儲(chǔ)著函數(shù)的執(zhí)行所需的信息,這種信息可能包括狀態(tài)變量、局部變量和一個(gè)操作數(shù)堆棧。當(dāng)一個(gè)函數(shù)被調(diào)用時(shí),該函數(shù)的一個(gè)幀被壓入執(zhí)行堆棧。當(dāng)函數(shù)結(jié)束時(shí),函數(shù)的幀被彈出執(zhí)行堆棧。因此,只有與執(zhí)行堆棧頂部的幀對(duì)應(yīng)的函數(shù)是活動(dòng)的,與執(zhí)行堆棧頂部以下的幀對(duì)應(yīng)的函數(shù)已經(jīng)將它們的執(zhí)行掛起,一直要等到它們調(diào)用的函數(shù)返回(即結(jié)束)。
圖5表示在一個(gè)執(zhí)行堆棧上存儲(chǔ)的Java函數(shù)的幀。圖中所示的執(zhí)行堆棧301在執(zhí)行堆棧頂部有一個(gè)幀303,幀305和307分別在幀303的下面。一個(gè)堆棧指針SP指向執(zhí)行堆棧的頂部,而一個(gè)幀指針FP指向位于執(zhí)行堆棧301頂部的堆棧中的一個(gè)幀指針。
圖中顯示,每個(gè)幀都包括一個(gè)狀態(tài)變量、一個(gè)局部變量和一個(gè)用于對(duì)應(yīng)該幀的函數(shù)的操作數(shù)幀。此外,存儲(chǔ)在幀中的最后項(xiàng)是一個(gè)幀指針,它指向執(zhí)行堆棧上位于當(dāng)前幀下面的幀中的幀指針,如圖309和311所示。雖然存儲(chǔ)本機(jī)方法的幀的執(zhí)行堆??赡芸雌饋?lái)不一樣,但基本原則一般是與所示執(zhí)行堆棧一樣的。
分析運(yùn)行期的執(zhí)行為了分析一個(gè)Java程序的執(zhí)行,用戶用一個(gè)Java虛擬機(jī)來(lái)執(zhí)行程序。虛擬機(jī)負(fù)責(zé)解釋Java程序,為了提高效率,可以執(zhí)行編譯。圖6表示存儲(chǔ)在運(yùn)行期期間獲得的活動(dòng)對(duì)象有關(guān)的信息的過(guò)程。
在步驟401,系統(tǒng)在運(yùn)行期期間接受輸入以存儲(chǔ)活動(dòng)對(duì)象的有關(guān)信息。例如,用戶可能按下某些鍵(例如<control>\),向系統(tǒng)表示活動(dòng)對(duì)象的有關(guān)信息應(yīng)當(dāng)要存儲(chǔ)了。
系統(tǒng)然后在步驟403,搜索以根集的成員開(kāi)始的被請(qǐng)求信息。是根集成員的對(duì)象可以被直接引用。例如,在最佳實(shí)施例中,是根集成員的對(duì)象可以被Java類的靜態(tài)數(shù)據(jù)成員引用、被Java或本機(jī)執(zhí)行堆棧局部引用、或者被本機(jī)代碼全局引用(全局Java本機(jī)接口引用)。系統(tǒng)可以從是根集成員的對(duì)象開(kāi)始,遞歸地跟蹤對(duì)由根集成員引用的任何其它對(duì)象的引用。這樣,所有是根集成員的對(duì)象或是可以直接或間接被根集成員引用的對(duì)象都將被確定(即從根集可到達(dá)的對(duì)象的傳遞閉包)。這些對(duì)象就是此時(shí)此刻的活動(dòng)對(duì)象。在最佳實(shí)施例中,使用了一個(gè)與垃圾回收算法類似的標(biāo)記與掃描算法。
一旦確定了活動(dòng)對(duì)象,系統(tǒng)就在步驟405存儲(chǔ)關(guān)于這些對(duì)象的信息。這種信息可能包括對(duì)象的標(biāo)識(shí)符、表示對(duì)象是否是根集成員以及為什么是一個(gè)根集成員(例如,被一個(gè)Java類的靜態(tài)數(shù)據(jù)成員引用)的標(biāo)志、線程標(biāo)識(shí)符(適用的話)、類標(biāo)識(shí)符、對(duì)象的數(shù)據(jù),等等。在最佳實(shí)施例中被存儲(chǔ)的信息如圖18A~18B所示。在Java程序中,類的對(duì)象存儲(chǔ)存儲(chǔ)其它對(duì)象的結(jié)構(gòu)(即某特定類的所有對(duì)象的結(jié)構(gòu)),所以活動(dòng)對(duì)象相關(guān)的信息可能包括定義其它對(duì)象的結(jié)構(gòu)的對(duì)象。
活動(dòng)對(duì)象相關(guān)的信息可以被存儲(chǔ)在文件或任何其它計(jì)算機(jī)存儲(chǔ)器(例如內(nèi)存)中。該信息可在活動(dòng)對(duì)象被確定時(shí)或者隨后被一次性存儲(chǔ)。因此,流程圖中表示的步驟是示例性的,本領(lǐng)域的熟練人員容易明白,在其它實(shí)施例中可以對(duì)這些步驟進(jìn)行組合、刪除或插入。盡管這種信息可以在運(yùn)行期期間分析,但一般都是在程序停止執(zhí)行后再作分析。圖7表示提供在運(yùn)行期期間獲得的活動(dòng)對(duì)象有關(guān)的信息的過(guò)程。在步驟451,系統(tǒng)檢索所存儲(chǔ)的活動(dòng)對(duì)象的相關(guān)信息,這種信息不僅包括關(guān)于活動(dòng)對(duì)象本身的信息,也包括關(guān)于它們相互間關(guān)系的信息?;顒?dòng)對(duì)象之間的關(guān)系可能就像是一個(gè)有向圖結(jié)構(gòu),它以根集成員為開(kāi)端,一般是經(jīng)過(guò)各種間接層次,前進(jìn)到其它對(duì)象。所以,不是根集成員的對(duì)象,能夠像圖6中步驟403一樣地通過(guò)跟蹤從根集成員的引用而被確定。
一旦檢索出活動(dòng)對(duì)象的相關(guān)信息,系統(tǒng)就在步驟453接受一個(gè)用戶查詢。在一個(gè)最佳實(shí)施例中,該查詢被作為一個(gè)統(tǒng)一資源定位器(URL)詳細(xì)登記到一個(gè)超文本傳輸協(xié)議(HTTP)服務(wù)器。以下說(shuō)明可能用到的查詢。
“全部類查詢”顯示在運(yùn)行期出現(xiàn)在堆上的類的全部。這些類可以按其完全限定類名被排序,組織成封裝結(jié)構(gòu)。這個(gè)查詢的結(jié)果的例子在圖8A~8E中表示。
“類查詢”顯示關(guān)于一個(gè)期望的類的信息。該信息可能包括超類、任何子類、實(shí)例數(shù)據(jù)成員、以及靜態(tài)數(shù)據(jù)成員。這個(gè)查詢的結(jié)果的例子在圖9中表示。
“實(shí)例查詢”顯示一個(gè)指定類的所有實(shí)例。這個(gè)查詢的結(jié)果的例子在圖10中表示。
“對(duì)象查詢”顯示在運(yùn)行期出現(xiàn)在堆上的一個(gè)對(duì)象的有關(guān)信息。最值得注意的是,人們可以漫游到引用該對(duì)象的對(duì)象,這一點(diǎn)可用于追蹤錯(cuò)誤。這個(gè)查詢的結(jié)果的例子在圖12中表示。
“根查詢”提供從根集到特定對(duì)象的引用鏈??梢蕴峁哪艿竭_(dá)所感興趣的對(duì)象的根集的每個(gè)成員開(kāi)始的引用鏈。在最佳實(shí)施例中,這些鏈?zhǔn)前瓷疃葍?yōu)先搜索計(jì)算的,目的是為了減少鏈的長(zhǎng)度。也可以采用其它搜索技術(shù)?!案樵儭笔遣檎覂?nèi)存泄漏的一種很有價(jià)值的查詢,因?yàn)榭捎盟鼇?lái)判斷對(duì)象為什么仍然是活動(dòng)的。這個(gè)查詢的結(jié)果的例子在圖13中表示。
“可到達(dá)對(duì)象查詢”顯示從特定對(duì)象可到達(dá)的所有對(duì)象的傳遞閉包。該查詢適用于判斷內(nèi)存中某對(duì)象總運(yùn)行期的軌跡。這個(gè)查詢的結(jié)果的例子在(圖12后的)圖中表示。
“全部根查詢”顯示根集的所有成員。這個(gè)查詢的結(jié)果的例子在圖14中表示。
除非在步驟455該查詢表明用戶結(jié)束,否則,系統(tǒng)在步驟457生成一個(gè)或多個(gè)超文本文檔,以提供符合該查詢的信息。超文本文檔包括向文檔其它部分或其它文檔的鏈接。在最佳實(shí)施例中,超文本文檔用超文本標(biāo)記語(yǔ)言(HTML)編寫。
在步驟459,系統(tǒng)將該超文本文檔提供給用戶去分析。完成方法是創(chuàng)建一個(gè)HTTP服務(wù)器去提供一個(gè)能用Web瀏覽器閱覽的HTML文檔。
以上說(shuō)明了本發(fā)明的實(shí)施例。但是讀者去讀一讀提供給用戶作分析的數(shù)據(jù)的例子可能是有幫助的。一旦活動(dòng)對(duì)象的有關(guān)信息的快照被攝取并放入HTML文檔,用戶就可以用Web瀏覽器去分析該信息。較好的著手點(diǎn)是顯示所有有過(guò)活動(dòng)實(shí)例的對(duì)象的一個(gè)查詢。
圖8A~8E表示在快照被攝取時(shí)具有活動(dòng)的實(shí)例的全部類的超文本文檔。如圖所示,類是通過(guò)封裝組織的。加下劃線的文字代表到其它HTML文檔的超文本鏈接。舉例來(lái)說(shuō),可以選取圖8D中的鏈接503去更詳細(xì)地閱讀關(guān)于類jovial.slotCar.track.TrackSegment的信息。
圖9表示在快照被攝取時(shí)具有活動(dòng)的實(shí)例的一個(gè)類的超文本文檔,本例中,該類是jovial.slotCar.track.TrackSegment。這樣,當(dāng)用戶“點(diǎn)擊”鏈接503,就會(huì)看見(jiàn)圖9表示的超文本文檔。如圖所示,諸如超類、子類、實(shí)例數(shù)據(jù)成員、以及靜態(tài)數(shù)據(jù)成員之類的信息,可以用指向更詳細(xì)信息的超文本鏈接表示出來(lái)。
在圖9中超文本文檔的底部,用戶可以通過(guò)不合子類的鏈接553或包括子類的鏈接575去閱讀該類的活動(dòng)實(shí)例。換言之,鏈接553將顯示類jovial.slotCar.track.TrackSegment的所有實(shí)例,但是不包括這個(gè)類的子類的實(shí)例。鏈接575將顯示類jovial.slotCar.track.TrackSegment的所有實(shí)例-包括這個(gè)類的子類的實(shí)例(例如,類jovial.slotCar.track.CurvedTrackSegment和jovial.slotCar.track.StraightTrackSegment)。
圖10表示不含子類的一個(gè)類的實(shí)例的超文本文檔。盡管該超文本文檔不是選擇鏈接533時(shí)出現(xiàn)的超文本文檔,但是它代表了超文本文檔的式樣的一個(gè)例子。如圖所示,有類jovial.slotCar.Car的兩個(gè)實(shí)例,它們位于特定的內(nèi)存位置。如果用戶要分析關(guān)于這兩個(gè)實(shí)例中任何一個(gè)的更詳細(xì)信細(xì),就可以選擇鏈接。鏈接607將結(jié)合圖12作更詳細(xì)的說(shuō)明。
圖11表示包含子類的一個(gè)類的實(shí)例的超文本文檔。該圖表示如果用戶點(diǎn)擊圖9的鏈接575后會(huì)出現(xiàn)什么。由于子類的實(shí)例被顯示出來(lái),有些實(shí)例可能會(huì)比jovial.slotCar.track.TrackSegment包含更多數(shù)據(jù)或函數(shù)。然而,所有這些實(shí)例將繼承這個(gè)父類。
圖12表示一個(gè)活動(dòng)對(duì)象的有關(guān)信息的超文本文檔。該活動(dòng)對(duì)象是可通過(guò)圖10中鏈接607選擇的活動(dòng)對(duì)象。如圖所示,類、實(shí)例數(shù)據(jù)成員、對(duì)該對(duì)象的引用、自根集的引用鏈都可以提供。舉例來(lái)說(shuō),鏈接635會(huì)顯示不含弱引用的自根集的引用鏈,鏈接675會(huì)顯示包含弱引用的自根集的引用鏈。弱引用是在需要更多內(nèi)存或堆空間時(shí)垃圾回收器會(huì)將其移去的一種引用。鏈接681會(huì)顯示能由該對(duì)象到達(dá)(或引用)的所有對(duì)象。
圖13表示根集引用到一個(gè)不含弱引用的活動(dòng)對(duì)象的超文本文檔,而圖14表示根集引用到一個(gè)包含弱引用的活動(dòng)對(duì)象的超文本文檔。盡管圖中沒(méi)有表示出弱引用,圖13中鏈接691允許用戶切換到圖14,而圖14中鏈接693則允許用戶切換回去。
圖15A和15B表示從一個(gè)活動(dòng)對(duì)象可達(dá)到的所有對(duì)象的超文本文檔。這在用戶激活圖12的鏈接681時(shí)就會(huì)顯示出來(lái)。這些對(duì)象可以通過(guò)搜尋活動(dòng)對(duì)象的一個(gè)有向圖來(lái)確定。
回頭參見(jiàn)圖8E,鏈接705允許用戶請(qǐng)求閱覽根集的所有成員。圖16A~16E表示如果激活鏈接705就會(huì)顯示的根集所有成員的超文本文檔。如圖所示,根集的成員可以按照它們被引用的方式來(lái)組織。引用方式例如,Java靜態(tài)引用、Java局部引用、本機(jī)靜態(tài)引用、本機(jī)局部引用。圖16E中鏈接715允許用戶請(qǐng)求有過(guò)活動(dòng)實(shí)例的所有類,諸如圖8A~8E。
超文本文檔的諸例說(shuō)明了用戶可以容易地分析最佳實(shí)施例中的活動(dòng)對(duì)象。然而,本發(fā)明并不局限于通過(guò)超文本文檔來(lái)表示,本領(lǐng)域的熟練人員會(huì)明白,其它方法也可以采用。
為了進(jìn)一步理解本發(fā)明,描述一下用戶能在其中執(zhí)行對(duì)Java程序的分析的情景可能是有幫助的。內(nèi)存泄漏是幾乎所有程序設(shè)計(jì)語(yǔ)言中普遍存在的問(wèn)題。概括地說(shuō),內(nèi)存泄漏指內(nèi)存已經(jīng)分配,但不再被一個(gè)計(jì)算機(jī)程序使用。在最壞的情況下,內(nèi)存泄漏會(huì)因?yàn)闆](méi)有足夠的可用內(nèi)存而導(dǎo)致內(nèi)存分配出錯(cuò)。在由根集向不再需要的堆中的對(duì)象的引用時(shí),內(nèi)存泄漏可能歸咎于程序員的錯(cuò)誤。
假定用戶懷疑有內(nèi)存泄漏問(wèn)題,用戶可計(jì)算在特定運(yùn)行期應(yīng)當(dāng)是活動(dòng)的某個(gè)類的實(shí)例的數(shù)量。用戶然后就可以按照本發(fā)明實(shí)施例生成活動(dòng)對(duì)象的快照。用戶然后可以分析所存儲(chǔ)的信息,確定曾經(jīng)是活動(dòng)的實(shí)例的數(shù)量。如果數(shù)量比預(yù)期的多,用戶可以追蹤從錯(cuò)誤的活動(dòng)對(duì)象出發(fā)的引用,以判斷什么對(duì)象正保持一個(gè)錯(cuò)誤的引用。
此外,本發(fā)明的實(shí)施例允許用戶比較活動(dòng)對(duì)象的快照。圖17表示了確定在兩個(gè)不同的運(yùn)行期的活動(dòng)對(duì)象之間的差別的過(guò)程。
在步驟751,系統(tǒng)存儲(chǔ)與在第一運(yùn)行期的活動(dòng)對(duì)象有關(guān)的信息。隨后在步驟753,系統(tǒng)存儲(chǔ)與在第二運(yùn)行期的活動(dòng)對(duì)象有關(guān)的信息。然后再指令系統(tǒng)按上述方式存儲(chǔ)由用戶輸入的信息。
用戶可以在步驟755指令系統(tǒng)去確定第一、第二運(yùn)行期之間的差異。例如,用戶可以指定存儲(chǔ)著兩個(gè)運(yùn)行期的快照的文件。系統(tǒng)然后比較這兩個(gè)快照,確定這兩個(gè)快照之間的差異-例如在第二運(yùn)行期出現(xiàn)了什么新實(shí)例。
第一、第二運(yùn)行期之間的差異一旦確定,系統(tǒng)就在步驟757接受用戶查詢。除以上說(shuō)明的查詢外,還可以使用一個(gè)“新實(shí)例查詢”,該查詢只顯示在第二運(yùn)行期中的新實(shí)例?!靶隆睂?shí)例是指在第一快照中出現(xiàn)但是在第二快照沒(méi)有相同標(biāo)識(shí)符的對(duì)象的實(shí)例。對(duì)象的標(biāo)識(shí)符是由虛擬機(jī)分配、唯一地標(biāo)識(shí)對(duì)象的一個(gè)32位的整數(shù)(或句柄(handle))。盡管句柄可以被重用,在相對(duì)較短的時(shí)間間隔內(nèi)攝取的快照一般產(chǎn)生很好的結(jié)果。這種查詢的結(jié)果的一個(gè)例子如圖8所示。
除非在步驟759該查詢表示用戶結(jié)束,否則,系統(tǒng)在步驟761生成一個(gè)或多個(gè)超文本文檔,以提供符合查詢的信息(例如兩個(gè)快照之間的差異)。在步驟763,系統(tǒng)將該超文本文檔提供給用戶去分析,完成方法是創(chuàng)建一個(gè)HTTP服務(wù)器去提供一個(gè)能用Web瀏覽器閱覽的HTML文檔。
類的新實(shí)例的超文本文檔如圖18中所示。如圖所示,鏈接801允許用戶查看該類的詳細(xì)信息,而鏈接803允許用戶查看該新實(shí)例的詳細(xì)信息。在圖18中的超文本文檔中沒(méi)有表示子類。圖19表示了一個(gè)包含子類的類的新實(shí)例的超文本文檔,本例中還有它們其它的實(shí)例。
在調(diào)試期間,分析計(jì)算機(jī)程序隨時(shí)間推移如何變化是有益的。運(yùn)用本發(fā)明實(shí)施例,用戶不僅能攝取運(yùn)行期期間多個(gè)活動(dòng)對(duì)象快照,而且能讓系統(tǒng)比較快照并表示差異,供進(jìn)一步分析之用。
至此,就可以將關(guān)于活動(dòng)對(duì)象的信息的具體細(xì)節(jié)存儲(chǔ)起來(lái)。圖20A~20B描述了最佳實(shí)施例中可用于存儲(chǔ)活動(dòng)對(duì)象的相關(guān)信息的一種數(shù)據(jù)結(jié)構(gòu)??梢园凑者@些圖中說(shuō)明的結(jié)構(gòu)存儲(chǔ)一個(gè)二進(jìn)制對(duì)象轉(zhuǎn)儲(chǔ)(binaryobject dump-BOD)文件。盡管最佳實(shí)施例中可以使用這種結(jié)構(gòu),也可以使用其它結(jié)構(gòu),這并不偏離本發(fā)明的精神。
圖21顯示BOD服務(wù)器的典型部件。服務(wù)器啟動(dòng)時(shí),讀一個(gè)BOD文件并在內(nèi)存中建立所示的結(jié)構(gòu)。該結(jié)構(gòu)的頂層是一個(gè)快照實(shí)例(所示對(duì)象是快照的成員)。當(dāng)用戶請(qǐng)求信息時(shí),服務(wù)器將該快照作為堆內(nèi)容的只讀表示來(lái)處理。
以上是對(duì)本發(fā)明的最佳實(shí)施例的全部說(shuō)明,但是也可以使用其它可選方式、改進(jìn)方式和同等方式。顯然,如果適當(dāng)改動(dòng)上述實(shí)施例,本發(fā)明同樣適合。例如,上述實(shí)施例是結(jié)合Java虛擬機(jī)說(shuō)明的,但本發(fā)明的原理完全適用于其它系統(tǒng)和語(yǔ)言。因此,不應(yīng)將上述說(shuō)明看作是對(duì)本發(fā)明范圍的限制。本發(fā)明的范圍應(yīng)有附后的權(quán)利要求以及與權(quán)利要求對(duì)等內(nèi)容的范圍來(lái)界定。
權(quán)利要求
1.在計(jì)算機(jī)系統(tǒng)中,一種分析面向?qū)ο蟮某绦虻膱?zhí)行的方法,該方法包含接受面向?qū)ο蟪绦蜻\(yùn)行期期間要求存儲(chǔ)與活動(dòng)對(duì)象相關(guān)的信息的輸入;掃描由是對(duì)象的根集的成員的對(duì)象開(kāi)始的活動(dòng)對(duì)象;存儲(chǔ)與活動(dòng)對(duì)象相關(guān)的信息。
2.權(quán)利要求1的方法,其中,掃描與活動(dòng)對(duì)象相關(guān)的信息包括掃描由對(duì)象的根集中一個(gè)對(duì)象引用的對(duì)象。
3.權(quán)利要求1的方法,其中,存儲(chǔ)與活動(dòng)對(duì)象相關(guān)的信息包括存儲(chǔ)對(duì)象根集中的對(duì)象以及由對(duì)象根集中一個(gè)對(duì)象引用的對(duì)象的相關(guān)信息。
4.權(quán)利要求1或2的方法,其中,與活動(dòng)對(duì)象相關(guān)的信息包括一對(duì)象是該對(duì)象的根集的成員的指示。
5.前述的任一權(quán)利要求的方法,其中,對(duì)象根集的每個(gè)對(duì)象由靜態(tài)數(shù)據(jù)成員、來(lái)自堆棧的局部引用或來(lái)自本機(jī)代碼的引用所引用。
6.前述的任一權(quán)利要求的方法,其中,活動(dòng)對(duì)象包括定義其它對(duì)象的結(jié)構(gòu)的對(duì)象。
7.前述的任一權(quán)利要求的方法,其中,活動(dòng)對(duì)象的相關(guān)信息被存儲(chǔ)在文件中。
8.前述的任一權(quán)利要求的方法,其中,活動(dòng)對(duì)象包括Java類的實(shí)例。
9.一種用于分析面向?qū)ο蟮某绦虻膱?zhí)行的計(jì)算機(jī)程序產(chǎn)品,包含接受面向?qū)ο蟪绦蜻\(yùn)行期期間要求存儲(chǔ)與活動(dòng)對(duì)象相關(guān)的信息的輸入的計(jì)算機(jī)代碼;掃描由是對(duì)象的根集的成員的對(duì)象開(kāi)始的活動(dòng)對(duì)象的計(jì)算機(jī)代碼;存儲(chǔ)與活動(dòng)對(duì)象相關(guān)的信息的計(jì)算機(jī)代碼;存儲(chǔ)這些計(jì)算機(jī)代碼的計(jì)算機(jī)可讀介質(zhì)。
10.權(quán)利要求9的計(jì)算機(jī)程序產(chǎn)品,其中,掃描與活動(dòng)對(duì)象相關(guān)的信息的計(jì)算機(jī)代碼包括掃描由對(duì)象的根集中一個(gè)對(duì)象引用的對(duì)象的計(jì)算機(jī)代碼。
11.權(quán)利要求9的計(jì)算機(jī)程序產(chǎn)品,其中,存儲(chǔ)與活動(dòng)對(duì)象相關(guān)的信息的計(jì)算機(jī)代碼包括存儲(chǔ)與對(duì)象的根集中的對(duì)象以及由對(duì)象的根集中一個(gè)對(duì)象引用的對(duì)象相關(guān)的信息的計(jì)算機(jī)代碼。
12.權(quán)利要求9~11的任一個(gè)權(quán)利要求的計(jì)算機(jī)程序產(chǎn)品,其中,與活動(dòng)對(duì)象相關(guān)的信息包括一對(duì)象是該對(duì)象的根集的一個(gè)成員的指示。
13.權(quán)利要求9~12的任一個(gè)權(quán)利要求的計(jì)算機(jī)程序產(chǎn)品,其中,對(duì)象的根集的每個(gè)對(duì)象由靜態(tài)數(shù)據(jù)成員、來(lái)自堆棧的局部引用或來(lái)自本機(jī)代碼的引用所引用。
14.權(quán)利要求9~13的任一個(gè)權(quán)利要求的計(jì)算機(jī)程序產(chǎn)品,其中,活動(dòng)對(duì)象包括定義其它對(duì)象的結(jié)構(gòu)的對(duì)象。
15.權(quán)利要求9~14的任一個(gè)權(quán)利要求的計(jì)算機(jī)程序產(chǎn)品,其中,活動(dòng)對(duì)象的相關(guān)信息被存儲(chǔ)在文件中。
16.權(quán)利要求9~15的任一個(gè)權(quán)利要求的計(jì)算機(jī)程序產(chǎn)品,其中,活動(dòng)對(duì)象包括Java類的實(shí)例。
17.權(quán)利要求9~16的任一個(gè)權(quán)利要求的計(jì)算機(jī)程序產(chǎn)品,其中計(jì)算機(jī)可讀介質(zhì)是從CD-ROM、軟盤、磁帶、快速存儲(chǔ)器、系統(tǒng)內(nèi)存、硬盤驅(qū)動(dòng)器以及在載波中實(shí)現(xiàn)的組中選擇的。
18.在計(jì)算機(jī)系統(tǒng)中,一種分析面向?qū)ο蟮某绦虻膱?zhí)行的方法,該方法包含在面向?qū)ο蟪绦虻膱?zhí)行的第一時(shí)刻檢索活動(dòng)對(duì)象的相關(guān)信息;生成一個(gè)表示活動(dòng)對(duì)象相關(guān)信息的超文本文檔;將該超文本文檔提供給用戶作分析用。
19.權(quán)利要求18的方法,進(jìn)一步包含在面向?qū)ο蟪绦虻膱?zhí)行的第二時(shí)刻檢索活動(dòng)對(duì)象的相關(guān)信息。
20.權(quán)利要求19的方法,進(jìn)一步包含確定第一和第二時(shí)刻的活動(dòng)對(duì)象之間的差異。
21.權(quán)利要求20的方法,其中的差異包括在第二時(shí)刻出現(xiàn)但在第一時(shí)刻不出現(xiàn)的活動(dòng)對(duì)象。
22.18~21中的任一權(quán)利要求的方法,其中的活動(dòng)對(duì)象包括Java類的實(shí)例和用超文本標(biāo)記語(yǔ)言(HTML)寫成的超文本文檔。
23.一種用于分析面向?qū)ο蟮某绦虻膱?zhí)行的計(jì)算機(jī)程序產(chǎn)品,包含在面向?qū)ο蟪绦虻膱?zhí)行的第一時(shí)刻檢索活動(dòng)對(duì)象的相關(guān)信息的計(jì)算機(jī)代碼;生成一個(gè)表示活動(dòng)對(duì)象相關(guān)信息的超文本文檔的計(jì)算機(jī)代碼;將該超文本文檔提供給用戶作分析用的計(jì)算機(jī)代碼;存儲(chǔ)這些計(jì)算機(jī)代碼的計(jì)算機(jī)可讀介質(zhì)。
24.權(quán)利要求23的計(jì)算機(jī)程序產(chǎn)品,進(jìn)一步包含在面向?qū)ο蟪绦虻膱?zhí)行的第二時(shí)刻檢索活動(dòng)對(duì)象的相關(guān)信息的計(jì)算機(jī)代碼;確定第一和第二時(shí)刻的活動(dòng)對(duì)象之間的差異的計(jì)算機(jī)代碼,其中的差異包括在第二時(shí)刻出現(xiàn)但在第一時(shí)刻不出現(xiàn)的活動(dòng)對(duì)象。
25.在計(jì)算機(jī)系統(tǒng)中,一種用于分析面向?qū)ο蟮某绦虻膱?zhí)行的方法,該方法包含在面向?qū)ο蟪绦蜻\(yùn)行期期間,存儲(chǔ)在面向?qū)ο蟪绦虻膱?zhí)行的第一時(shí)刻和第二時(shí)刻的活動(dòng)對(duì)象的相關(guān)信息;檢索在面向?qū)ο蟪绦虻膱?zhí)行的第一時(shí)刻和第二時(shí)刻的活動(dòng)對(duì)象的相關(guān)信息;確定第一和第二時(shí)刻的活動(dòng)對(duì)象之間的差異;生成一個(gè)表示第一和第二時(shí)刻的活動(dòng)對(duì)象相關(guān)信息之間差異的超文本文檔;將該表示第一和第二時(shí)刻的活動(dòng)對(duì)象相關(guān)信息之間差異的超文本文檔提供給用戶作分析用。
26.一種用于分析面向?qū)ο蟮某绦虻膱?zhí)行的計(jì)算機(jī)程序產(chǎn)品,包含在面向?qū)ο蟪绦蜻\(yùn)行期期間,存儲(chǔ)在面向?qū)ο蟪绦虻膱?zhí)行的第一時(shí)刻和第二時(shí)刻的活動(dòng)對(duì)象的相關(guān)信息的計(jì)算機(jī)代碼;檢索在面向?qū)ο蟪绦虻膱?zhí)行的第一時(shí)刻和第二時(shí)刻的活動(dòng)對(duì)象的相關(guān)信息的計(jì)算機(jī)代碼;確定第一和第二時(shí)刻的活動(dòng)對(duì)象之間的差異的計(jì)算機(jī)代碼;生成一個(gè)表示第一和第二時(shí)刻的活動(dòng)對(duì)象相關(guān)信息之間差異的超文本文檔的計(jì)算機(jī)代碼;將該表示第一和第二時(shí)刻的活動(dòng)對(duì)象相關(guān)信息之間差異的超文本文檔提供給用戶作分析用的計(jì)算機(jī)代碼;存儲(chǔ)這些計(jì)算機(jī)代碼的計(jì)算機(jī)可讀介質(zhì)。
全文摘要
提供一種用于分析面向?qū)ο蟮挠?jì)算機(jī)程序的技術(shù)。執(zhí)行期間特定時(shí)刻的活動(dòng)對(duì)象的快照可以被存儲(chǔ)起來(lái)。用一種分析工具去生成使用戶能分析活動(dòng)對(duì)象的超文本文檔。此外,用戶還可以比較在兩個(gè)不同運(yùn)行期的活動(dòng)對(duì)象的不同快照,以便例如能容易地確定類的新實(shí)例。
文檔編號(hào)G06F11/28GK1221912SQ9812279
公開(kāi)日1999年7月7日 申請(qǐng)日期1998年12月9日 優(yōu)先權(quán)日1997年12月9日
發(fā)明者W·F·福特, J·D·尼瑟旺格 申請(qǐng)人:太陽(yáng)微系統(tǒng)有限公司