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

確定存儲器外部碎片的原因的制作方法

文檔序號:11530695閱讀:426來源:國知局
確定存儲器外部碎片的原因的制造方法與工藝

本發(fā)明涉及存儲器管理,以及更具體地涉及確定存儲器外部碎片的原因。



背景技術:

存儲器區(qū)域的碎片(諸如,堆)會導致計算機系統(tǒng)中的許多性能問題(諸如,長執(zhí)行時間和較大存儲器需求)。消除、避免或診斷碎片可以對計算機系統(tǒng)的操作有顯著益處。

外部碎片是當可用于分配的存儲器空閑塊(“孔”)小到不能滿足分配存儲器的新請求時,目的通常是要創(chuàng)建新“對象”。在本專利申請的上下文中,“對象”是具有數(shù)據(jù)和與該數(shù)據(jù)相關聯(lián)的唯一標識符兩者的實體;該標識符可以是該數(shù)據(jù)在存儲器中的位置。對象是動態(tài)分配的,即,可以由應用經(jīng)由“分配器”分配和釋放表示其數(shù)據(jù)的存儲器區(qū)域。在本專利申請的上下文中,當對象的數(shù)據(jù)沒有被應用釋放時,對象是“活的”。對象可以被應用“銷毀”;即,應用經(jīng)由將存儲器釋放回到空閑列表的分配器對對象的數(shù)據(jù)解除分配,以及對象“死亡”。通常,分配器需要遍歷孔列表(稱為空閑列表),直到分配器可以在存儲器中找到足夠大以滿足分配請求的孔為止。遍歷空閑列表耗費執(zhí)行時間以及小到不能被分配的孔浪費存儲器。通常當存在相同存儲器區(qū)域內(nèi)分配的不同壽命的對象時產(chǎn)生外部碎片。當短壽命的對象死亡時,在存活的壽命較長的對象之間剩下的孔通常比要創(chuàng)建的新對象小。孔共同地為外部碎片。空閑列表中的孔越小以及越廣泛,存儲器就變得越支離破碎。

先前的公開可以通過分析空閑列表以及辨識空閑列表是否包括許多小孔來確定何時出現(xiàn)外部碎片,但是先前的公開不能確定什么正在導致那些孔,那些孔是在哪兒創(chuàng)建的,以及因此先前的公開不能提供任何有關計算機可讀程序指令需要改變什么以減少、避免或消除碎片的建議。將會期望改進碎片(尤其是外部碎片)的診斷和避免將。

因此,現(xiàn)有技術中存在對解決前述問題的需求。



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

從另外的方面來看,本發(fā)明提供用于確定存儲器中的外部碎片的原因的方法,其中存儲器的區(qū)域被應用釋放、被分配器解除分配以及沒有被重新分配給任何應用,該方法包括:收集與由應用進行的存儲器的區(qū)域的釋放相關聯(lián)的信息;將信息存儲在存儲器的區(qū)域中;以及分析信息以確定存儲器的區(qū)域為何沒有被重新分配給任何應用。

從另外的方面來看,本發(fā)明提供用于確定存儲器中的外部碎片的原因的系統(tǒng),其中存儲器的區(qū)域被應用釋放、被分配器解除分配以及沒有被重新分配給任何應用,該系統(tǒng)包括:分配器,用于收集與由應用進行的存儲器的區(qū)域的釋放相關聯(lián)的信息以及將信息存儲在存儲器的區(qū)域中;以及分析器,用于分析信息以確定存儲器的區(qū)域為何沒有被重新分配給任何應用。

從另外的方面來看,本發(fā)明提供了用于確定存儲器中的外部碎片的原因的計算機程序產(chǎn)品,其中存儲器的區(qū)域被應用釋放、被分配器解除分配以及沒有被重新分配給任何應用,該計算機程序產(chǎn)品包括計算機可讀存儲介質(zhì),該計算機可讀存儲介質(zhì)能被處理電路讀取以及存儲用于由處理電路運行以執(zhí)行用于執(zhí)行本發(fā)明的步驟的方法的指令。

從另外的方面來看,本發(fā)明提供了存儲在計算機可讀介質(zhì)上以及能加載到數(shù)字計算機的內(nèi)部存儲器中的計算機程序,所述計算機程序包括軟件代碼部分,當在計算機上運行所述程序時,用于執(zhí)行本發(fā)明的步驟。

本發(fā)明的實施例提供了用于確定存儲器中的外部碎片的原因的方法,其中存儲器的區(qū)域被應用釋放、被分配器解除分配以及沒有被重新分配給任何應用。該方法包括收集與由應用進行的存儲器的區(qū)域的釋放相關聯(lián)的信息。該方法還包括將信息存儲在存儲器的區(qū)域中。該方法還包括分析信息以確定存儲器的區(qū)域為何沒有被重新分配給任何應用。

本發(fā)明的實施例還提供了用于確定存儲器中的外部碎片的原因的方法,其中存儲器的區(qū)域的第一部分被分配器分配給應用以及存儲器的區(qū)域的第二部分被分配器釋放。該方法包括將指示第二部分是剩余部分的指示符存儲在存儲器的區(qū)域的第二部分中。該方法還包括收集與第二部分的釋放相關聯(lián)的信息。該方法還包括將信息存儲在第二部分中。該方法還包括分析信息以確定第二部分為何沒有被重新分配給任何應用。

本發(fā)明的實施例還提供了用于確定存儲器中的外部碎片的原因的系統(tǒng),其中存儲器的區(qū)域被應用釋放、被分配器解除分配以及沒有被重新分配給任何應用。該系統(tǒng)包括分配器。分配器收集與由應用進行的存儲器的區(qū)域的釋放相關聯(lián)的信息以及將信息存儲在存儲器的區(qū)域中。該系統(tǒng)還包括分析器,該分析器用于分析信息以確定存儲器的區(qū)域為何沒有被重新分配給任何應用。在該系統(tǒng)中,存儲器的區(qū)域被分配器解除分配以及沒有被重新分配給任何應用。

本發(fā)明的實施例還提供了用于確定存儲器中的外部碎片的原因的計算機程序產(chǎn)品,其中存儲器的區(qū)域被應用釋放、被分配器解除分配以及沒有被重新分配給任何應用。該計算機程序產(chǎn)品包括在其中實現(xiàn)了程序代碼的計算機可讀存儲介質(zhì)。程序代碼可運行以:收集與由應用進行的存儲器的區(qū)域的釋放相關聯(lián)的信息;將信息存儲在存儲器的區(qū)域中;分析所述信息以確定所述存儲器的區(qū)域為何沒有被重新分配給任何應用。

本發(fā)明的實施例還提供了用于確定存儲器中的外部碎片的原因的計算機程序產(chǎn)品,其中存儲器的區(qū)域的第一部分被分配器分配給應用以及存儲器的區(qū)域的第二部分被分配器釋放。該計算機程序產(chǎn)品包括在其中實現(xiàn)了程序代碼的計算機可讀存儲介質(zhì)。程序代碼可運行以:將指示第二部分是剩余部分的指示符存儲在存儲器的區(qū)域的第二部分中;收集與第二部分的釋放相關聯(lián)的信息;將信息存儲在第二部分中;分析信息以確定第二部分為何沒有被重新分配給任何應用。

附圖說明

現(xiàn)在將僅通過示例的方式、參考如下列圖中圖示的優(yōu)選實施例來描述本發(fā)明:

圖1示出了根據(jù)現(xiàn)有技術的具有所分配的存儲器塊和存儲器空閑孔的現(xiàn)有技術的存儲器管理系統(tǒng);

圖2示出了根據(jù)現(xiàn)有技術的圖1的存儲器的空閑孔的現(xiàn)有技術的空閑列表;

圖3示出了根據(jù)現(xiàn)有技術的圖1的存儲器的現(xiàn)有技術的空閑孔;

圖4示出了根據(jù)現(xiàn)有技術的圖1的存儲器的現(xiàn)有技術的分配塊;

圖5示出了根據(jù)本發(fā)明的優(yōu)選實施例的確定什么和/或誰正在導致外部碎片的根據(jù)本發(fā)明的方法的第一實施例的流程圖;

圖6示出了根據(jù)本發(fā)明的優(yōu)選實施例的圖3的存儲器的空閑孔以及通過圖5的實施例存儲在其中的信息;

圖7示出了根據(jù)本發(fā)明的優(yōu)選實施例的基于通過圖5的實施例收集的信息維持的一組統(tǒng)計度量;

圖8示出了根據(jù)本發(fā)明的優(yōu)選實施例的圖5的分析步驟510的流程圖;以及

圖9示出了根據(jù)本發(fā)明的優(yōu)選實施例的確定什么和/或誰正在導致外部碎片的根據(jù)本發(fā)明的方法的第二實施例的流程圖。

具體實施方式

圖1示出了可以實現(xiàn)本發(fā)明實施例的具有所分配的存儲器塊和存儲器空閑孔的現(xiàn)有技術的存儲器管理系統(tǒng)。應用130、132向分配器136提出請求以從存儲器102的區(qū)域分配存儲器的區(qū)域104、106供它們使用??梢允褂弥T如alloc或malloc的命令完成這種請求。當應用130、132請求分配器136時,分配器136分配存儲器102的區(qū)域104、106供應用130、132使用。圖1還示出了已經(jīng)分配給圖1中未示出的應用的存儲器102的其它區(qū)域108-112。每個應用130、132可以向分配器136提出多個請求以分配存儲器102的區(qū)域104-112,以及分配給應用130、132的存儲器102的區(qū)域104-112不一定是連續(xù)的。當應用130、132用完存儲器102的區(qū)域104-112時,它們使用諸如free(釋放)或dealloc的命令將存儲器102的區(qū)域104-112返回(“釋放”(release或free))到分配器136。當存儲器102的區(qū)域104-112被釋放到分配器136時,分配器136將它們添加至存儲器102的未分配區(qū)域122-128的空閑列表134。稍后將參照圖2至圖4對現(xiàn)有技術的空閑列表134進行描述。

當已經(jīng)處理了分配和釋放存儲器102的存儲器區(qū)域104-112、122-128的許多請求時,最初較長的連續(xù)空閑存儲器區(qū)域被分割成越來越小的區(qū)域122-128。外部碎片是當分配給應用130、132的存儲器102的分配區(qū)域104-112之間的空閑區(qū)域122-128小到不能滿足從存儲器102進行分配的新請求時產(chǎn)生的。外部碎片的一個度量是由于空閑列表上大量的小孔(這些孔小到不能滿足分配請求)不能用于分配的存儲器的百分比;外部碎片的另一個度量是由于遇到大量小孔導致的遍歷空閑列表的增加的成本。

0%的外部存儲器碎片意指可以分配空閑存儲器的全部,而不需要存儲器使用或計算工作量上的額外成本。90%的外部存儲器碎片(在存儲器使用度量下)意指分配器具有例如800kb大小的存儲器102的區(qū)域、但是由于孔的小尺寸使得720kb不能用于分配。

圖2示出了圖1的存儲器的空閑孔的現(xiàn)有技術的空閑列表。使用存儲器的每個空閑區(qū)域122-128中的存儲器區(qū)域作為存儲器的下一個空閑區(qū)域122-128的指針,將存儲器102的空閑區(qū)域122-128在鏈表中連接在一起。變量包括對存儲器102的第一區(qū)域122的引用。存儲器的最后區(qū)域128包括結束符值(通常是“null”),用以指示鏈表的結尾。為了釋放存儲器102的新區(qū)域128,僅僅將指向它的指針放在鏈表中的存儲器102的上一個空閑區(qū)域126中。為了分配存儲器102的區(qū)域126,僅僅將其指向存儲器102的下一個空閑區(qū)域128的指針復制到存儲器102的空閑區(qū)域124中,從而重寫指向要從空閑列表134移除并且要被分配的存儲器102的區(qū)域126的現(xiàn)有指針。

分配器136可以自己創(chuàng)建存儲器102的空閑區(qū)域122-128。這可以在應用130、132請求例如56字節(jié)大小的存儲器102的區(qū)塊、而分配器136僅可以找到64字節(jié)大小的區(qū)塊時發(fā)生。分配器136向應用130、132分配例如56字節(jié)的第一部分,以及從64字節(jié)大小的區(qū)塊的剩余第二部分創(chuàng)建8字節(jié)的空閑存儲器102區(qū)塊,其鏈接至空閑列表134。分配器將指示存儲器區(qū)域的第二部分是剩余部分的指示符存儲在被分配器釋放的存儲器區(qū)域的第二部分中。

圖3示出了圖1的存儲器的現(xiàn)有技術的空閑孔。存儲器102的示例性現(xiàn)有技術的空閑孔124包括對存儲器孔124的大小的指示304。通常,最高有效位302用來指示存儲器102的關聯(lián)區(qū)域是否是存儲器102的空閑孔124或它是否是存儲器102的分配塊106。在其它現(xiàn)有技術中,空閑/分配位302與對大小的指示304分開。在另一個實現(xiàn)中,標記圖與用于存儲器的每個區(qū)塊的位一起使用,示出存儲器的每個區(qū)塊是空閑的還是已分配的。例如,如果在指示空閑存儲器的標記圖中存在三個相鄰位,則存在三個空閑的連續(xù)存儲器區(qū)塊。在另一個實現(xiàn)中,通過上下文確定存儲器孔的大小。分配器136維持若干獨立的空閑列表134,每個空閑列表134包括單個給定大小的存儲器102的區(qū)域122-128。無論使用存儲存儲器區(qū)域的大小的這些實現(xiàn)中的哪一個,分配器都使用它來保存大小的記錄以實施常規(guī)分配。

如上面參照圖2解釋的,下一個指針306指向空閑列表134中的空閑存儲器102的下一個區(qū)域126。空閑存儲器的每個區(qū)域中的下一指針306形成空閑存儲器區(qū)域122-128的鏈表。空閑存儲器310形成存儲器102的空閑孔124的剩余部分。

圖4示出了圖1的存儲器的現(xiàn)有技術的分配塊。存儲器102的示例性現(xiàn)有技術的分配塊106包括對存儲器塊106的大小的指示404。通常,最高有效位402用來指示存儲器102的關聯(lián)區(qū)域是否是存儲器102的空閑孔124或它是否是存儲器102的分配塊106。在其它現(xiàn)有技術中,空閑/分配位402與對大小的指示404分開。由于沒有已分配存儲器的鏈表,因此已分配存儲器104-112不需要如空閑塊124中所看到的下一個指針306。已分配存儲器410形成存儲器102的分配塊106的剩余部分。

圖5示出了確定什么和/或誰正在導致外部碎片的根據(jù)本發(fā)明的方法的第一實施例的流程圖。方法在步驟502處開始。在步驟504處,應用130、132的方法(諸如,例程、函數(shù)等等(被稱為“調(diào)用器”))想要銷毀不再需要的對象。調(diào)用器調(diào)用分配器136的解除分配函數(shù),以便釋放先前分配給對象的存儲器區(qū)域。分配器136將存儲器區(qū)域插入到如上面參照圖2所述的空閑列表中。在步驟506處,收集與先前分配給對象的存儲器區(qū)域的釋放相關聯(lián)的信息。所收集的信息可以涉及銷毀一個對象的原因。在其它實施例中,所收集的信息可以涉及超過一個對象。所存儲的信息(圖6中的602-608)純粹是示例性的,以及可以包括所示信息602-608以及未示出的其它信息中的一些或全部或不包括這些信息。如果存儲器102的空閑區(qū)域122中沒有充足的可用空間,則可以不存儲信息602-608中的全部。所存儲的信息602-608涉及誰創(chuàng)建或銷毀先前擁有存儲器102的區(qū)域122的對象、或在何處創(chuàng)建或銷毀先前擁有存儲器102的區(qū)域122的對象。

參照圖6,所存儲的信息可以包括調(diào)用器的返回地址602,該調(diào)用器銷毀對象以及因此對存儲器102的區(qū)域104-112進行釋放或解除分配;返回地址602可以用來識別調(diào)用器本身。可以通過分配器136遍歷當前線程的調(diào)用棧來獲得該返回地址。常規(guī)的棧遍歷器用于正在使用的語言和平臺。對棧進行遍歷直到找到返回到調(diào)用器的返回地址為止。由于分配器136的解除分配方法的一個或多個入口點被很好地定義,因此可以確定當前線程的調(diào)用棧中的返回地址的位置。

所存儲的信息還可以包括創(chuàng)建對象和/或銷毀對象的行號604、文件名id606以及方法id608。這些中的每一個可以通過被作為解除分配(dealloc)或釋放命令的參數(shù)傳遞給分配器136而獲得。在以c++語言實現(xiàn)的實施例中,__file__、__line__和__func__(或__function__)通常分別內(nèi)置于在編譯時給出當前完整路徑和文件名、當前行號以及當前函數(shù)名的變量中。例如,常規(guī)釋放命令可以是:解除分配(pointer1);用以丟棄分配給由變量*pointer1指向的對象的存儲器。在本發(fā)明的實施例中,解除分配命令可以是:解除分配(pointer1,102,“classa::methoda”);對于行號102處的函數(shù)“classa::methoda”,丟棄分配給由變量*pointer1指向的對象的存儲器。在其它實施例中,代替行號,可以將來自源文件的語句編號用作參數(shù)。通過使用哈希表將名稱存儲為由id引用的字符串,名稱可被轉(zhuǎn)換成較短的id以被存儲為filenameid606和methodid608。以后,在后處理時,在給定id的情況下,哈希表可以用來查找關聯(lián)的字符串。

在另一個實施例中,當應用或一個或多個其它活動對象保持對對象的引用時,該對象是“活的”。當從所有活動對象和應用移除對對象的所有引用時,該對象死亡。當移除最后引用時,銷毀對象以及可以通過現(xiàn)有技術的引用計數(shù)的方法來確定使得該銷毀發(fā)生的應用函數(shù)。引用計數(shù)是存儲對對象的引用、指針或句柄的數(shù)量的技術。在該實施例中,分配器存儲與對象本身相關聯(lián)或?qū)ο蟊旧碇械囊糜嫈?shù)。應用使用分配器方法添加或移除對對象的引用以及對象之間的引用。當應用函數(shù)經(jīng)由分配器的方法移除對對象的最后引用時,對象的引用計數(shù)將降為零,已知對象在那時死亡,以及分配器將對與剛死亡的對象相關聯(lián)的存儲器解除分配。在該精確點處,分配器可以確定使得對象被銷毀的函數(shù)。如稍早描述的,分配器可以遍歷調(diào)用棧,直到它到達分配器的移除引用方法的入口點為止??梢源_定函數(shù)的返回地址?;蛞灶愃频姆绞剑梢韵蛞瞥梅椒▊鬟f包括當前文件名、當前行號和函數(shù)的當前函數(shù)名的附加參數(shù)。

在本發(fā)明的實施例中,另外的信息可以存儲在存儲器102的空閑區(qū)域122中,包括但不限于:(i)存儲器102的該空閑區(qū)域122不滿足請求的、空閑列表134上的分配請求數(shù)量“n_not_sat”;(ii)在創(chuàng)建對象到銷毀對象之間的經(jīng)過時間/cpu時間;(iii)當先前擁有存儲器102的區(qū)域122的對象是活的時出現(xiàn)的分配請求的數(shù)量或分配請求的總大??;以及(iv)其它信息,諸如使得對象被銷毀的函數(shù)的線程id或模塊id。

存儲器的每個空閑區(qū)域122-128將包括與存儲器的該特定區(qū)域以及一個或多個對象的銷毀的原因相關的上述信息中的全部或一些或不包括這些信息。存儲器102的該空閑區(qū)域122-128不滿足請求的、空閑列表134上的分配請求數(shù)量“n_not_sat”是有用的,因為它使本發(fā)明的實施例能夠?qū)⒆罱砑拥娇臻e列表134的存儲器102的那些空閑區(qū)域122-128與長時間在空閑列表134上以及不是“有用的”存儲器102的那些空閑區(qū)域122-128(即,不能滿足分配請求的存儲器102的那些空閑區(qū)域122-128)區(qū)分開。可以將分配請求數(shù)量“n_not_sat”實現(xiàn)為與其它信息602-608存儲在一起的計數(shù)器,每次分配器136針對分配請求檢查存儲器區(qū)域122-128中的每一個存儲器區(qū)域時,計數(shù)器遞增,但是分配請求數(shù)量“n_not_sat”不用于分配。

在創(chuàng)建對象到銷毀對象之間的經(jīng)過時間或cpu時間是有用的,因為先前分配給僅持續(xù)較短經(jīng)過時間或較短cpu時間的對象(稱為短壽命對象)的存儲器102的空閑區(qū)域122-128是產(chǎn)生較多孔的那種對象。當將存儲器區(qū)域122分配給對象時,可以將創(chuàng)建對象時的開始時間與其它信息存儲在一起。在對對象解除分配時,知道銷毀對象時的時間。這兩個時間之間的差是對象活了多久(經(jīng)過時間或cpu時間或兩者)。

在創(chuàng)建對象到銷毀對象之間的存儲器分配的數(shù)量或存儲器分配的總大小的增大是對象是短壽命對象還是長壽命對象的另一個度量。當將存儲器區(qū)域122分配給對象時,可以將直到對象被創(chuàng)建已發(fā)生的分配的數(shù)量與其它信息存儲在一起。在對對象進行解除分配時,知道直到對象被銷毀已發(fā)生的分配的數(shù)量。這兩個數(shù)量之間的差是當對象是活的時已發(fā)生的存儲器分配的數(shù)量。

當分配器136試圖向應用130、132分配存儲器時,分配器136搜索空閑列表134,尋找合適大小的存儲器區(qū)域122-128以從中進行分配。當分配器136找到這種存儲器區(qū)域時,存儲器區(qū)域可能比所請求的分配大小大得多。分配器136分配存儲器區(qū)域的一部分,將存儲器區(qū)域的剩余部分插入到空閑列表134上。為此,分配器136將存儲器區(qū)域分成兩個部分,創(chuàng)建兩個對象:分配對象和剩余對象。將分配對象返回給應用以滿足分配請求。將剩余對象插入到空閑列表134中,以及因此剩余對象立即“死亡”。在本發(fā)明的實施例中,根據(jù)存儲器的空閑區(qū)域中有多少空間可用,當分配器136這樣做時,分配器136記錄指示與剩余對象到空閑列表134上的釋放相關聯(lián)的分配器136的“插入剩余部分”動作的專用方法id(在存儲器的空閑區(qū)域122中)。類似地,當合并存儲器區(qū)域時,分配器136記錄指示分配器136的合并動作的專用方法id。以類似方式,從合并的兩個或更多個存儲器區(qū)域創(chuàng)建一個合并對象,以及該合并對象立即“死亡”并且被插入回到空閑列表134中。注意,專用方法id可以重寫先前的方法id608,或者專用方法id可以附加至該存儲器區(qū)域122的較早的方法id608,使得關于孔的原始原因的信息在數(shù)據(jù)分析時仍然可用。

回到圖5,在步驟508處,將步驟506處收集的信息存儲在正在被釋放以及先前與現(xiàn)在被銷毀的對象相關聯(lián)的存儲器區(qū)域122中,其中現(xiàn)在被銷毀的對象擁有先前分配(現(xiàn)在空閑)的存儲器區(qū)域122。簡要地參照圖6,圖6示出了圖3的存儲器102的空閑孔122連同通過圖5的實施例的步驟508存儲在其中的信息602-608。

在步驟510處,對所收集的信息進行分析,以確定存儲器102的一個或多個區(qū)域122-128為什么沒有被重新分配給任何應用。這種分析可以是例如收集誰創(chuàng)建了這些對象和誰使得這些對象被銷毀和/或在何處創(chuàng)建了這些對象或在何處銷毀了這些對象的統(tǒng)計概況。這種統(tǒng)計概況可以是示出區(qū)域122-128的大小的種類或空閑區(qū)域122-128的數(shù)量的直方圖。這可以示出不能分配的存儲器102的空閑區(qū)域122-128中的大多數(shù)包括存儲器102的分配區(qū)域之間的小孔。在該情況下,可以研究創(chuàng)建那些對象和/或使得那些對象被銷毀的方法的源代碼以確定創(chuàng)建了哪種對象,它們?yōu)槭裁淳哂卸淌褂脡勖约按_定避免外部碎片的其它手段。

在作為診斷工具的一部分的本發(fā)明實施例中,可以(i)在由分析員提出請求時(原地分析)或(ii)在應用終止時(事后分析),對存儲器102的空閑區(qū)域122-128中存儲的所收集的信息進行分析。

在作為自適應分配器136的一部分的本發(fā)明實施例中,可以在分配器決定進行校正動作時,對存儲器102的空閑區(qū)域122-128中存儲的所收集的信息進行分析。

參照圖7,對于(如由其文件名、方法、函數(shù)或例程名和/或行號確定的)每個調(diào)用器id,基于所收集的信息維持一組統(tǒng)計度量700。在示例性實施例中,在包括如在數(shù)據(jù)收集期間記錄的該調(diào)用器的一個或多個指示符的空閑列表134上,維持與該調(diào)用器id相關聯(lián)的存儲器區(qū)域122-128的數(shù)量的計數(shù)702、空閑存儲器區(qū)域122-128的大小的平均值704或空閑存儲器區(qū)域122-128的大小的直方圖706。

每個調(diào)用器id與一組統(tǒng)計度量700相關聯(lián);以及如將為本領域技術人員所熟知的,可以例如通過將調(diào)用器id用作哈希表的關鍵字來存儲和檢索該組統(tǒng)計度量??梢栽谠摻M度量700中維持其它統(tǒng)計度量,例如,跨越與調(diào)用器id相關聯(lián)的所有存儲器區(qū)域122-128的所有未滿足分配請求的總計數(shù)708、當對象是活的時候被銷毀的對象的平均壽命710(與調(diào)用器id相關聯(lián),以cpu時間或經(jīng)過時間為單位);以應用在那些使用壽命期間進行的分配的數(shù)量為單位的對象的平均壽命712;或以應用所分配的字節(jié)數(shù)量為單位的對象的平均壽命714。度量702-714可以全部存在,它們可以以任何組合存在,或者可以僅存在任何一個。

圖8示出了圖5的分析步驟510的實施例的流程圖。方法在步驟802處開始。通過檢查空閑列表134生成統(tǒng)計度量700。在步驟804處,對于空閑列表134上的每個存儲器區(qū)域122-128,首先識別調(diào)用器id。調(diào)用器id是下列中的一個或多個:方法id、線程id、模塊id、行號、文件名id或方法中的返回地址,其可以根據(jù)可被寫入到目標文件或單獨的“調(diào)試信息”文件中的符號信息映射到調(diào)用器方法id和/或行號。根據(jù)符號信息的調(diào)用器id的映射將為本領域技術人員所熟知。

在步驟806處,檢索對于該調(diào)用器id計算的該組統(tǒng)計度量700,以及用正被檢查的當前存儲器區(qū)域的所收集的信息更新該組統(tǒng)計度量700。例如,可以更新與調(diào)用器id相關聯(lián)的存儲器區(qū)域122-128的數(shù)量的計數(shù)702,可以使用來自存儲器區(qū)域122中存儲的已知大小304更新對于調(diào)用器id的存儲器區(qū)域的大小的平均值704,和/或可以使用已知大小304更新對于調(diào)用器id的存儲器區(qū)域的大小的直方圖706。

在步驟808處,可以更新對于該調(diào)用器id的其它統(tǒng)計度量708-714。例如,可以基于正被檢查的存儲器區(qū)域的未滿足分配請求數(shù)量“n_not_sat”更新對于該調(diào)用器id的未滿足分配請求總數(shù)量708。此外,作為示例,對于該調(diào)用器id,可以使用與存儲器區(qū)域相關聯(lián)的對象是活的時候的以cpu時間或經(jīng)過時間為單位的時間段來更新對于該調(diào)用器id的以當對象是活的時候被銷毀的對象的cpu時間或經(jīng)過時間為單位的平均壽命710。方法在步驟810處結束。

應當理解,可能存在可以采用的許多不同統(tǒng)計度量,以及上述僅給出了它們中的選集。此外,由于調(diào)用器id具有分級性質(zhì),度量中的一些可以產(chǎn)生分級信息。例如,作為結果產(chǎn)生的統(tǒng)計數(shù)據(jù)可以示出通過方法所駐留的模塊、接著通過方法以及接著通過行號發(fā)生了什么??梢岳迷创a增強信息。

可以將統(tǒng)計數(shù)據(jù)(i)傳遞給作為將使用信息改變分配器136行為的自適應分配器136的一部分的系統(tǒng)的另一個組件;或(ii)傳遞給剖析工具,該剖析工具將使用信息將診斷報告輸出給性能分析員,該性能分析員將使用報告對應用或分配器進行更改以減少碎片。存在許多關于可以如何使統(tǒng)計數(shù)據(jù)可視化以使得指示數(shù)據(jù)的豐富視圖的現(xiàn)有技術(例如可從sourceforge購得的performanceinspector、可從intel公司購得的vtune,或可從sourceforge購得的oprofile)。

下面針對c++語言示出可以如何查看上面(ii)的這種診斷報告的示例。碎片原因的識別(諸如,還識別產(chǎn)生碎片的對象“obja”的classa::methoda的行10)是本發(fā)明實施例的主要優(yōu)點。

未滿足的請求

孔的大小<16字節(jié)

其中:

標記-事件發(fā)生的分層級別:

tid-線程級別

mod-模塊級別

sym-符號級別

lin-行號

計數(shù)-給定報告度量的計數(shù)(例如,未滿足請求,大?。?6字節(jié)的孔)

%%%-該符號內(nèi)的該度量的比例(作為百分比)

名稱-符號名稱(即,線程id名稱、模塊名稱、方法名稱、行號和該行處的源代碼)。

在步驟512處,研究結果可以用于改變存儲器的分配以便避免外部碎片的原因。分配器使用步驟510的結果以更好地分配正在導致外部碎片的那種對象。方法在步驟514處結束。

圖9示出了確定什么和/或誰正在導致外部碎片的根據(jù)本發(fā)明的方法的第二實施例的流程圖。步驟502至510與上面已經(jīng)參照圖5描述的那些步驟相同。在步驟912處,步驟510的所收集的信息的分析結果用來從存儲器的第一區(qū)域為類似于被銷毀的一個或多個對象的新創(chuàng)建的對象分配存儲器102的區(qū)域,存儲器的第一區(qū)域與用來為新創(chuàng)建的對象中的其它對象分配存儲器區(qū)域的存儲器的第二區(qū)域分開。在該實施例中,如果數(shù)據(jù)分析確定第一應用或特定的第一方法通常通過請求以及隨后釋放小存儲器區(qū)域?qū)е滤槠?,同時第二應用或特定的第二方法請求以及隨后釋放大得多的存儲器區(qū)域,則可以從分離的存儲器區(qū)域分配來自第一應用和第二應用的請求。方法在步驟914處結束。在實施例中,存儲器的第一區(qū)域中的新創(chuàng)建的對象具有不同大小,通常為小對象,而對于存儲器的第二區(qū)域中的新創(chuàng)建的對象,通常為大對象。

本發(fā)明的實施例需要知道對象何時以及在何處死亡,以及因此在程序源中,對象死亡的位置需要被很好地定義并且是明確的。例如,對于自動存儲器管理(諸如,虛擬機垃圾收集器(virtualmachinegarbagecollector)),程序僅隱含地確定對象何時死亡,這(主要)是在對象不再被活動對象引用時發(fā)生。因此,人們不能確定“誰”銷毀了對象,因為僅在垃圾收集時發(fā)現(xiàn)死亡對象。在這種實施例中,當垃圾收集器利用引用計數(shù)時,這可以用來確定對象何時死亡。然而,在許多分配方案(諸如,c/c++中的許多存儲器模型)中,對于“誰”銷毀了對象以及對象在程序源中“何處”死亡存在非常清楚的定義。ibm是在世界范圍內(nèi)的許多管轄區(qū)域中注冊的國際商業(yè)機器公司的商標。java和所有基于java的商標和標識是oracle和/或其子公司的商標或注冊商標。

計算機可讀存儲介質(zhì)可以是可以保持和存儲由指令執(zhí)行設備使用的指令的有形設備。計算機可讀存儲介質(zhì)例如可以是――但不限于――電存儲設備、磁存儲設備、光存儲設備、電磁存儲設備、半導體存儲設備或上述的任意合適的組合。計算機可讀存儲介質(zhì)的更具體的例子(非窮舉的列表)包括:便攜式計算機盤、硬盤、隨機存取存儲器(ram)、只讀存儲器(rom)、可擦式可編程只讀存儲器(eprom或閃存)、靜態(tài)隨機存取存儲器(sram)、便攜式壓縮盤只讀存儲器(cd-rom)、數(shù)字多功能盤(dvd)、記憶棒、軟盤、機械編碼設備、例如其上存儲有指令的打孔卡或凹槽內(nèi)凸起結構、以及上述的任意合適的組合。這里所使用的計算機可讀存儲介質(zhì)不被解釋為瞬時信號本身,諸如無線電波或其他自由傳播的電磁波、通過波導或其他傳輸媒介傳播的電磁波(例如,通過光纖電纜的光脈沖)、或通過電線傳輸?shù)碾娦盘枴?/p>

這里所描述的計算機可讀程序指令可以從計算機可讀存儲介質(zhì)下載到各個計算/處理設備,或通過網(wǎng)絡、例如因特網(wǎng)、局域網(wǎng)、廣域網(wǎng)和/或無線網(wǎng)下載到外部計算機或外部存儲設備。網(wǎng)絡可以包括銅傳輸電纜、光纖傳輸、無線傳輸、路由器、防火墻、交換機、網(wǎng)關計算機和/或邊緣服務器。每個計算/處理設備中的網(wǎng)絡適配卡或網(wǎng)絡接口從網(wǎng)絡接收計算機可讀程序指令,并轉(zhuǎn)發(fā)該計算機可讀程序指令,以供存儲在各個計算/處理設備中的計算機可讀存儲介質(zhì)中。

用于執(zhí)行本發(fā)明操作的計算機程序指令可以是匯編指令、指令集架構(isa)指令、機器指令、機器相關指令、微代碼、固件指令、狀態(tài)設置數(shù)據(jù)、或以一種或多種編程語言的任意組合編寫的源代碼或目標代碼,所述編程語言包括面向?qū)ο蟮木幊陶Z言—諸如smalltalk、c++等,以及常規(guī)的過程式編程語言—諸如“c”語言或類似的編程語言。計算機可讀程序指令可以完全地在用戶計算機上執(zhí)行、部分地在用戶計算機上執(zhí)行、作為一個獨立的軟件包執(zhí)行、部分在用戶計算機上部分在遠程計算機上執(zhí)行、或完全在遠程計算機或服務器上執(zhí)行。在涉及遠程計算機的情形中,遠程計算機可以通過任意種類的網(wǎng)絡—包括局域網(wǎng)(lan)或廣域網(wǎng)(wan)—連接到用戶計算機,或,可以連接到外部計算機(例如利用因特網(wǎng)服務提供商來通過因特網(wǎng)連接)。在一些實施例中,通過利用計算機可讀程序指令的狀態(tài)信息來個性化定制電子電路,例如可編程邏輯電路、現(xiàn)場可編程門陣列(fpga)或可編程邏輯陣列(pla),該電子電路可以執(zhí)行計算機可讀程序指令,從而實現(xiàn)本發(fā)明的各個方面。

這里參照根據(jù)本發(fā)明實施例的方法、裝置(系統(tǒng))和計算機程序產(chǎn)品的流程圖和/或框圖描述了本發(fā)明的各個方面。應當理解,流程圖和/或框圖的每個方框以及流程圖和/或框圖中各方框的組合,都可以由計算機可讀程序指令實現(xiàn)。

這些計算機可讀程序指令可以提供給通用計算機、專用計算機或其它可編程數(shù)據(jù)處理裝置的處理器,從而生產(chǎn)出一種機器,使得這些指令在通過計算機或其它可編程數(shù)據(jù)處理裝置的處理器執(zhí)行時,產(chǎn)生了實現(xiàn)流程圖和/或框圖中的一個或多個方框中規(guī)定的功能/動作的裝置。也可以把這些計算機可讀程序指令存儲在計算機可讀存儲介質(zhì)中,這些指令使得計算機、可編程數(shù)據(jù)處理裝置和/或其他設備以特定方式工作,從而,存儲有指令的計算機可讀介質(zhì)則包括一個制造品,其包括實現(xiàn)流程圖和/或框圖中的一個或多個方框中規(guī)定的功能/動作的各個方面的指令。

也可以把計算機可讀程序指令加載到計算機、其它可編程數(shù)據(jù)處理裝置、或其它設備上,使得在計算機、其它可編程數(shù)據(jù)處理裝置或其它設備上執(zhí)行一系列操作步驟,以產(chǎn)生計算機實現(xiàn)的過程,從而使得在計算機、其它可編程數(shù)據(jù)處理裝置、或其它設備上執(zhí)行的指令實現(xiàn)流程圖和/或框圖中的一個或多個方框中規(guī)定的功能/動作。

附圖中的流程圖和框圖顯示了根據(jù)本發(fā)明的多個實施例的系統(tǒng)、方法和計算機程序產(chǎn)品的可能實現(xiàn)的體系架構、功能和操作。在這點上,流程圖或框圖中的每個方框可以代表一個模塊、程序段或指令的一部分,所述模塊、程序段或指令的一部分包含一個或多個用于實現(xiàn)規(guī)定的邏輯功能的可執(zhí)行指令。在有些作為替換的實現(xiàn)中,方框中所標注的功能也可以以不同于附圖中所標注的順序發(fā)生。例如,兩個連續(xù)的方框?qū)嶋H上可以基本并行地執(zhí)行,它們有時也可以按相反的順序執(zhí)行,這依所涉及的功能而定。也要注意的是,框圖和/或流程圖中的每個方框、以及框圖和/或流程圖中的方框的組合,可以用執(zhí)行規(guī)定的功能或動作的專用的基于硬件的系統(tǒng)來實現(xiàn),或可以用專用硬件與計算機指令的組合來實現(xiàn)。

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