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

內(nèi)存占用分析方法及裝置與流程

文檔序號:12034508閱讀:218來源:國知局
內(nèi)存占用分析方法及裝置與流程

本發(fā)明涉及一種信息處理技術(shù)領(lǐng)域,特別是涉及一種內(nèi)存占用分析方法及裝置。



背景技術(shù):

隨著移動通信技術(shù)的發(fā)展,諸如手機等移動終端設(shè)備越來越普及,大量的應(yīng)用軟件也隨之應(yīng)運而生,用戶通常會在移動終端設(shè)備中安裝許多應(yīng)用軟件來滿足各種業(yè)務(wù)需求。為了使得應(yīng)用軟件在移動終端上充分利用資源且能穩(wěn)定運行,需要在應(yīng)用軟件開發(fā)完成后進行性能測試。

目前在對應(yīng)用軟件進行內(nèi)存占用性能方面的測試時,通過應(yīng)用軟件相應(yīng)的啟動進程對內(nèi)存的占用數(shù)值來判別該應(yīng)用軟件的內(nèi)存占用情況,然而,應(yīng)用軟件會包含多個類的對象,例如,java對象、原生態(tài)native對象、根root對象等,通過上述分析方式只能整體分析得到應(yīng)用軟件的內(nèi)存占用情況,不能細粒度的分析某一對象的內(nèi)存占用情況,進而會導(dǎo)致應(yīng)用軟件的內(nèi)存占用分析的精度較低。



技術(shù)實現(xiàn)要素:

有鑒于此,本發(fā)明提供了一種內(nèi)存占用分析方法、裝置及系統(tǒng),主要目的在于可以細粒度的分析某一對象的內(nèi)存占用情況,進而可以提高應(yīng)用軟件的內(nèi)存占用分析的精度。

依據(jù)本發(fā)明一個方面,提供了一種內(nèi)存占用分析方法,該方法包括:

獲取軟件測試對應(yīng)的內(nèi)存對象轉(zhuǎn)儲文件;

對所述內(nèi)存對象轉(zhuǎn)儲文件進行解析,得到不同類的對象;

對所述對象進行內(nèi)存占用監(jiān)控,得到所述對象對應(yīng)的內(nèi)存占用信息。

依據(jù)本發(fā)明另一個方面,提供了一種內(nèi)存占用分析裝置,該裝置包括:

獲取單元,用于獲取軟件測試對應(yīng)的內(nèi)存對象轉(zhuǎn)儲文件;

解析單元,用于對所述獲取單元獲取的內(nèi)存對象轉(zhuǎn)儲文件進行解析,得到不同類的對象;

監(jiān)控單元,用于對所述解析單元解析到的對象進行內(nèi)存占用監(jiān)控,得到所述對象對應(yīng)的內(nèi)存占用信息。。

依據(jù)本發(fā)明又一個方面,提供了一種計算機可讀存儲介質(zhì),其上存儲有計算機程序,該程序被處理器執(zhí)行時實現(xiàn)以下步驟:

獲取軟件測試對應(yīng)的內(nèi)存對象轉(zhuǎn)儲文件;

對所述內(nèi)存對象轉(zhuǎn)儲文件進行解析,得到不同類的對象;

對所述對象進行內(nèi)存占用監(jiān)控,得到所述對象對應(yīng)的內(nèi)存占用信息。

依據(jù)本發(fā)明再一個方面,提供了一種內(nèi)存占用分析裝置,包括存儲器、處理器及存儲在存儲器上并可在處理器上運行的計算機程序,所述處理器執(zhí)行所述程序時實現(xiàn)以下步驟:

獲取軟件測試對應(yīng)的內(nèi)存對象轉(zhuǎn)儲文件;

對所述內(nèi)存對象轉(zhuǎn)儲文件進行解析,得到不同類的對象;

對所述對象進行內(nèi)存占用監(jiān)控,得到所述對象對應(yīng)的內(nèi)存占用信息。

借由上述技術(shù)方案,本發(fā)明提供的一種內(nèi)存占用分析方法及裝置,與目前通過應(yīng)用軟件相應(yīng)的啟動進程對內(nèi)存的占用數(shù)值來判別該應(yīng)用軟件的內(nèi)存占用情況相比,本發(fā)明可以對軟件測試對應(yīng)的內(nèi)存對象轉(zhuǎn)儲文件進行解析,得到不同類的對象,進而可以基于不同類的對象進行內(nèi)存占用監(jiān)控,得到不同對象分別對應(yīng)的內(nèi)存占用信息,可以細粒度的分析某一對象的內(nèi)存占用情況,可以提高應(yīng)用軟件的內(nèi)存占用分析的精度,方便開發(fā)者基于不同對象的內(nèi)存占用情況,對存在問題的對象直接進行調(diào)整,無需再對軟件各對象分別進行分析,從而可以提高軟件開發(fā)效率。

上述說明僅是本發(fā)明技術(shù)方案的概述,為了能夠更清楚了解本發(fā)明的技術(shù)手段,而可依照說明書的內(nèi)容予以實施,并且為了讓本發(fā)明的上述和其它目的、特征和優(yōu)點能夠更明顯易懂,以下特舉本發(fā)明的具體實施方式。

附圖說明

通過閱讀下文優(yōu)選實施方式的詳細描述,各種其他的優(yōu)點和益處對于本領(lǐng)域普通技術(shù)人員將變得清楚明了。附圖僅用于示出優(yōu)選實施方式的目的,而并不認為是對本發(fā)明的限制。而且在整個附圖中,用相同的參考符號表示相同的部件。在附圖中:

圖1示出了本發(fā)明實施例提供的一種內(nèi)存占用分析方法流程示意圖;

圖2示出了本發(fā)明實施例提供的另一種內(nèi)存占用分析方法流程示意圖;

圖3示出了本發(fā)明實施例提供的一種基于對象的內(nèi)存占用分析實例示意圖;

圖4示出了本發(fā)明實施例提供的一種內(nèi)存占用分析裝置的結(jié)構(gòu)示意圖;

圖5示出了本發(fā)明實施例提供的另一種內(nèi)存占用分析裝置的結(jié)構(gòu)示意圖;

圖6示出了本發(fā)明實施例提供的一種內(nèi)存占用分析的實體裝置結(jié)構(gòu)示意圖。

具體實施方式

下面將參照附圖更詳細地描述本公開的示例性實施例。雖然附圖中顯示了本公開的示例性實施例,然而應(yīng)當(dāng)理解,可以以各種形式實現(xiàn)本公開而不應(yīng)被這里闡述的實施例所限制。相反,提供這些實施例是為了能夠更透徹地理解本公開,并且能夠?qū)⒈竟_的范圍完整的傳達給本領(lǐng)域的技術(shù)人員。

如背景技術(shù)所述,目前在對應(yīng)用軟件進行內(nèi)存占用性能方面的測試時,通過應(yīng)用軟件相應(yīng)的啟動進程對內(nèi)存的占用數(shù)值來判別該應(yīng)用軟件的內(nèi)存占用情況,只能整體分析得到應(yīng)用軟件的內(nèi)存占用情況,不能細粒度的分析軟件某一對象的內(nèi)存占用情況,進而會導(dǎo)致出現(xiàn)應(yīng)用軟件的內(nèi)存占用分析精度較低的問題。

為了解決上述問題,本發(fā)明實施例提供了一種內(nèi)存占用分析方法,可以細粒度的分析某一對象的內(nèi)存占用情況,進而可以提高應(yīng)用軟件的內(nèi)存占用分析的精度,如圖1所示,該方法包括:

101、獲取軟件測試對應(yīng)的內(nèi)存對象轉(zhuǎn)儲文件。

其中,內(nèi)存對象轉(zhuǎn)儲文件中記錄了軟件測試過程中的內(nèi)存使用情況。該內(nèi)存對象轉(zhuǎn)儲文件可以由現(xiàn)有軟件開發(fā)工具根據(jù)軟件測試結(jié)果生成得到。

對于本發(fā)明實施例的執(zhí)行主體可以為用于軟件內(nèi)存占用分析的裝置,在軟件內(nèi)存占用性能測試的過程中,該裝置可以通過特定的接口函數(shù)獲取相應(yīng)的內(nèi)存對象轉(zhuǎn)儲文件;然后通過對該內(nèi)存對象轉(zhuǎn)儲文件進行解析,進而監(jiān)控更細粒度的不同對象的內(nèi)存占用情況,具體可以執(zhí)行步驟102至步驟103所述的過程。

102、對獲取到的內(nèi)存對象轉(zhuǎn)儲文件進行解析,得到不同類的對象。

例如,根據(jù)內(nèi)存對象轉(zhuǎn)儲文件中記錄的軟件測試過程中的內(nèi)存使用情況,從內(nèi)存對象轉(zhuǎn)儲文件中解析得到不同的java對象、native對象、root對象等,具體可以為不同的圖片對象、視頻對象、數(shù)據(jù)庫對象、文本對象等。

103、對解析得到的對象進行內(nèi)存占用監(jiān)控,得到對象對應(yīng)的內(nèi)存占用信息。

例如,基于內(nèi)存對象轉(zhuǎn)儲文件進行讀取,統(tǒng)計不同的java對象、native對象、root對象等分別對應(yīng)的內(nèi)存占用大小,并將內(nèi)存占用較多的對象進行標記,發(fā)送給軟件開發(fā)人員進行查看,方便開發(fā)人員基于這些不同對象的內(nèi)存占用情況,對存在內(nèi)存占用較大的對象直接進行調(diào)整,無需再對軟件各對象分別進行分析,進而可以提高軟件開發(fā)效率。

本發(fā)明實施例提供的一種內(nèi)存占用分析方法,與目前通過應(yīng)用軟件相應(yīng)的啟動進程對內(nèi)存的占用數(shù)值來判別該應(yīng)用軟件的內(nèi)存占用情況相比,本發(fā)明實施例可以對軟件測試對應(yīng)的內(nèi)存對象轉(zhuǎn)儲文件進行解析,得到不同類的對象,進而可以基于不同類的對象進行內(nèi)存占用監(jiān)控,得到不同對象分別對應(yīng)的內(nèi)存占用信息,可以細粒度的分析某一對象的內(nèi)存占用情況,進而可以提高應(yīng)用軟件的內(nèi)存占用分析的精度。

進一步的,為了更好的說明上述處理方法的過程,作為對上述實施例的細化和擴展,本發(fā)明實施例提供了另一種內(nèi)存占用分析方法,以安卓(android)系統(tǒng)為例,如圖2所示,但不限于此,具體如下所示:

201、在安卓系統(tǒng)中,通過debug類的預(yù)定dumphprofdata接口函數(shù)獲取內(nèi)存對象轉(zhuǎn)儲dumphprof文件。

202、根據(jù)內(nèi)存對象轉(zhuǎn)儲dumphprof文件中記錄的不同標簽tag值,分別創(chuàng)建各自對應(yīng)類的對象。

例如,獲取得到內(nèi)存對象轉(zhuǎn)儲dumphprof文件之后,讀取該dumphprof文件中記錄的tag值,其可能的取值為0x01至0x23,共35個值,依據(jù)這些tag值,分別創(chuàng)建各自對應(yīng)類的對象,以便根據(jù)解析得到的這些對象進行內(nèi)存占用監(jiān)控,得到對象對應(yīng)的內(nèi)存占用信息,實現(xiàn)細粒度的分析某一對象的內(nèi)存占用情況。

具體地,對于本發(fā)明實施例,在創(chuàng)建對象之前,需要創(chuàng)建不同的集合以便在創(chuàng)建對象時進行調(diào)用,其中創(chuàng)建不同集合具體的實現(xiàn)過程可以包括:對內(nèi)存對象轉(zhuǎn)儲dumphprof文件進行解析,若解析到tag值為預(yù)定字符串信息的值,則根據(jù)當(dāng)前讀取位的下一個整型值和下一個字節(jié)的長度,創(chuàng)建字符串集合;若解析到tag值為預(yù)定已加載類信息的值,則根據(jù)當(dāng)前讀取位的下一個整型值和已創(chuàng)建的字符串集合,創(chuàng)建已加載類集合;若解析到tag值為預(yù)定函數(shù)調(diào)用棧信息的值,則根據(jù)當(dāng)前讀取位之后預(yù)置個數(shù)的整型值和已創(chuàng)建的字符串集合,創(chuàng)建調(diào)用棧對象集合;若解析到tag值為預(yù)定棧幀信息的值,則根據(jù)當(dāng)前讀取位之后預(yù)設(shè)個數(shù)的字節(jié)和已創(chuàng)建的調(diào)用棧對象集合,創(chuàng)建調(diào)用棧幀集合。

其中,上述根據(jù)當(dāng)前讀取位的下一個整型值和下一個字節(jié)的長度,創(chuàng)建字符串集合的步驟具體可以包括:確定當(dāng)前讀取位的下一個整型值和下一個字節(jié)的長度,并將該整型值確定為標識號碼;繼續(xù)讀取以該長度為個數(shù)的字節(jié);根據(jù)以該長度為個數(shù)的字節(jié)的內(nèi)容和該標識號碼,創(chuàng)建字符串集合。

例如,預(yù)定字符串信息的值為0x01,對內(nèi)存對象轉(zhuǎn)儲dumphprof文件進行解析,如果解析到的tag值為0x01,讀取下一個整型int值作為其標識號碼id;再讀取下一個字節(jié),該字節(jié)里面存儲的內(nèi)容即為字符串的長度length;然后再讀取length個字節(jié),這length個字節(jié)的內(nèi)容即為字符串內(nèi)容value;最后將id和value按照鍵值對key、value的形式存儲到映射map對象的字符串集合mstrings中,該字符串集合中保存有在每一次解析到的tag值為0x01時,重復(fù)上述過程得到的id值和字符串內(nèi)容value值。

上述根據(jù)當(dāng)前讀取位的下一個整型值和已創(chuàng)建的字符串集合,創(chuàng)建已加載類集合的過程具體可以包括:確定當(dāng)前讀取位的下一個整型值,作為標識號碼;根據(jù)該標識號碼從已創(chuàng)建的字符串集合中查詢對應(yīng)的字符串值;將查詢到的字符串值確定為類的類名;根據(jù)所述類名和所述標識號碼創(chuàng)建已加載類集合。

例如,預(yù)定已加載類信息的值為0x02,對內(nèi)存對象轉(zhuǎn)儲dumphprof文件進行解析,如果解析到的tag值為0x02,讀取下一個整型int值作為其標識號碼id;再以該id值為key,從已創(chuàng)建的字符串集合mstrings中找到對應(yīng)的字符串值,作為類的類名classname;最后將id和classname按照鍵值對key、value的形式存儲到映射map對象的已加載類集合mclasss中,該已加載類集合中保存有在每一次解析到的tag值為0x02時,重復(fù)上述過程得到的id值和classname值。

上述根據(jù)當(dāng)前讀取位之后預(yù)置個數(shù)的整型值和已創(chuàng)建的字符串集合,創(chuàng)建調(diào)用棧對象集合的過程具體可以包括:確定當(dāng)前讀取位的下一個整型值,作為標識號碼;繼續(xù)讀取下一個整型值之后預(yù)置個數(shù)的整型值,分別作為方法名標識、方法簽名標識、源文件標識、序列號標識、行號標識;根據(jù)該方法名標識、方法簽名標識、源文件標識、序列號標識、行號標識,在已創(chuàng)建的字符串集合中進行查詢;根據(jù)查詢結(jié)果創(chuàng)建函數(shù)調(diào)用棧信息;依據(jù)函數(shù)調(diào)用棧信息和標識號碼,創(chuàng)建調(diào)用棧對象集合。

例如,預(yù)定函數(shù)調(diào)用棧信息的值為0x04,預(yù)置個數(shù)為5個,對內(nèi)存對象轉(zhuǎn)儲dumphprof文件進行解析,如果解析到的tag值為0x04,讀取下一個整型int值作為其標識號碼id;再繼續(xù)讀取接下來的5個整型值,分別作為方法名標識methodnameid、方法簽名標識methodsignatureid、源文件標識sourcefileid、序列號標識serialid、行號標識linenumberid;然后使用這5個id作為key,從已創(chuàng)建的字符串集合mstrings中找到各自對應(yīng)的字符串值,分別作為方法名methodname、方法簽名methodsignature、源文件sourcefile、序列號serial、行號linenumber;再然后以methodname、methodsignature、sourcefile、serial、linenumber這5個值創(chuàng)建一個函數(shù)調(diào)用棧信息frame;最后以標識號碼id、frame按照鍵值對key、value的形式存儲到調(diào)用棧對象集合mframes中,該調(diào)用棧對象集合中保存有在每一次解析到的tag值為0x04時,重復(fù)上述過程得到的標識號碼id值和frame值。

上述根據(jù)當(dāng)前讀取位之后預(yù)設(shè)個數(shù)的字節(jié)和已創(chuàng)建的調(diào)用棧對象集合,創(chuàng)建調(diào)用棧幀集合的過程具體可以包括:繼續(xù)讀取當(dāng)前讀取位之后預(yù)設(shè)個數(shù)的字節(jié),分別作為序列號碼、線程序列號碼、函數(shù)調(diào)用棧數(shù);再繼續(xù)讀取以函數(shù)調(diào)用棧數(shù)為個數(shù)的字節(jié),作為函數(shù)調(diào)用棧信息的標識;從調(diào)用棧對象集合中獲取與函數(shù)調(diào)用棧信息的標識對應(yīng)的函數(shù)調(diào)用棧信息,并組成調(diào)用棧集合;根據(jù)組成的調(diào)用棧集合、序列號碼、線程序列號碼,創(chuàng)建調(diào)用棧幀集合。

例如,預(yù)定棧幀信息的值為0x05,預(yù)設(shè)個數(shù)為5個,對內(nèi)存對象轉(zhuǎn)儲dumphprof文件進行解析,如果解析到的tag值為0x05,讀取接下來的三個字節(jié)分別作為序列號碼serialnumber、線程序列號碼threadserialnumber、函數(shù)調(diào)用棧數(shù)numframes;再繼續(xù)讀取numframes個字節(jié)作為函數(shù)調(diào)用棧信息frame的id,從已創(chuàng)建的調(diào)用棧對象集合mframes中按照該id,查找到對應(yīng)的函數(shù)調(diào)用棧信息frame,并組成調(diào)用棧集frames;最后以serialnumber、threadserialnumber、frames三個值創(chuàng)建調(diào)用棧幀stacktrace,并將stacktrace和與該stacktrace對應(yīng)的調(diào)用棧序列號碼保存在調(diào)用棧幀集合mtraces中,該調(diào)用棧幀集合mtraces中保存有在每一次解析到的tag值為0x05時,重復(fù)上述過程得到的stacktrace值和與該stacktrace對應(yīng)的調(diào)用棧序列號碼。

進一步的,在上述各個集合創(chuàng)建完畢后,若解析到tag值為預(yù)定堆轉(zhuǎn)儲信息的值,則以當(dāng)前讀取位的下一個字節(jié)的長度為個數(shù)繼續(xù)進行讀取tag值,并根據(jù)讀取到的tag值,創(chuàng)建對應(yīng)類的對象。

例如,預(yù)定堆轉(zhuǎn)儲信息的值為0x0c或0x1c,在上述各個集合創(chuàng)建完畢后,對內(nèi)存對象轉(zhuǎn)儲dumphprof文件進行解析,若解析到的tag值為0x0c或0x1c,讀取下一個字節(jié)作為其長度length;接下來循環(huán)讀取length個數(shù)目的tag值,根據(jù)讀取到的tag值,創(chuàng)建對應(yīng)類的對象。

具體地,若讀取到的tag值為第一預(yù)定值,則根據(jù)讀取到的tag值,創(chuàng)建對應(yīng)類的對象,具體可以包括:創(chuàng)建相應(yīng)的根root對象。

例如,第一預(yù)定值可以為oxff、0x01、0x05、0x07、0x89、0x8a、0x8b、0x8c、0x90中的一個,如果讀取到的tag值為這些值時,創(chuàng)建相應(yīng)的root對象,并存儲到當(dāng)前堆heap對象mheap的成員mroots集合中。

若讀取到的tag值為第二預(yù)定值,則根據(jù)讀取到的tag值,創(chuàng)建對應(yīng)類的對象,具體可以包括:繼續(xù)讀取當(dāng)前讀取位之后預(yù)設(shè)個數(shù)的字節(jié),分別作為標識號碼、線程序列號碼、堆棧幀號碼;從已創(chuàng)建的線程對象集合中查詢與線程序列號碼對應(yīng)的線程對象;從已創(chuàng)建的調(diào)用棧幀集合中查詢與線程對象的調(diào)用棧序列號碼對應(yīng)的調(diào)用棧幀信息;根據(jù)調(diào)用棧幀信息、標識號碼、線程序列號碼,創(chuàng)建相應(yīng)的原始態(tài)native對象、或java對象、或原始態(tài)棧nativestack對象、或線程塊threadblock對象。

例如,第二預(yù)定值可以為0x02、0x03、0x04、0x06中的一個,預(yù)設(shè)個數(shù)可以為3個,如果讀取到的tag值為0x02時,讀取接下來的三個字節(jié)分別作為標識號碼id、線程序列號碼threadserialnumber、堆棧幀號碼stackframenumber;根據(jù)threadserialnumber,從已創(chuàng)建的線程對象集合mthreads中查找到對應(yīng)的線程對象threadobj;再根據(jù)當(dāng)前線程對象threadobj的調(diào)用棧序列號碼traceserialnumber值,從已經(jīng)創(chuàng)建的調(diào)用棧幀集合mtraces中查詢對應(yīng)的調(diào)用棧幀信息trace;最后根據(jù)id、threadserialnumber、trace三個值創(chuàng)建native對象nativeobj,并存儲到mroots集合中。

如果讀取到的tag值為0x03時,重復(fù)上述過程,并在最后根據(jù)id、threadserialnumber、trace三個值創(chuàng)建java對象javaobj,并存儲到mroots集合中;如果讀取到的tag值為0x04時,重復(fù)上述過程,并在最后根據(jù)id、threadserialnumber、trace三個值創(chuàng)建nativestack對象nativestackobj,并存儲到mroots集合中;如果讀取到的tag值為0x06時,重復(fù)上述過程,并在最后根據(jù)id、threadserialnumber、trace三個值創(chuàng)建threadblock對象threadblockobj,并存儲到mroots集合中。

若讀取到的tag值為第三預(yù)定值,則根據(jù)讀取到的tag值,創(chuàng)建對應(yīng)類的對象,具體可以包括:繼續(xù)讀取當(dāng)前讀取位之后預(yù)設(shè)個數(shù)的字節(jié),分別作為標識號碼、線程序列號碼、堆棧幀號碼;根據(jù)標識號碼和堆棧幀號碼創(chuàng)建線程對象threadobject對象。

例如,第三預(yù)定值可以為0x08,預(yù)設(shè)個數(shù)可以為3個,如果讀取到的tag值為0x08時,讀取接下來的三個字節(jié)分別作為標識號碼id、線程序列號碼threadserialnumber、堆棧序列號碼stackserialnumber;根據(jù)id和stackframenumber值創(chuàng)建threadobject對象threadobj;最后以stackframenumber和threadobj分別作為鍵值對key、value存儲到線程集合對象集合mthreads中。

若讀取到的tag值為第四預(yù)定值,則根據(jù)讀取到的tag值,創(chuàng)建對應(yīng)類的對象,具體可以包括:繼續(xù)讀取當(dāng)前讀取位之后預(yù)定個數(shù)的字節(jié),分別作為標識號碼、線程序列號碼、超類號碼、類加載器號碼、對象實例尺寸、數(shù)目項、位置信息;從已創(chuàng)建的線程對象集合中查詢與線程序列號碼對應(yīng)的線程對象;從已創(chuàng)建的調(diào)用棧幀集合中查詢與線程對象的調(diào)用棧序列號碼對應(yīng)的調(diào)用棧幀信息;從已創(chuàng)建的已加載類集合中查詢與標識號碼對應(yīng)的類名稱;根據(jù)標識號碼、調(diào)用棧幀信息、類名稱、位置信息,創(chuàng)建類對象classobj對象,并根據(jù)超類號碼和類加載器號碼對classobj對象進行配置。

例如,第四預(yù)定值可以為0x20,預(yù)定個數(shù)可以為7個,如果讀取到的tag值為0x20時,讀取接下來的7個字節(jié)分別作為標識號碼id、線程序列號碼threadserialnumber、超類號碼superclassid,類加載器號碼classloaderid,對象實例尺寸instancesize、數(shù)目項numentries、位置信息position;根據(jù)threadserialnumber,從已創(chuàng)建的線程對象集合mthreads中查詢對應(yīng)的線程對象threadobj;根據(jù)當(dāng)前線程對象threadobj的調(diào)用棧序列號碼traceserialnumber值,從已經(jīng)創(chuàng)建的調(diào)用棧幀集合mtraces中查詢到對應(yīng)的調(diào)用棧幀信息trace;根據(jù)id值,從已創(chuàng)建的已加載類集合mclasss中查詢到當(dāng)前類class的名稱classname;然后根據(jù)id、trace、classname、position,創(chuàng)建classobj對象classobj,并配置classobj的superclassid和classloaderid值為解析到的superclassid和classloaderid;最后以id、classobj分別作為鍵值對key、value,存儲到類class集合的mclassesbyid中。

若讀取到的tag值為第五預(yù)定值,則根據(jù)讀取到的tag值,創(chuàng)建對應(yīng)類的對象,具體可以包括:繼續(xù)讀取當(dāng)前讀取位之后預(yù)置個數(shù)的字節(jié),分別作為標識號碼、堆棧號碼、類號碼、剩余量、位置信息;從已創(chuàng)建的調(diào)用棧幀集合中查詢與堆棧號碼對應(yīng)的調(diào)用棧幀信息;根據(jù)標識號碼、調(diào)用棧幀信息、位置信息,創(chuàng)建類實例classinstance對象,并根據(jù)類號碼對classinstance對象進行配置。

例如,第五預(yù)定值可以為0x21,預(yù)置個數(shù)可以為5個,如果讀取到的tag值為0x21時,讀取接下來的5個字節(jié)分別作為標識號碼id、堆棧號碼stackid、類號碼classid、剩余量remaining、位置信息position;根據(jù)stackid,從已創(chuàng)建的調(diào)用棧幀集合mtraces中查詢對應(yīng)的調(diào)用棧幀信息stack;根據(jù)id、stack、position三個值創(chuàng)建classinstance對象instance,并配置instance的classid值為classid;最后將以id、instance分別作為鍵值對key、value,存儲到堆heap對象的instance集合minstance中。

若讀取到的tag值為第六預(yù)定值,則根據(jù)讀取到的tag值,創(chuàng)建對應(yīng)類的對象,具體可以包括:繼續(xù)讀取當(dāng)前讀取位之后預(yù)置個數(shù)的字節(jié),分別作為標識號碼、堆棧號碼、元素數(shù)、類號碼、位置信息;從已創(chuàng)建的調(diào)用棧幀集合中查詢與堆棧號碼對應(yīng)的調(diào)用棧幀信息;根據(jù)標識號碼、調(diào)用棧幀信息、位置信息、元素數(shù),創(chuàng)建數(shù)組實例arrayinstance對象,并根據(jù)類號碼對arrayinstance對象進行配置。

例如,第六預(yù)定值可以為0x22,預(yù)置個數(shù)可以為5個,如果讀取到的tag值為0x22時,讀取接下來的5個字節(jié)分別作為標識號碼id、堆棧號碼stackid、元素數(shù)numelements、類號碼classid、位置信息position;根據(jù)stackid,從已創(chuàng)建的調(diào)用棧幀集合mtraces中查詢到對應(yīng)的調(diào)用棧幀信息stack;然后根據(jù)id、stack、position、numelements四個值創(chuàng)建arrayinstance對象array,并配置array的classid值為classid;最后將以id、array分別作為鍵值對key、value,存儲到堆heap對象的instance集合minstance中。

若讀取到的tag值為第七預(yù)定值,則根據(jù)讀取到的tag值,創(chuàng)建對應(yīng)類的對象,具體可以包括:繼續(xù)讀取當(dāng)前讀取位之后特定個數(shù)的字節(jié),分別作為標識號碼、堆棧號碼、元素數(shù)、類號碼、類型、位置信息;從已創(chuàng)建的調(diào)用棧幀集合中查詢與堆棧號碼對應(yīng)的調(diào)用棧幀信息;根據(jù)標識號碼、調(diào)用棧幀信息、位置信息、元素數(shù),創(chuàng)建數(shù)組實例arrayinstance對象,并根據(jù)類號碼對arrayinstance對象進行配置。

例如,第七預(yù)定值可以為0x23或0xc3,特定個數(shù)可以為6個,如果讀取到的tag值為0x23或0xc3時,讀取接下來的6個字節(jié)分別作為標識號碼id、堆棧號碼stackid、元素數(shù)numelements、類號碼classid、類型type、位置信息position;再根據(jù)stackid,從已創(chuàng)建的調(diào)用棧幀集合中查詢到對應(yīng)的調(diào)用棧幀信息stack;然后根據(jù)id、stack、type、numelements、position五個值創(chuàng)建arrayinstance對象array,并配置array的classid值為classid;最后將以id、array分別作為鍵值對key、value,存儲到堆heap對象的instance集合minstance中。

若讀取到的tag值為第八預(yù)定值,則根據(jù)讀取到的tag值,創(chuàng)建對應(yīng)類的對象,具體可以包括:繼續(xù)讀取當(dāng)前讀取位之后預(yù)設(shè)個數(shù)的字節(jié),分別作為標識號碼、線程序列號碼、堆棧深度;從預(yù)置線程對象集合中查詢與線程序列號碼對應(yīng)的線程對象;根據(jù)線程對象的調(diào)用棧序列號碼和所述堆棧深度,從調(diào)用棧幀集合中查詢相應(yīng)的調(diào)用棧幀信息;根據(jù)標識號碼、線程序列號碼、調(diào)用棧幀信息,創(chuàng)建根對象rootobj對象。

例如,第八預(yù)定值可以為0x8e,預(yù)設(shè)個數(shù)可以為3個,如果讀取到的tag值為0x8e時,讀取接下來的三個字節(jié)分別作為標識號碼id、線程序列號碼threadserialnumber、堆棧深度stackdepth;再根據(jù)threadserialnumber從已創(chuàng)建的線程對象集合mtheads中查詢到當(dāng)前的線程對象threadobj;然后根據(jù)threadobj的traceserialnumber成員和stackdepth從已創(chuàng)建的mtraces集合中查詢到當(dāng)前的調(diào)用棧幀信息trace;最后根據(jù)id、threadserialnumber、trace三個值創(chuàng)建rootobj對象root,并將root對象添加到mroots集合中。

進一步的,當(dāng)讀取到堆的tag值時,可以做堆集合的處理,例如,如果讀取到的tag值為0xfe時,讀取接下來的兩個字節(jié),分別作為堆標識heapid、堆名稱標識heapnameid;根據(jù)heapnameid,從已創(chuàng)建的字符串集合mstrings集合中查詢到當(dāng)前的堆heap名稱heapname;最后以heapid、heapname分別作為鍵值對key、value,存儲到heap集合mheaps中。

203、對解析得到的對象進行內(nèi)存占用監(jiān)控,得到對象對應(yīng)的內(nèi)存占用信息。

例如,可以針對上述實例中根root對象、原始態(tài)native對象、java對象、原始態(tài)棧nativestack對象、線程塊threadblock對象、線程對象threadobject、類對象classobj等進行內(nèi)存占用監(jiān)控,得到不同對象的內(nèi)存占用情況,并發(fā)送給軟件開發(fā)人員進行查看,如圖3所示,軟件a中不同對象的內(nèi)存占用情況,這樣方便開發(fā)人員基于這些不同對象的內(nèi)存占用情況,對存在內(nèi)存占用較大的對象直接進行調(diào)整。

本發(fā)明實施例提供的另一種內(nèi)存占用分析方法,與目前通過應(yīng)用軟件相應(yīng)的啟動進程對內(nèi)存的占用數(shù)值來判別該應(yīng)用軟件的內(nèi)存占用情況相比,可以實現(xiàn)基于不同類的對象進行內(nèi)存占用監(jiān)控,得到不同對象分別對應(yīng)的內(nèi)存占用信息,進而可以細粒度的分析某一對象的內(nèi)存占用情況,從而可以提高應(yīng)用軟件的內(nèi)存占用分析的精度。

進一步的,作為圖1和圖2所述方法的具體實現(xiàn),本發(fā)明實施例提供了一種內(nèi)存占用分析裝置,如圖4所示,所述服務(wù)器包括:獲取單元31、解析單元32、監(jiān)控單元33。

獲取單元31,可以用于獲取軟件測試對應(yīng)的內(nèi)存對象轉(zhuǎn)儲文件;獲取單元31為本裝置中獲取內(nèi)存對象轉(zhuǎn)儲文件的主要功能模塊。

解析單元32,用于對所述獲取單元31獲取的內(nèi)存對象轉(zhuǎn)儲文件進行解析,得到不同類的對象;解析單元32為本裝置中對內(nèi)存對象轉(zhuǎn)儲文件進行解析的主要功能模塊,為本裝置中的核心單元模塊。

監(jiān)控單元33,可以用于對所述解析單元32解析到的對象進行內(nèi)存占用監(jiān)控,得到所述對象對應(yīng)的內(nèi)存占用信息。監(jiān)控單元33為本裝置中監(jiān)控不同對象內(nèi)存占用信息的主要功能模塊。

在具體的應(yīng)用場景中,所述解析單元32,具體可以用于根據(jù)所述內(nèi)存對象轉(zhuǎn)儲文件中記錄的不同標簽tag值,分別創(chuàng)建各自對應(yīng)類的對象。

在具體的應(yīng)用場景中,如圖5所示,所述解析單元32具體可以包括:解析模塊321、創(chuàng)建模塊322。

解析模塊321,可以用于對所述內(nèi)存對象轉(zhuǎn)儲文件進行解析。

創(chuàng)建模塊322,可以用于若所述解析模塊321解析到tag值為預(yù)定字符串信息的值,則根據(jù)當(dāng)前讀取位的下一個整型值和下一個字節(jié)的長度,創(chuàng)建字符串集合;若解析到tag值為預(yù)定已加載類信息的值,則根據(jù)當(dāng)前讀取位的下一個整型值和所述字符串集合,創(chuàng)建已加載類集合;若解析到tag值為預(yù)定函數(shù)調(diào)用棧信息的值,則根據(jù)當(dāng)前讀取位之后預(yù)置個數(shù)的整型值和所述字符串集合,創(chuàng)建調(diào)用棧對象集合;若解析到tag值為預(yù)定棧幀信息的值,則根據(jù)當(dāng)前讀取位之后預(yù)設(shè)個數(shù)的字節(jié)和所述調(diào)用棧對象集合,創(chuàng)建調(diào)用棧幀集合;若解析到tag值為預(yù)定堆轉(zhuǎn)儲信息的值,則以當(dāng)前讀取位的下一個字節(jié)的長度為個數(shù)繼續(xù)進行讀取tag值,并根據(jù)讀取到的tag值,創(chuàng)建對應(yīng)類的對象。

在具體的應(yīng)用場景中,所述創(chuàng)建模塊322,具體可以用于若讀取到的tag值為第一預(yù)定值,則創(chuàng)建相應(yīng)的根root對象。

在具體的應(yīng)用場景中,所述創(chuàng)建模塊322,具體還可以用于若讀取到的tag值為第二預(yù)定值,則繼續(xù)讀取當(dāng)前讀取位之后預(yù)設(shè)個數(shù)的字節(jié),分別作為標識號碼、線程序列號碼、堆棧幀號碼;從預(yù)置線程對象集合中查詢與所述線程序列號碼對應(yīng)的線程對象;從所述調(diào)用棧幀集合中查詢與所述線程對象的調(diào)用棧序列號碼對應(yīng)的調(diào)用棧幀信息;根據(jù)所述調(diào)用棧幀信息、所述標識號碼、所述線程序列號碼,創(chuàng)建相應(yīng)的原始態(tài)native對象、或java對象、或原始態(tài)棧nativestack對象、或線程塊threadblock對象。

在具體的應(yīng)用場景中,所述創(chuàng)建模塊322,具體還可以用于若讀取到的tag值為第三預(yù)定值,則繼續(xù)讀取當(dāng)前讀取位之后預(yù)設(shè)個數(shù)的字節(jié),分別作為標識號碼、線程序列號碼、堆棧序列號碼;根據(jù)所述標識號碼和所述堆棧序列號碼創(chuàng)建線程對象threadobject對象。

在具體的應(yīng)用場景中,所述創(chuàng)建模塊322,具體還可以用于若讀取到的tag值為第四預(yù)定值,則繼續(xù)讀取當(dāng)前讀取位之后預(yù)定個數(shù)的字節(jié),分別作為標識號碼、線程序列號碼、超類號碼、類加載器號碼、對象實例尺寸、數(shù)目項、位置信息;從預(yù)置線程對象集合中查詢與所述線程序列號碼對應(yīng)的線程對象;從所述調(diào)用棧幀集合中查詢與所述線程對象的調(diào)用棧序列號碼對應(yīng)的調(diào)用棧幀信息;從所述已加載類集合中查詢與所述標識號碼對應(yīng)的類名稱;根據(jù)所述標識號碼、所述調(diào)用棧幀信息、所述類名稱、所述位置信息,創(chuàng)建類對象classobj對象,并根據(jù)所述超類號碼和所述類加載器號碼對所述classobj對象進行配置。

在具體的應(yīng)用場景中,所述創(chuàng)建模塊322,具體還可以用于若讀取到的tag值為第五預(yù)定值,則繼續(xù)讀取當(dāng)前讀取位之后預(yù)置個數(shù)的字節(jié),分別作為標識號碼、堆棧號碼、類號碼、剩余量、位置信息;從所述調(diào)用棧幀集合中查詢與所述堆棧號碼對應(yīng)的調(diào)用棧幀信息;根據(jù)所述標識號碼、所述調(diào)用棧幀信息、所述位置信息,創(chuàng)建類實例classinstance對象,并根據(jù)所述類號碼對所述classinstance對象進行配置。

在具體的應(yīng)用場景中,所述創(chuàng)建模塊322,具體還可以用于若讀取到的tag值為第六預(yù)定值,則繼續(xù)讀取當(dāng)前讀取位之后預(yù)置個數(shù)的字節(jié),分別作為標識號碼、堆棧號碼、元素數(shù)、類號碼、位置信息;從所述調(diào)用棧幀集合中查詢與所述堆棧號碼對應(yīng)的調(diào)用棧幀信息;根據(jù)所述標識號碼、所述調(diào)用棧幀信息、所述位置信息、所述元素數(shù),創(chuàng)建數(shù)組實例arrayinstance對象,并根據(jù)所述類號碼對所述arrayinstance對象進行配置。

在具體的應(yīng)用場景中,所述創(chuàng)建模塊322,具體還可以用于若讀取到的tag值為第七預(yù)定值,則繼續(xù)讀取當(dāng)前讀取位之后特定個數(shù)的字節(jié),分別作為標識號碼、堆棧號碼、元素數(shù)、類號碼、類型、位置信息;從所述調(diào)用棧幀集合中查詢與所述堆棧號碼對應(yīng)的調(diào)用棧幀信息;根據(jù)所述標識號碼、所述調(diào)用棧幀信息、所述位置信息、所述元素數(shù),創(chuàng)建數(shù)組實例arrayinstance對象,并根據(jù)所述類號碼對所述arrayinstance對象進行配置。

在具體的應(yīng)用場景中,所述創(chuàng)建模塊322,具體還可以用于若讀取到的tag值為第八預(yù)定值,則繼續(xù)讀取當(dāng)前讀取位之后預(yù)設(shè)個數(shù)的字節(jié),分別作為標識號碼、線程序列號碼、堆棧深度;從預(yù)置線程對象集合中查詢與所述線程序列號碼對應(yīng)的線程對象;根據(jù)所述線程對象的調(diào)用棧序列號碼和所述堆棧深度,從所述調(diào)用棧幀集合中查詢相應(yīng)的調(diào)用棧幀信息;根據(jù)所述標識號碼、所述線程序列號碼、所述調(diào)用棧幀信息,創(chuàng)建根對象rootobj對象。

在具體的應(yīng)用場景中,所述創(chuàng)建模塊322,具體還可以用于確定當(dāng)前讀取位的下一個整型值和下一個字節(jié)的長度,并將所述整型值確定為標識號碼;繼續(xù)讀取以所述長度為個數(shù)的字節(jié);根據(jù)以所述長度為個數(shù)的字節(jié)的內(nèi)容和所述標識號碼,創(chuàng)建字符串集合。

在具體的應(yīng)用場景中,所述創(chuàng)建模塊322,具體還可以用于確定當(dāng)前讀取位的下一個整型值,作為標識號碼;根據(jù)所述標識號碼從所述字符串集合中查詢對應(yīng)的字符串值;將所述字符串值確定為類的類名;根據(jù)所述類名和所述標識號碼創(chuàng)建已加載類集合。

在具體的應(yīng)用場景中,所述創(chuàng)建模塊322,具體還可以用于確定當(dāng)前讀取位的下一個整型值,作為標識號碼;繼續(xù)讀取所述下一個整型值之后預(yù)置個數(shù)的整型值,分別作為方法名標識、方法簽名標識、源文件標識、序列號標識、行號標識;根據(jù)所述方法名標識、所述方法簽名標識、所述源文件標識、所述序列號標識、所述行號標識,在所述字符串集合中進行查詢;根據(jù)查詢結(jié)果創(chuàng)建函數(shù)調(diào)用棧信息;依據(jù)所述函數(shù)調(diào)用棧信息和所述標識號碼,創(chuàng)建調(diào)用棧對象集合。

在具體的應(yīng)用場景中,所述創(chuàng)建模塊322,具體還可以用于繼續(xù)讀取當(dāng)前讀取位之后預(yù)設(shè)個數(shù)的字節(jié),分別作為序列號碼、線程序列號碼、函數(shù)調(diào)用棧數(shù);再繼續(xù)讀取以所述函數(shù)調(diào)用棧數(shù)為個數(shù)的字節(jié),作為函數(shù)調(diào)用棧信息的標識;從所述調(diào)用棧對象集合中獲取與所述函數(shù)調(diào)用棧信息的標識對應(yīng)的函數(shù)調(diào)用棧信息,并組成調(diào)用棧集合;根據(jù)所述調(diào)用棧集合、所述序列號碼、所述線程序列號碼,創(chuàng)建調(diào)用棧幀集合。

需要說明的是,本發(fā)明實施例提供的一種內(nèi)存占用分析裝置所涉及各功能單元的其他相應(yīng)描述,可以參考圖1和圖2中的對應(yīng)描述,在此不再贅述。

基于上述如圖1所示方法,相應(yīng)的,本發(fā)明實施例還提供了一種計算機可讀存儲介質(zhì),其上存儲有計算機程序,該程序被處理器執(zhí)行時實現(xiàn)以下步驟:獲取軟件測試對應(yīng)的內(nèi)存對象轉(zhuǎn)儲文件;對所述內(nèi)存對象轉(zhuǎn)儲文件進行解析,得到不同類的對象;對所述對象進行內(nèi)存占用監(jiān)控,得到所述對象對應(yīng)的內(nèi)存占用信息。

基于上述如圖1所示方法和如圖4和圖5所示裝置的實施例,本發(fā)明實施例還提供了一種內(nèi)存占用分析的實體裝置,如圖6所示,該裝置包括:處理器41、存儲器42、及存儲在存儲器42上并可在處理器上運行的計算機程序,所述處理器41執(zhí)行所述程序時實現(xiàn)以下步驟:獲取軟件測試對應(yīng)的內(nèi)存對象轉(zhuǎn)儲文件;對所述內(nèi)存對象轉(zhuǎn)儲文件進行解析,得到不同類的對象;對所述對象進行內(nèi)存占用監(jiān)控,得到所述對象對應(yīng)的內(nèi)存占用信息;該裝置還包括:總線43,被配置為耦接處理器41及存儲器42。

通過應(yīng)用本發(fā)明的技術(shù)方案,可以細粒度的分析某一對象的內(nèi)存占用情況,進而可以提高應(yīng)用軟件的內(nèi)存占用分析的精度。

a1、一種內(nèi)存占用分析方法,包括:

獲取軟件測試對應(yīng)的內(nèi)存對象轉(zhuǎn)儲文件;

對所述內(nèi)存對象轉(zhuǎn)儲文件進行解析,得到不同類的對象;

對所述對象進行內(nèi)存占用監(jiān)控,得到所述對象對應(yīng)的內(nèi)存占用信息。

a2、如a1所述的方法,所述對所述內(nèi)存對象轉(zhuǎn)儲文件進行解析,得到不同類的對象,具體包括:

根據(jù)所述內(nèi)存對象轉(zhuǎn)儲文件中記錄的不同標簽tag值,分別創(chuàng)建各自對應(yīng)類的對象。

a3、如a2所述的方法,所述根據(jù)所述內(nèi)存對象轉(zhuǎn)儲文件中記錄的不同標簽tag值,分別創(chuàng)建各自對應(yīng)類的對象,具體包括:

對所述內(nèi)存對象轉(zhuǎn)儲文件進行解析,若解析到tag值為預(yù)定字符串信息的值,則根據(jù)當(dāng)前讀取位的下一個整型值和下一個字節(jié)的長度,創(chuàng)建字符串集合;

若解析到tag值為預(yù)定已加載類信息的值,則根據(jù)當(dāng)前讀取位的下一個整型值和所述字符串集合,創(chuàng)建已加載類集合;

若解析到tag值為預(yù)定函數(shù)調(diào)用棧信息的值,則根據(jù)當(dāng)前讀取位之后預(yù)置個數(shù)的整型值和所述字符串集合,創(chuàng)建調(diào)用棧對象集合;

若解析到tag值為預(yù)定棧幀信息的值,則根據(jù)當(dāng)前讀取位之后預(yù)設(shè)個數(shù)的字節(jié)和所述調(diào)用棧對象集合,創(chuàng)建調(diào)用棧幀集合;

若解析到tag值為預(yù)定堆轉(zhuǎn)儲信息的值,則以當(dāng)前讀取位的下一個字節(jié)的長度為個數(shù)繼續(xù)進行讀取tag值,并根據(jù)讀取到的tag值,創(chuàng)建對應(yīng)類的對象。

a4、如a3所述的方法,若讀取到的tag值為第一預(yù)定值,則所述根據(jù)讀取到的tag值,創(chuàng)建對應(yīng)類的對象,具體包括:

創(chuàng)建相應(yīng)的根root對象。

a5、如a3所述的方法,若讀取到的tag值為第二預(yù)定值,則所述根據(jù)讀取到的tag值,創(chuàng)建對應(yīng)類的對象,具體包括:

繼續(xù)讀取當(dāng)前讀取位之后預(yù)設(shè)個數(shù)的字節(jié),分別作為標識號碼、線程序列號碼、堆棧幀號碼;

從預(yù)置線程對象集合中查詢與所述線程序列號碼對應(yīng)的線程對象;

從所述調(diào)用棧幀集合中查詢與所述線程對象的調(diào)用棧序列號碼對應(yīng)的調(diào)用棧幀信息;

根據(jù)所述調(diào)用棧幀信息、所述標識號碼、所述線程序列號碼,創(chuàng)建相應(yīng)的原始態(tài)native對象、或java對象、或原始態(tài)棧nativestack對象、或線程塊threadblock對象。

a6、如a3所述的方法,若讀取到的tag值為第三預(yù)定值,則所述根據(jù)讀取到的tag值,創(chuàng)建對應(yīng)類的對象,具體包括:

繼續(xù)讀取當(dāng)前讀取位之后預(yù)設(shè)個數(shù)的字節(jié),分別作為標識號碼、線程序列號碼、堆棧序列號碼;

根據(jù)所述標識號碼和所述堆棧序列號碼創(chuàng)建線程對象threadobject對象。

a7、如a3所述的方法,若讀取到的tag值為第四預(yù)定值,則所述根據(jù)讀取到的tag值,創(chuàng)建對應(yīng)類的對象,具體包括:

繼續(xù)讀取當(dāng)前讀取位之后預(yù)定個數(shù)的字節(jié),分別作為標識號碼、線程序列號碼、超類號碼、類加載器號碼、對象實例尺寸、數(shù)目項、位置信息;

從預(yù)置線程對象集合中查詢與所述線程序列號碼對應(yīng)的線程對象;

從所述調(diào)用棧幀集合中查詢與所述線程對象的調(diào)用棧序列號碼對應(yīng)的調(diào)用棧幀信息;

從所述已加載類集合中查詢與所述標識號碼對應(yīng)的類名稱;

根據(jù)所述標識號碼、所述調(diào)用棧幀信息、所述類名稱、所述位置信息,創(chuàng)建類對象classobj對象,并根據(jù)所述超類號碼和所述類加載器號碼對所述classobj對象進行配置。

a8、如a3所述的方法,若讀取到的tag值為第五預(yù)定值,則所述根據(jù)讀取到的tag值,創(chuàng)建對應(yīng)類的對象,具體包括:

繼續(xù)讀取當(dāng)前讀取位之后預(yù)置個數(shù)的字節(jié),分別作為標識號碼、堆棧號碼、類號碼、剩余量、位置信息;

從所述調(diào)用棧幀集合中查詢與所述堆棧號碼對應(yīng)的調(diào)用棧幀信息;

根據(jù)所述標識號碼、所述調(diào)用棧幀信息、所述位置信息,創(chuàng)建類實例classinstance對象,并根據(jù)所述類號碼對所述classinstance對象進行配置。

a9、如a3所述的方法,若讀取到的tag值為第六預(yù)定值,則所述根據(jù)讀取到的tag值,創(chuàng)建對應(yīng)類的對象,具體包括:

繼續(xù)讀取當(dāng)前讀取位之后預(yù)置個數(shù)的字節(jié),分別作為標識號碼、堆棧號碼、元素數(shù)、類號碼、位置信息;

從所述調(diào)用棧幀集合中查詢與所述堆棧號碼對應(yīng)的調(diào)用棧幀信息;

根據(jù)所述標識號碼、所述調(diào)用棧幀信息、所述位置信息、所述元素數(shù),創(chuàng)建數(shù)組實例arrayinstance對象,并根據(jù)所述類號碼對所述arrayinstance對象進行配置。

a10、如a3所述的方法,若讀取到的tag值為第七預(yù)定值,則所述根據(jù)讀取到的tag值,創(chuàng)建對應(yīng)類的對象,具體包括:

繼續(xù)讀取當(dāng)前讀取位之后特定個數(shù)的字節(jié),分別作為標識號碼、堆棧號碼、元素數(shù)、類號碼、類型、位置信息;

從所述調(diào)用棧幀集合中查詢與所述堆棧號碼對應(yīng)的調(diào)用棧幀信息;

根據(jù)所述標識號碼、所述調(diào)用棧幀信息、所述位置信息、所述元素數(shù),創(chuàng)建數(shù)組實例arrayinstance對象,并根據(jù)所述類號碼對所述arrayinstance對象進行配置。

a11、如a3所述的方法,若讀取到的tag值為第八預(yù)定值,則所述根據(jù)讀取到的tag值,創(chuàng)建對應(yīng)類的對象,具體包括:

繼續(xù)讀取當(dāng)前讀取位之后預(yù)設(shè)個數(shù)的字節(jié),分別作為標識號碼、線程序列號碼、堆棧深度;

從預(yù)置線程對象集合中查詢與所述線程序列號碼對應(yīng)的線程對象;

根據(jù)所述線程對象的調(diào)用棧序列號碼和所述堆棧深度,從所述調(diào)用棧幀集合中查詢相應(yīng)的調(diào)用棧幀信息;

根據(jù)所述標識號碼、所述線程序列號碼、所述調(diào)用棧幀信息,創(chuàng)建根對象rootobj對象。

a12、如a3所述的方法,所述根據(jù)當(dāng)前讀取位的下一個整型值和下一個字節(jié)的長度,創(chuàng)建字符串集合,具體包括:

確定當(dāng)前讀取位的下一個整型值和下一個字節(jié)的長度,并將所述整型值確定為標識號碼;

繼續(xù)讀取以所述長度為個數(shù)的字節(jié);

根據(jù)以所述長度為個數(shù)的字節(jié)的內(nèi)容和所述標識號碼,創(chuàng)建字符串集合。

13、如12所述的方法,所述根據(jù)當(dāng)前讀取位之后預(yù)置個數(shù)的整型值和所述字符串集合,創(chuàng)建調(diào)用棧對象集合,具體包括:

確定當(dāng)前讀取位的下一個整型值,作為標識號碼;

根據(jù)所述標識號碼從所述字符串集合中查詢對應(yīng)的字符串值;

將所述字符串值確定為類的類名;

根據(jù)所述類名和所述標識號碼創(chuàng)建已加載類集合。

14、如12所述的方法,所述根據(jù)當(dāng)前讀取位之后預(yù)置個數(shù)的整型值和所述字符串集合,創(chuàng)建調(diào)用棧對象集合,具體包括:

確定當(dāng)前讀取位的下一個整型值,作為標識號碼;

繼續(xù)讀取所述下一個整型值之后預(yù)置個數(shù)的整型值,分別作為方法名標識、方法簽名標識、源文件標識、序列號標識、行號標識;

根據(jù)所述方法名標識、所述方法簽名標識、所述源文件標識、所述序列號標識、所述行號標識,在所述字符串集合中進行查詢;

根據(jù)查詢結(jié)果創(chuàng)建函數(shù)調(diào)用棧信息;

依據(jù)所述函數(shù)調(diào)用棧信息和所述標識號碼,創(chuàng)建調(diào)用棧對象集合。

15、如14所述的方法,所述根據(jù)當(dāng)前讀取位之后預(yù)設(shè)個數(shù)的字節(jié)和所述調(diào)用棧對象集合,創(chuàng)建調(diào)用棧幀集合,具體包括:

繼續(xù)讀取當(dāng)前讀取位之后預(yù)設(shè)個數(shù)的字節(jié),分別作為序列號碼、線程序列號碼、函數(shù)調(diào)用棧數(shù);

再繼續(xù)讀取以所述函數(shù)調(diào)用棧數(shù)為個數(shù)的字節(jié),作為函數(shù)調(diào)用棧信息的標識;

從所述調(diào)用棧對象集合中獲取與所述函數(shù)調(diào)用棧信息的標識對應(yīng)的函數(shù)調(diào)用棧信息,并組成調(diào)用棧集合;

根據(jù)所述調(diào)用棧集合、所述序列號碼、所述線程序列號碼,創(chuàng)建調(diào)用棧幀集合。

b16、一種內(nèi)存占用分析裝置,包括:

獲取單元,用于獲取軟件測試對應(yīng)的內(nèi)存對象轉(zhuǎn)儲文件;

解析單元,用于對所述獲取單元獲取的內(nèi)存對象轉(zhuǎn)儲文件進行解析,得到不同類的對象;

監(jiān)控單元,用于對所述解析單元解析到的對象進行內(nèi)存占用監(jiān)控,得到所述對象對應(yīng)的內(nèi)存占用信息。

b17、如b16所述的裝置,

所述解析單元,具體用于根據(jù)所述內(nèi)存對象轉(zhuǎn)儲文件中記錄的不同標簽tag值,分別創(chuàng)建各自對應(yīng)類的對象。

b18、如b17所述的裝置,所述解析單元具體包括:

解析模塊,用于對所述內(nèi)存對象轉(zhuǎn)儲文件進行解析;

創(chuàng)建模塊,用于若所述解析模塊解析到tag值為預(yù)定字符串信息的值,則根據(jù)當(dāng)前讀取位的下一個整型值和下一個字節(jié)的長度,創(chuàng)建字符串集合;

若解析到tag值為預(yù)定已加載類信息的值,則根據(jù)當(dāng)前讀取位的下一個整型值和所述字符串集合,創(chuàng)建已加載類集合;

若解析到tag值為預(yù)定函數(shù)調(diào)用棧信息的值,則根據(jù)當(dāng)前讀取位之后預(yù)置個數(shù)的整型值和所述字符串集合,創(chuàng)建調(diào)用棧對象集合;

若解析到tag值為預(yù)定棧幀信息的值,則根據(jù)當(dāng)前讀取位之后預(yù)設(shè)個數(shù)的字節(jié)和所述調(diào)用棧對象集合,創(chuàng)建調(diào)用棧幀集合;

若解析到tag值為預(yù)定堆轉(zhuǎn)儲信息的值,則以當(dāng)前讀取位的下一個字節(jié)的長度為個數(shù)繼續(xù)進行讀取tag值,并根據(jù)讀取到的tag值,創(chuàng)建對應(yīng)類的對象。

b19、如b18所述的裝置,

所述創(chuàng)建模塊,具體用于若讀取到的tag值為第一預(yù)定值,則創(chuàng)建相應(yīng)的根root對象。

b20、如b18所述的裝置,

所述創(chuàng)建模塊,具體用于若讀取到的tag值為第二預(yù)定值,則繼續(xù)讀取當(dāng)前讀取位之后預(yù)設(shè)個數(shù)的字節(jié),分別作為標識號碼、線程序列號碼、堆棧幀號碼;

從預(yù)置線程對象集合中查詢與所述線程序列號碼對應(yīng)的線程對象;

從所述調(diào)用棧幀集合中查詢與所述線程對象的調(diào)用棧序列號碼對應(yīng)的調(diào)用棧幀信息;

根據(jù)所述調(diào)用棧幀信息、所述標識號碼、所述線程序列號碼,創(chuàng)建相應(yīng)的原始態(tài)native對象、或java對象、或原始態(tài)棧nativestack對象、或線程塊threadblock對象。

b21、如b18所述的裝置,

所述創(chuàng)建模塊,具體用于若讀取到的tag值為第三預(yù)定值,則繼續(xù)讀取當(dāng)前讀取位之后預(yù)設(shè)個數(shù)的字節(jié),分別作為標識號碼、線程序列號碼、堆棧序列號碼;

根據(jù)所述標識號碼和所述堆棧序列號碼創(chuàng)建線程對象threadobject對象。

b22、如b18所述的裝置,

所述創(chuàng)建模塊,具體用于若讀取到的tag值為第四預(yù)定值,則繼續(xù)讀取當(dāng)前讀取位之后預(yù)定個數(shù)的字節(jié),分別作為標識號碼、線程序列號碼、超類號碼、類加載器號碼、對象實例尺寸、數(shù)目項、位置信息;

從預(yù)置線程對象集合中查詢與所述線程序列號碼對應(yīng)的線程對象;

從所述調(diào)用棧幀集合中查詢與所述線程對象的調(diào)用棧序列號碼對應(yīng)的調(diào)用棧幀信息;

從所述已加載類集合中查詢與所述標識號碼對應(yīng)的類名稱;

根據(jù)所述標識號碼、所述調(diào)用棧幀信息、所述類名稱、所述位置信息,創(chuàng)建類對象classobj對象,并根據(jù)所述超類號碼和所述類加載器號碼對所述classobj對象進行配置。

b23、如b18所述的裝置,

所述創(chuàng)建模塊,具體用于若讀取到的tag值為第五預(yù)定值,則繼續(xù)讀取當(dāng)前讀取位之后預(yù)置個數(shù)的字節(jié),分別作為標識號碼、堆棧號碼、類號碼、剩余量、位置信息;

從所述調(diào)用棧幀集合中查詢與所述堆棧號碼對應(yīng)的調(diào)用棧幀信息;

根據(jù)所述標識號碼、所述調(diào)用棧幀信息、所述位置信息,創(chuàng)建類實例classinstance對象,并根據(jù)所述類號碼對所述classinstance對象進行配置。

b24、如b18所述的裝置,

所述創(chuàng)建模塊,具體用于若讀取到的tag值為第六預(yù)定值,則繼續(xù)讀取當(dāng)前讀取位之后預(yù)置個數(shù)的字節(jié),分別作為標識號碼、堆棧號碼、元素數(shù)、類號碼、位置信息;

從所述調(diào)用棧幀集合中查詢與所述堆棧號碼對應(yīng)的調(diào)用棧幀信息;

根據(jù)所述標識號碼、所述調(diào)用棧幀信息、所述位置信息、所述元素數(shù),創(chuàng)建數(shù)組實例arrayinstance對象,并根據(jù)所述類號碼對所述arrayinstance對象進行配置。

b25、如b18所述的裝置,

所述創(chuàng)建模塊,具體用于若讀取到的tag值為第七預(yù)定值,則繼續(xù)讀取當(dāng)前讀取位之后特定個數(shù)的字節(jié),分別作為標識號碼、堆棧號碼、元素數(shù)、類號碼、類型、位置信息;

從所述調(diào)用棧幀集合中查詢與所述堆棧號碼對應(yīng)的調(diào)用棧幀信息;

根據(jù)所述標識號碼、所述調(diào)用棧幀信息、所述位置信息、所述元素數(shù),創(chuàng)建數(shù)組實例arrayinstance對象,并根據(jù)所述類號碼對所述arrayinstance對象進行配置。

b26、如b18所述的裝置,

所述創(chuàng)建模塊,具體用于若讀取到的tag值為第八預(yù)定值,則繼續(xù)讀取當(dāng)前讀取位之后預(yù)設(shè)個數(shù)的字節(jié),分別作為標識號碼、線程序列號碼、堆棧深度;

從預(yù)置線程對象集合中查詢與所述線程序列號碼對應(yīng)的線程對象;

根據(jù)所述線程對象的調(diào)用棧序列號碼和所述堆棧深度,從所述調(diào)用棧幀集合中查詢相應(yīng)的調(diào)用棧幀信息;

根據(jù)所述標識號碼、所述線程序列號碼、所述調(diào)用棧幀信息,創(chuàng)建根對象rootobj對象。

b27、如b18所述的裝置,

所述創(chuàng)建模塊,具體用于確定當(dāng)前讀取位的下一個整型值和下一個字節(jié)的長度,并將所述整型值確定為標識號碼;

繼續(xù)讀取以所述長度為個數(shù)的字節(jié);

根據(jù)以所述長度為個數(shù)的字節(jié)的內(nèi)容和所述標識號碼,創(chuàng)建字符串集合。

b28、如b27所述的裝置,

所述創(chuàng)建模塊,具體還用于確定當(dāng)前讀取位的下一個整型值,作為標識號碼;

根據(jù)所述標識號碼從所述字符串集合中查詢對應(yīng)的字符串值;

將所述字符串值確定為類的類名;

根據(jù)所述類名和所述標識號碼創(chuàng)建已加載類集合。

b29、如b27所述的裝置,

所述創(chuàng)建模塊,具體還用于確定當(dāng)前讀取位的下一個整型值,作為標識號碼;

繼續(xù)讀取所述下一個整型值之后預(yù)置個數(shù)的整型值,分別作為方法名標識、方法簽名標識、源文件標識、序列號標識、行號標識;

根據(jù)所述方法名標識、所述方法簽名標識、所述源文件標識、所述序列號標識、所述行號標識,在所述字符串集合中進行查詢;

根據(jù)查詢結(jié)果創(chuàng)建函數(shù)調(diào)用棧信息;

依據(jù)所述函數(shù)調(diào)用棧信息和所述標識號碼,創(chuàng)建調(diào)用棧對象集合。

b30、如b29所述的裝置,

所述創(chuàng)建模塊,具體還用于繼續(xù)讀取當(dāng)前讀取位之后預(yù)設(shè)個數(shù)的字節(jié),分別作為序列號碼、線程序列號碼、函數(shù)調(diào)用棧數(shù);

再繼續(xù)讀取以所述函數(shù)調(diào)用棧數(shù)為個數(shù)的字節(jié),作為函數(shù)調(diào)用棧信息的標識;

從所述調(diào)用棧對象集合中獲取與所述函數(shù)調(diào)用棧信息的標識對應(yīng)的函數(shù)調(diào)用棧信息,并組成調(diào)用棧集合;

根據(jù)所述調(diào)用棧集合、所述序列號碼、所述線程序列號碼,創(chuàng)建調(diào)用棧幀集合。

c31、一種計算機可讀存儲介質(zhì),其上存儲有計算機程序,該程序被處理器執(zhí)行時實現(xiàn)以下步驟:

獲取軟件測試對應(yīng)的內(nèi)存對象轉(zhuǎn)儲文件;

對所述內(nèi)存對象轉(zhuǎn)儲文件進行解析,得到不同類的對象;

對所述對象進行內(nèi)存占用監(jiān)控,得到所述對象對應(yīng)的內(nèi)存占用信息。

d32、一種內(nèi)存占用分析裝置,包括存儲器、處理器及存儲在存儲器上并可在處理器上運行的計算機程序,所述處理器執(zhí)行所述程序時實現(xiàn)以下步驟:

獲取軟件測試對應(yīng)的內(nèi)存對象轉(zhuǎn)儲文件;

對所述內(nèi)存對象轉(zhuǎn)儲文件進行解析,得到不同類的對象;

對所述對象進行內(nèi)存占用監(jiān)控,得到所述對象對應(yīng)的內(nèi)存占用信息。

在上述實施例中,對各個實施例的描述都各有側(cè)重,某個實施例中沒有詳述的部分,可以參見其他實施例的相關(guān)描述。

可以理解的是,上述方法及裝置中的相關(guān)特征可以相互參考。另外,上述實施例中的“第一”、“第二”等是用于區(qū)分各實施例,而并不代表各實施例的優(yōu)劣。

所屬領(lǐng)域的技術(shù)人員可以清楚地了解到,為描述的方便和簡潔,上述描述的系統(tǒng),裝置和單元的具體工作過程,可以參考前述方法實施例中的對應(yīng)過程,在此不再贅述。

在此提供的算法和顯示不與任何特定計算機、虛擬系統(tǒng)或者其它設(shè)備固有相關(guān)。各種通用系統(tǒng)也可以與基于在此的示教一起使用。根據(jù)上面的描述,構(gòu)造這類系統(tǒng)所要求的結(jié)構(gòu)是顯而易見的。此外,本發(fā)明也不針對任何特定編程語言。應(yīng)當(dāng)明白,可以利用各種編程語言實現(xiàn)在此描述的本發(fā)明的內(nèi)容,并且上面對特定語言所做的描述是為了披露本發(fā)明的最佳實施方式。

在此處所提供的說明書中,說明了大量具體細節(jié)。然而,能夠理解,本發(fā)明的實施例可以在沒有這些具體細節(jié)的情況下實踐。在一些實例中,并未詳細示出公知的方法、結(jié)構(gòu)和技術(shù),以便不模糊對本說明書的理解。

類似地,應(yīng)當(dāng)理解,為了精簡本公開并幫助理解各個發(fā)明方面中的一個或多個,在上面對本發(fā)明的示例性實施例的描述中,本發(fā)明的各個特征有時被一起分組到單個實施例、圖、或者對其的描述中。然而,并不應(yīng)將該公開的方法解釋成反映如下意圖:即所要求保護的本發(fā)明要求比在每個權(quán)利要求中所明確記載的特征更多的特征。更確切地說,如下面的權(quán)利要求書所反映的那樣,發(fā)明方面在于少于前面公開的單個實施例的所有特征。因此,遵循具體實施方式的權(quán)利要求書由此明確地并入該具體實施方式,其中每個權(quán)利要求本身都作為本發(fā)明的單獨實施例。

本領(lǐng)域那些技術(shù)人員可以理解,可以對實施例中的設(shè)備中的模塊進行自適應(yīng)性地改變并且把它們設(shè)置在與該實施例不同的一個或多個設(shè)備中??梢园褜嵤├械哪K或單元或組件組合成一個模塊或單元或組件,以及此外可以把它們分成多個子模塊或子單元或子組件。除了這樣的特征和/或過程或者單元中的至少一些是相互排斥之外,可以采用任何組合對本說明書(包括伴隨的權(quán)利要求、摘要和附圖)中公開的所有特征以及如此公開的任何方法或者設(shè)備的所有過程或單元進行組合。除非另外明確陳述,本說明書(包括伴隨的權(quán)利要求、摘要和附圖)中公開的每個特征可以由提供相同、等同或相似目的的替代特征來代替。

此外,本領(lǐng)域的技術(shù)人員能夠理解,盡管在此所述的一些實施例包括其它實施例中所包括的某些特征而不是其它特征,但是不同實施例的特征的組合意味著處于本發(fā)明的范圍之內(nèi)并且形成不同的實施例。例如,在下面的權(quán)利要求書中,所要求保護的實施例的任意之一都可以以任意的組合方式來使用。

本發(fā)明的各個部件實施例可以以硬件實現(xiàn),或者以在一個或者多個處理器上運行的軟件模塊實現(xiàn),或者以它們的組合實現(xiàn)。本領(lǐng)域的技術(shù)人員應(yīng)當(dāng)理解,可以在實踐中使用微處理器或者數(shù)字信號處理器(dsp)來實現(xiàn)根據(jù)本發(fā)明實施例的一種內(nèi)存占用分析方法、裝置及系統(tǒng)中的一些或者全部部件的一些或者全部功能。本發(fā)明還可以實現(xiàn)為用于執(zhí)行這里所描述的方法的一部分或者全部的設(shè)備或者裝置程序(例如,計算機程序和計算機程序產(chǎn)品)。這樣的實現(xiàn)本發(fā)明的程序可以存儲在計算機可讀介質(zhì)上,或者可以具有一個或者多個信號的形式。這樣的信號可以從因特網(wǎng)網(wǎng)站上下載得到,或者在載體信號上提供,或者以任何其他形式提供。

應(yīng)該注意的是上述實施例對本發(fā)明進行說明而不是對本發(fā)明進行限制,并且本領(lǐng)域技術(shù)人員在不脫離所附權(quán)利要求的范圍的情況下可設(shè)計出替換實施例。在權(quán)利要求中,不應(yīng)將位于括號之間的任何參考符號構(gòu)造成對權(quán)利要求的限制。單詞“包含”不排除存在未列在權(quán)利要求中的元件或步驟。位于元件之前的單詞“一”或“一個”不排除存在多個這樣的元件。本發(fā)明可以借助于包括有若干不同元件的硬件以及借助于適當(dāng)編程的計算機來實現(xiàn)。在列舉了若干裝置的單元權(quán)利要求中,這些裝置中的若干個可以是通過同一個硬件項來具體體現(xiàn)。單詞第一、第二、以及第三等的使用不表示任何順序。可將這些單詞解釋為名稱。

當(dāng)前第1頁1 2 
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1