專利名稱::一種用于對(duì)本地方法調(diào)用進(jìn)行性能測(cè)試的方法和裝置的制作方法
技術(shù)領(lǐng)域:
:本發(fā)明涉及性能測(cè)試(profiling)技術(shù),并且更具體地涉及一種用于對(duì)本地方法調(diào)用進(jìn)行性能測(cè)試的方法和裝置。
背景技術(shù):
:性能測(cè)試技術(shù)是這樣一種技術(shù),其通過跟蹤應(yīng)用程序的執(zhí)行過程來(lái)獲得執(zhí)行過程中的各種性能參數(shù),以便定位程序性能瓶頸,從而有針對(duì)性地對(duì)應(yīng)用程序進(jìn)行優(yōu)化。本地方法是一種可以不經(jīng)由虛擬機(jī)(VM,VirtualMachine)解釋而直接在本地硬件平臺(tái)上運(yùn)行的方法。通常,可以使用本地方法用于直接操縱計(jì)算機(jī)硬件、提升程序執(zhí)行性能,遺留代碼重用等目的。眾所周知的是,在諸如Java應(yīng)用的應(yīng)用中,本地方法調(diào)用是非常普遍的,其原因主要在于有許多功能都需要利用本地方法來(lái)實(shí)現(xiàn)。例如,像是用于分布式計(jì)算的對(duì)象序列化的I/0實(shí)現(xiàn),在高速網(wǎng)絡(luò)(多層次應(yīng)用中的關(guān)鍵鏈路的)上的通信、Java虛擬機(jī)(JVM,JavaVirtualMachine)框架,數(shù)學(xué)計(jì)算等等,他們的實(shí)現(xiàn)都要依賴于對(duì)本地方法的使用。實(shí)踐證明,在使用本地方法的情況下,應(yīng)用瓶頸很大可能是存在于本地代碼中或者出現(xiàn)在本地層。因此,對(duì)本地方法調(diào)用進(jìn)行性能測(cè)試是應(yīng)用程序性能測(cè)試中不可或缺的內(nèi)容。在現(xiàn)有技術(shù)中,已經(jīng)存在幾種對(duì)于本地函數(shù)進(jìn)行性能測(cè)試的技術(shù),其中有一種是字節(jié)碼級(jí)別注入技術(shù),還有一種是Java虛擬機(jī)工具接口(JVMToolInterface,JVMTI)方法級(jí)別事件跟蹤技術(shù)。其中,字節(jié)碼級(jí)別注入技術(shù)又可進(jìn)一步分成靜態(tài)注入方法和動(dòng)態(tài)注入方法。靜態(tài)注入方法是一種在應(yīng)用執(zhí)行之前對(duì)所有JDK類、所有應(yīng)用類進(jìn)行字節(jié)碼注入的方法。由于靜態(tài)字節(jié)碼注入需要進(jìn)行大工作量的類搜索,因此注入過程需要花費(fèi)很長(zhǎng)時(shí)間,尤其對(duì)于較大應(yīng)用程序,所耗費(fèi)的時(shí)間更長(zhǎng)。另外,靜態(tài)注入方法是在應(yīng)用程序執(zhí)行之前進(jìn)行字節(jié)碼注入,因此無(wú)法對(duì)應(yīng)用程序執(zhí)行過程中動(dòng)態(tài)裝載的庫(kù)進(jìn)行性能測(cè)試。此外,還存在另外一個(gè)令人無(wú)法接受的缺陷,即,在使用靜態(tài)注入方法的情況下,需要維護(hù)兩個(gè)類集合,一個(gè)是經(jīng)注入版本的類集合,一個(gè)原始版本的類集合。與靜態(tài)注入方法不同,動(dòng)態(tài)注入方法是一種在裝載類的同時(shí)對(duì)類進(jìn)行字節(jié)碼注入的方法。然而,對(duì)于動(dòng)態(tài)注入方法存在有若干技術(shù)約束。例如,有些調(diào)用方法代碼是不允許被改變的,而還有些調(diào)用方法代碼在開始進(jìn)行字節(jié)碼注入之前已經(jīng)被加載,這些都造成無(wú)法對(duì)這些調(diào)用方法代碼進(jìn)行性能測(cè)試。另外,動(dòng)態(tài)地對(duì)類進(jìn)行這種修改,即進(jìn)行字節(jié)碼注入,會(huì)對(duì)類裝載器以及動(dòng)態(tài)(JIT,Just-In-Time)編譯器的行為/性能都有很大影響,諸如,系統(tǒng)開銷會(huì)顯著增加,這也不是所期望的。另一方面,在JVMTI方法級(jí)別事件跟蹤技術(shù)中,提供了方法入口事件和方法出口事件的回調(diào),因此可以利用JVMTI規(guī)范中定義的"IsMethodNative()"函數(shù)來(lái)檢查一個(gè)方法是否是本地方法。這種方式與字節(jié)碼級(jí)別注入相比,簡(jiǎn)單且易于實(shí)現(xiàn)。然而,由于JVMTI級(jí)別事件跟蹤技術(shù)需要捕獲應(yīng)用程序運(yùn)行過程中的所有方法并且執(zhí)行對(duì)該方法的判斷,因此使系統(tǒng)開銷變得很大,速度甚至能下降100至1000倍,從而使系統(tǒng)性能受到顯著影響。除上述技術(shù)以外,還存在對(duì)本地方法調(diào)用進(jìn)行性能測(cè)試的另外一種已知技術(shù)。諸如在現(xiàn)有的JVMTI中,提供了與本地方法調(diào)用關(guān)聯(lián)的事件,S卩如下所示的本地方法綁定(NativeMethodBind)事件voidJNICALLNativeMethodBind(jvmtiEnv女jvmti_env,JNIEnv女jni_env,jthreadthread,jmethodIDmethod,void*address,void**new_address_ptr)本地方法綁定事件是指JVM將Java程序中的本地方法的定義和具體的本地方法代碼的地址綁定在一起的事件,其通常是在本地方法第一次被調(diào)用的時(shí)候觸發(fā)。每當(dāng)啟動(dòng)上述本地方法綁定事件時(shí),可通過該事件中定義的參數(shù)返回一些重要信息。例如,"thread"可以返回提出綁定要求的線程,"method"可以返回被綁定的方法,"address"可以返回被綁定的本地方法的地址。而且,如果"new—adress—ptr"被設(shè)置,則VM會(huì)將本地方法調(diào)用綁定到new_address_ptr所指定的代碼地址上。因此,可以從該事件得到被綁定的本地方法的地址address。并且如圖1中所示,通過將新地址參數(shù)new_address_ptr設(shè)置為諸如性能測(cè)試代碼的地址,就可以自動(dòng)地將Java的輸入輸出文件流中本地方法的地址替換為性能測(cè)試代碼的地址,從而執(zhí)行性能測(cè)試代碼,實(shí)現(xiàn)對(duì)本地方法調(diào)用的性能測(cè)試。在使用這種機(jī)制時(shí),需為每個(gè)本地方法設(shè)置一個(gè)關(guān)聯(lián)代理或者包裝器,以便執(zhí)行性能測(cè)試任務(wù)和調(diào)用本地方法。在相關(guān)代理能夠正確執(zhí)行時(shí),可以得到較好的結(jié)果,應(yīng)用運(yùn)行時(shí)對(duì)系統(tǒng)的性能影響也不大。然而,事實(shí)上每個(gè)本地方法的參數(shù)類型和返回類型都是不同的,因此要執(zhí)行上述替換,每個(gè)關(guān)聯(lián)代理必須具有與待進(jìn)行性能測(cè)試的方法完全相同的簽名。但是根據(jù)目前的技術(shù),無(wú)法實(shí)現(xiàn)預(yù)測(cè)動(dòng)態(tài)裝載方法的簽名,因此使得這種機(jī)制在實(shí)際上并不實(shí)用。
發(fā)明內(nèi)容有鑒于此,本發(fā)明的目的在于提供一種改進(jìn)的用于對(duì)本地方法調(diào)用進(jìn)行性能測(cè)試的方法和裝置。根據(jù)本發(fā)明的一個(gè)方面,提供了一種用于對(duì)本地方法調(diào)用進(jìn)行性能測(cè)試的方法。該方法可以包括響應(yīng)于本地方法調(diào)用關(guān)聯(lián)事件,由用于對(duì)本地方法調(diào)用進(jìn)行性能測(cè)試的通用性能測(cè)試模板生成性能測(cè)試模板副本;將對(duì)所述本地方法調(diào)用進(jìn)行性能測(cè)試所需的信息填寫到所述性能測(cè)試模板副本中的相應(yīng)位置;以及改變代碼執(zhí)行流程,以便執(zhí)行所述性能測(cè)試模板副本。根據(jù)本發(fā)明的另一方面,提供了一種用于對(duì)本地方法調(diào)用進(jìn)行性能測(cè)試的裝置,包括副本生成裝置,用于響應(yīng)于本地方法調(diào)用關(guān)聯(lián)事件,由用于對(duì)本地方法調(diào)用進(jìn)行性能測(cè)試的通用性能測(cè)試模板生成性能測(cè)試模板副本;信息填寫裝置,用于將對(duì)所述本地方法調(diào)用進(jìn)行性能測(cè)試所需的信息填寫到所述性能測(cè)試模板副本中的相應(yīng)位置;以及流程改變裝置,用于改變代碼執(zhí)行流程,以便執(zhí)行所述性能測(cè)試模板副本。此外,本發(fā)明還可以通過一種計(jì)算機(jī)程序產(chǎn)品來(lái)實(shí)現(xiàn)。該計(jì)算機(jī)程序產(chǎn)品其上具有計(jì)算機(jī)程序代碼,當(dāng)該計(jì)算機(jī)程序代碼在計(jì)算機(jī)上運(yùn)行時(shí),能夠執(zhí)行根據(jù)本發(fā)明的用于6對(duì)本地方法調(diào)用進(jìn)行性能測(cè)試的方法的步驟。根據(jù)本發(fā)明,在本地方法被調(diào)用時(shí),通過在匯編級(jí)別將性能測(cè)試模板副本動(dòng)態(tài)地插入在執(zhí)行路徑中,來(lái)實(shí)現(xiàn)對(duì)本地方法的性能測(cè)試。因此,相對(duì)于現(xiàn)有技術(shù)而言,不需要針對(duì)每個(gè)本地方法提供關(guān)聯(lián)代理,具有很高的可行性,并且?guī)缀跷磳?duì)系統(tǒng)性能造成任何影響。通過結(jié)合附圖對(duì)實(shí)施方式進(jìn)行詳細(xì)說明,本發(fā)明的上述以及其他特征將更加明顯,在本發(fā)明附圖中,相同的標(biāo)號(hào)表示相同或相似的部件,其中圖1是示出了JVMTI提供的本地方法綁定事中利用新地址參數(shù)替換本地方法地址的示意圖;圖2示出根據(jù)本發(fā)明的實(shí)施例的用于對(duì)本地方法調(diào)用進(jìn)行性能測(cè)試的方法的流程圖;圖3示出了根據(jù)本發(fā)明的實(shí)施例在入口模板副本中執(zhí)行的操作的流程圖;圖4示出了根據(jù)本發(fā)明的實(shí)施例在出口模板副本中執(zhí)行的操作的流程圖;圖5示出了根據(jù)本發(fā)明的一個(gè)實(shí)施例的用于對(duì)本地方法調(diào)用進(jìn)行性能測(cè)試的裝置;以及圖6示出了其中可以實(shí)現(xiàn)根據(jù)本發(fā)明的實(shí)施例的計(jì)算機(jī)系統(tǒng)的示例性結(jié)構(gòu)方框圖。具體實(shí)施例方式下面,將參考附圖詳細(xì)地描述本發(fā)明提供的用于對(duì)本地方法調(diào)用進(jìn)行測(cè)試的方法和裝置。首先,將參考圖2來(lái)描述根據(jù)本發(fā)明的方法的實(shí)施例。圖2示出根據(jù)本發(fā)明一個(gè)實(shí)施例的用于對(duì)本地方法調(diào)用進(jìn)行性能測(cè)試的方法的流程圖。如圖2所示,在步驟201,響應(yīng)于本地方法調(diào)用關(guān)聯(lián)事件,由用于對(duì)本地方法調(diào)用進(jìn)行性能測(cè)試的通用性能測(cè)試模板生成性能測(cè)試模板副本。在Java虛擬機(jī)中,在調(diào)用方法對(duì)本地方法進(jìn)行調(diào)用后,本地方法的地址將會(huì)被綁定,此時(shí)將會(huì)啟動(dòng)諸如上述本地方法綁定事件(NativeMethodBind)的本地方法調(diào)用關(guān)聯(lián)事件。需要說明的是,在本發(fā)明的上下文中將以本地方法綁定事件為例對(duì)本發(fā)明的實(shí)施例進(jìn)行描述。然而,除了上述的本地方法綁定事件以外,其他任何能夠提供本地方法的地址的其他本地方法調(diào)用關(guān)聯(lián)事件也能夠?qū)崿F(xiàn)本發(fā)明的目的。另外,在除J肌a虛擬機(jī)之外存在本地方法調(diào)用的其他環(huán)境中,在調(diào)用本地方法時(shí)被觸發(fā)的事件可以是與本地方法綁定事件類似的事件,或者是能夠提供本地方法的地址的其他本地方法調(diào)用關(guān)聯(lián)事件。在本地方法調(diào)用關(guān)聯(lián)事件被啟動(dòng)后,可以由用于對(duì)本地方法調(diào)用進(jìn)行性能測(cè)試的通用性能測(cè)試模板生成性能測(cè)試模板副本。根據(jù)本發(fā)明的方法,為所有的本地方法提供了用于對(duì)本地方法調(diào)用進(jìn)行測(cè)試的通用性能測(cè)試模板。在本地方法調(diào)用關(guān)聯(lián)事件啟動(dòng)時(shí),從該通用性能測(cè)試模板復(fù)制出用于該本地方法調(diào)用的性能測(cè)試模板副本。性能測(cè)試模板副本是通用性能測(cè)試模板的一個(gè)拷貝,它們?cè)谛问缴贤耆嗤2煌氖?,通用性能測(cè)試模板將被持續(xù)地存儲(chǔ),而性能測(cè)試模板副本專用于特定本地方法,在完成性能測(cè)試之后,存儲(chǔ)性能測(cè)試模板副本的空間將被釋放。出于說明的目的,在下面給出了一個(gè)通用測(cè)試模板的實(shí)例。需要說明的是,下面給出的實(shí)例只是一個(gè)實(shí)例,本發(fā)明并不局限于此,而是可以具有多種變型。通用性能測(cè)試模板的實(shí)例入口樽板};在上面給出的實(shí)例中,示出了機(jī)器碼級(jí)別的通用的入口模板和出口模板。為了使得該通用性能測(cè)試模板的實(shí)例更加容易理解,在下面的表1和表2中列出了與之對(duì)應(yīng)的匯編級(jí)別代碼和相應(yīng)解釋。表1-入口模板的匯編代碼及其相應(yīng)解釋staticunsignedcharprologTemplate[]=/*0*/0x50,0x52,0x53,0x8b,Oxld,0x00,0x00,0x00,/*8*/0x00,0x85,Oxdb,0x74,0x34,0x8b,0x44,0x24,/*10*/0x0c,0xa3,0x00,0x00,0x00,0x00,0xb8,0x00,/*18*/0x00,0x00,0x00,0x89,0x44,0x24,OxOc,OxOf,7^20^/0x31,0xa3,0x00,0x00,0x00,0x00,0x89,OxdO,/^28〃0xa3,0x00,0x00,0x00,0x00,0x68,0x00,0x00,/*30*/0x00,0x00,Oxbb,OxOO,OxOO,OxOO,OxOO,Oxff,/*38*/0xl3,0x83,0xc4,0x04,0x5b,0x5a,0x58,0xe9,/*0*/0x6a,0x00,0x50,0x52,0x53,OxOf,0x31,0xa3,/*8*/0x00,0x00,0x00,0x00,0x89,OxdO,0xa3,0x00,/*10*/OxOO,0x00,0x00,Oxal,0x00,0x00,0x00,0x00,/*18*/0x89,0x44,0x24,OxOc,0x68,0x00,0x00,0x00,A2(^/0x00,Oxbb,0x00,0x00,0x00,0x00,Oxff,0x13,/*28*/0x83,0xc4,0x04,0x5b,0x5a,0x58,0xc38<table>tableseeoriginaldocumentpage9</column></row><table><table>tableseeoriginaldocumentpage10</column></row><table><table>tableseeoriginaldocumentpage11</column></row><table><table>tableseeoriginaldocumentpage12</column></row><table>從上面給出的通用性能測(cè)試模板的實(shí)例和以及表1和表2可以看出,在通用性能測(cè)試模板中有若干個(gè)需要在本地方法被調(diào)用時(shí)確定的代碼(以下劃線示出),這些代碼對(duì)應(yīng)于匯編代碼中的參數(shù)(以粗體示出)。關(guān)于這些待確定的代碼和參數(shù),以及通用測(cè)試模板副本的操作將在下文中更加詳細(xì)地描述。然后,在步驟202,將對(duì)所述本地方法調(diào)用進(jìn)行性能測(cè)試所需的信息填寫到所述性能測(cè)試模板副本中的相應(yīng)位置。在步驟201中由通用性能測(cè)試模板得到的性能測(cè)試副本是通用性能測(cè)試模板的一個(gè)拷貝,其中包括若干有待確定的代碼。用于確定這些代碼相關(guān)的信息即為對(duì)所述本地方法調(diào)用進(jìn)行性能測(cè)試所需的信息,該信息包括-本地方法的地址,對(duì)應(yīng)于表1中匯編代碼的變量"targetjp",其應(yīng)設(shè)置為由諸如本地方法綁定時(shí)間返回的參數(shù)"address"的值。在性能測(cè)試模板副本中需調(diào)用本地方法,因此需要得到本地方法的地址。本地方法的地址由諸如本地方法綁定事件的本地方法調(diào)用關(guān)聯(lián)事件提供。-性能測(cè)試開關(guān)的地址,對(duì)應(yīng)于表1中匯編代碼的"active"。性能測(cè)試開關(guān)是用于確定是否執(zhí)行性能測(cè)試的參數(shù)??梢詾殚_發(fā)人員或者用戶提供用戶接口以便輸入其所關(guān)注(或不關(guān)注)的本地方法,然后,可以在該步驟通過確定被調(diào)用的本地方法是不是用戶關(guān)注的方法來(lái)為該開關(guān)賦值。這樣,就可以在性能測(cè)試模板中,基于該性能測(cè)試開關(guān)的值來(lái)確定是否執(zhí)行性能測(cè)試,使得開發(fā)人員或者用戶能夠僅對(duì)關(guān)注的本地方法進(jìn)行性能測(cè)試,或者對(duì)不關(guān)心的方法不進(jìn)行性能測(cè)試,從而為開發(fā)人員進(jìn)行性能測(cè)試提供更大的便利性和靈活性。性能測(cè)試開關(guān)的地址是可選的,如果不以選擇性的方式來(lái)執(zhí)行性能測(cè)試,則不需要該參數(shù)。-存儲(chǔ)本地方法返回地址的地址,對(duì)應(yīng)于表l中匯編代碼的變量"caller」p"。在需對(duì)本地方法調(diào)用進(jìn)行出口性能測(cè)試的情況下,需要在完成本地方法調(diào)用后執(zhí)行出口模板副本,因此需要用于保存本地方法的返回地址的空間,以便將該返回地址替換為出口模板副本的地址。存儲(chǔ)本地方法返回地址的地址是可選的,在不進(jìn)行出口性能測(cè)試時(shí),則不需要該參數(shù)。-性能測(cè)試模板副本的地址,尤其在需要出口性能測(cè)試的情況下,需要在入口模板副本中填寫出口模板副本的地址,對(duì)應(yīng)于表1中匯編代碼的變量"印ilog",以便能在完成本地方法調(diào)用后執(zhí)行出口性能測(cè)試。性能測(cè)試模板副本的地址是可選的,在不進(jìn)行出口性能測(cè)試時(shí),則不需要該參數(shù)。-存儲(chǔ)性能測(cè)試的各項(xiàng)信息(諸如,調(diào)用本地方法的開始時(shí)間和調(diào)用本地方法的結(jié)束時(shí)間,本地方法的調(diào)用次數(shù)等)的地址,如表1和表2所示匯編代碼中的變量"timestamp_low"和"timestamp_high",該地址指定了用于存儲(chǔ)性能測(cè)試過程中得到的各項(xiàng)信息的空間的起始地址,可以在適當(dāng)時(shí)間將存儲(chǔ)的信息從該空間中導(dǎo)出。存儲(chǔ)性能測(cè)試的各項(xiàng)信息的地址可以根據(jù)性能測(cè)試的需求而改變,在無(wú)需進(jìn)行相應(yīng)測(cè)試的情況下,可以不包括存儲(chǔ)相應(yīng)的信息的地址。-自定義的入口性能測(cè)試方法的地址,對(duì)應(yīng)于表1的匯編代碼中的變量"callback",該地址指定了存儲(chǔ)自定義的入口性能測(cè)試方法的空間的首地址。自定義的入口性能測(cè)試方法的地址是可選的,在不進(jìn)行自定義的入口性能測(cè)試的情況下,可以不包括該信息。_自定義的出口性能測(cè)試方法的地址,對(duì)應(yīng)于表2的匯編代碼中的變量"callback",該地址指定了存儲(chǔ)自定義的出口性能測(cè)試方法的空間的首地址。自定義的出口性能測(cè)試方法的地址是可選的,在不進(jìn)行自定義的出口性能測(cè)試的情況下,可以不包括該信息。-本地方法的索引,用于識(shí)別不同的本地方法,對(duì)應(yīng)于表1和2的匯編代碼中的變量"index",可以作為自定義的入口性能測(cè)試和/或自定義的出口性能測(cè)試的參數(shù),以使得可以對(duì)不同的本地方法執(zhí)行不同的性能測(cè)試。在無(wú)需對(duì)不同的本地方法執(zhí)行不同性能測(cè)試的情況下,無(wú)需該索引。在該步驟中,將上述信息填寫到性能測(cè)試模板副本中對(duì)應(yīng)的位置。諸如上述性能測(cè)試模板的帶有下劃線的位置。需要說明的是,并非上述所有信息都是必要的,根據(jù)應(yīng)用可以選擇其中的一種或者多種。然后,在步驟203,改變代碼執(zhí)行流程,以便執(zhí)行所述性能測(cè)試模板副本。如果要對(duì)本地方法調(diào)用進(jìn)行性能測(cè)試,就需在調(diào)用本地方法之前和/或之后執(zhí)行與性能測(cè)試相關(guān)的一些工作。因此,需要改變?cè)瓉?lái)的代碼執(zhí)行流程,即在執(zhí)行路徑中插入性能測(cè)試相關(guān)代碼,以便在執(zhí)行本地方法的調(diào)用之前和/或之后執(zhí)行性能測(cè)試模板副本。在諸如JVM的情況下,如上所述,JVMTI提供的本地方法綁定(NativeMethodBind)事件具有將本地方法的地址(address)替換為新地址參數(shù)(new_address_ptr)的功能。因此,通過將新地址參數(shù)指定為本發(fā)明的性能測(cè)試模板副本的地址,尤其是與入口測(cè)試模板副本的地址,即可以實(shí)現(xiàn)代碼執(zhí)行流程的改變。另外,可以在執(zhí)行對(duì)本地方法的調(diào)用之前,通過將所述本地方法代碼的最開始字節(jié)修改為跳轉(zhuǎn)到所述性能測(cè)試模板副本的代碼,以及在開始本地方法調(diào)用之前恢復(fù)所述本地方法代碼的最開始字節(jié),來(lái)改變代碼執(zhí)行流程。在根據(jù)本發(fā)明的一個(gè)示例性實(shí)施例中,首先,復(fù)制所述本地方法代碼的最開始字節(jié)并將其存儲(chǔ)到適當(dāng)?shù)奈恢?。最開始字節(jié)的數(shù)目至少等于實(shí)現(xiàn)跳轉(zhuǎn)到所述性能測(cè)試模板副本所需的代碼的字節(jié)數(shù)目,即,跳轉(zhuǎn)指令所需的字節(jié)數(shù)與所述性能測(cè)試模板副本的起始地址的字節(jié)數(shù)之和。例如,對(duì)于32位的X86的CPU,跳轉(zhuǎn)指令需要1個(gè)字節(jié),地址需要4個(gè)字節(jié)(32位),因此至少?gòu)?fù)制最開始的5個(gè)字節(jié)。需要說明的是,對(duì)于不同的指令系統(tǒng)和地址位數(shù)不同的CPU,由于實(shí)現(xiàn)調(diào)轉(zhuǎn)指令所需的字節(jié)數(shù)以及地址位數(shù)不同,該字節(jié)數(shù)目是不同的。然后,例如可以使用操作系統(tǒng)提供的已知的mprotect()系統(tǒng)調(diào)用來(lái)去除對(duì)本地方法所在頁(yè)面的寫保護(hù)。接著,將所述最開始字節(jié)修改為跳轉(zhuǎn)到性能測(cè)試模板副本的代碼。此后,可以在入口模板副本中,在調(diào)用本地方法之前,根據(jù)已預(yù)先保存的最開始字節(jié)來(lái)恢復(fù)本地方法代碼的最開始字節(jié)。通過這樣的方式,實(shí)現(xiàn)了對(duì)代碼執(zhí)行流程的改變。在本地方法的地址不允許被改變的情況下,這種方式是特別有利的。另外,在本地方法調(diào)用關(guān)聯(lián)事件不能提供改變本地方法地址的功能時(shí),可以通過該方法實(shí)現(xiàn)對(duì)代碼執(zhí)行流程的改變。上述步驟202和203的操作可以通過如下所示以C/C++編程語(yǔ)言實(shí)現(xiàn)的包裝器來(lái)完成。包裝器的實(shí)例mtJNIWrapper—Do(jvmtiEnv氺jvmti,jmethodIDmethod,void氺address,void氺氺newAddress){unsignedchar氺p5TJNIRecord*pjc;inti;unsignedcharstr;〃用于由用戶指定所關(guān)心的方法名i=idxJniF皿c;pjc=&JNIRecords[i];pjc—>addrJniF皿c=(unsignedlong)address;:0095]〃根據(jù)MethodID獲得本地方法名稱:0096]err=(jvmtiError)jvmti->GetMethodName(methodID,:0097](char**)&pMethodName,:0098](char氺氺)&pSignature,(char氺氺)&pGeneric);:0099]if(err==JVMTI_ERR0R_N0NE){:0100]if(pMethodName!=NULL){:0101]〃如果方法名中包含變量str中的字符,則將性能測(cè)試開關(guān)打開:0102]if(strstr(pMethodName,str)==NULL)return0;:0103]else{:0104]sprintf(JNIRecords[idxJniFunc].name,〃%s:0105]pMethodName);:0106]pjc_>active=1;:0107]}:0108]〃釋放本地方法所占用的內(nèi)存:0109]jvmti->Deallocate((unsignedchar氺)pMethodName);:o"o]}:o川]}:0112]p=&pjc_>prolog;:0113]〃復(fù)制入口模板:0114]memcpy(p,prologT卿late,SIZE_0F_PR0L0G);:0115]〃填寫入口模板副本信息:0116]〃填寫存儲(chǔ)性能測(cè)試開關(guān)的地址:0117]*(unsignedint*)(p+5)+=(unsignedint)(&pjc_〉active);〃填寫用以保存返回地址的地址*(unsignedint*)(p+18)+=(unsignedint)(&pjc_〉addrCaller);〃填寫出口模板副本的地址^(unsignedint氺)(p+23)+=(unsignedint)(&pjc_>epilog[O]);〃填寫保存時(shí)間戳低32位的地址氺(unsignedint氺)(p+34)+=(unsignedint)(&pjc_>timeEnter);〃填寫保存時(shí)間戳高32位的地址氺(unsignedint氺)(p+41)+=(unsignedint)(&pjc_>timeEnter)+4;〃填寫本地方法的索引氺(unsignedint氺)(p+46)+=i;〃填寫自定義入口性能測(cè)試方法的地址氺(墜ignedint*)(p+51)+=(int)(&pfCallbackEnterNative);〃填寫本地方法的地址氺(unsignedint氺)(p+64)+=(int)address—(int)(p+64);p=&pjc_>印ilog[O];〃復(fù)制出口模板0134]memcpy(p,印ilogT卿late,SIZE_0F_EPIL0G);0135]〃填寫出口模板副本信息0136]〃填寫保存時(shí)間戳低32位的地址0137]氺(unsignedint*)(p+8)+=(unsignedint)(&pjc_>timeLeave);0138]〃填寫保存時(shí)間戳高32位的地址0139]氺(unsignedint氺)(p+15)+=(unsignedint)(&pjc_>timeLeave)+4;0140]〃填寫保存返回地址的地址0141]氺(unsignedint氺)(p+20)+=(int)(&pjc_>addrCaller);0142]〃填寫本地方法的索引0143]氺(unsignedint氺)(p+29)+=i;0144]〃填寫自定義出口性能測(cè)試方法的地址0145]*(unsignedint*)(p+34)+=(int)(&pfCallbackLeaveNative);0146]〃改變代碼執(zhí)行流程0147]〃將newAddress的值設(shè)置為入口模板副本的地址0148]*newAddress=&pjc_>prolog;0149]return0;0150]}0151]需要說明的是,上面給出的包裝器只是一個(gè)實(shí)例,本發(fā)明并不局限于此,而是可以具有多種變型。例如可以先復(fù)制和填寫出口模板副本,然后復(fù)制和填寫入口模板副本,或者可以先復(fù)制入口模板和出口模板,然后填寫入口模板副本和出口模板副本。另外根據(jù)應(yīng)用的需求,需要填寫的信息并不局限于上述信息,而是可以更多或者更少。這些變型都在本發(fā)明的范圍內(nèi)。接下來(lái),將參考圖3和圖4詳細(xì)描述根據(jù)本發(fā)明的一個(gè)實(shí)施例在性能測(cè)試模板副本中執(zhí)行的操作的實(shí)例。圖3示出了根據(jù)本發(fā)明的實(shí)施例在入口性能測(cè)試模板副本中執(zhí)行的操作的流程。如圖3所示,在進(jìn)入已填寫的性能測(cè)試模板副本后,在步驟301,首先保存此刻的寄存器狀態(tài),諸如累加器狀態(tài)、數(shù)據(jù)寄存器狀態(tài)、基址寄存器狀態(tài)等,以便為隨后的與性能測(cè)試相關(guān)操作做準(zhǔn)備,以使得性能測(cè)試不會(huì)對(duì)本地方法的調(diào)用產(chǎn)生影響。接著,在步驟302,從存儲(chǔ)性能測(cè)試開關(guān)的地址讀出性能測(cè)試開關(guān)的值,并根據(jù)該開關(guān)值來(lái)確定性能測(cè)試開關(guān)是否打開。在本發(fā)明的一個(gè)實(shí)施例中,可以由開發(fā)人員通過用戶接口輸入所關(guān)心(或不關(guān)心)的本地函數(shù)名稱,然后在填寫信息時(shí)確定被調(diào)用的本地函數(shù)是否是用戶輸入的本地函數(shù),并據(jù)此設(shè)置開關(guān)值。如果確定性能測(cè)試開關(guān)打開,則過程進(jìn)行至步驟303;否則,過程進(jìn)行至步驟306。然后,在步驟303,保存本地方法的返回地址,并替換該返回地址。在本發(fā)明的一個(gè)實(shí)施例中,首先通過得到堆棧指針?biāo)谖恢玫膬?nèi)容來(lái)獲得本地方法的返回地址,即調(diào)用該本地方法的調(diào)用方法的地址。然后,將其存儲(chǔ)在上述步驟202中所填寫的用于存儲(chǔ)本地方法返回地址的地址處。接著,用在上述步驟202中填寫的出口模板副本的地址,替換堆棧指針?biāo)谖恢锰幍膬?nèi)容,以使得在本地函數(shù)調(diào)用執(zhí)行完成后,執(zhí)行該出口模板副本。隨后,在步驟304,記錄本地方法調(diào)用的時(shí)間和次數(shù)。例如,可以得到當(dāng)前CPU的內(nèi)部定時(shí)器的值,以便得到調(diào)用該本地方法的開始時(shí)間。并且,可以記錄該本地方法調(diào)用的次數(shù)。接著,在步驟305,獲得在步驟202中填寫的自定義入口性能測(cè)試方法的地址,并且調(diào)用該自定義的入口性能測(cè)試方法。自定義的入口性能測(cè)試方法,諸如可以以C/C++語(yǔ)言來(lái)編寫,例如用以記錄訪問存儲(chǔ)器的次數(shù)或時(shí)間,訪問網(wǎng)絡(luò)的次數(shù)、流量或時(shí)間,或者CPU的高速緩存的命中率等。另外,還可以將本地方法的索引作為該自定義的性能測(cè)試方法的參數(shù),以便實(shí)現(xiàn)對(duì)于不同的本地方法執(zhí)行不同的入口性能測(cè)試。接下來(lái),在步驟306,將寄存器狀態(tài)恢復(fù)到進(jìn)入該性能測(cè)試模板副本時(shí)的狀態(tài),為執(zhí)行對(duì)本地方法的調(diào)用做準(zhǔn)備。然后,在步驟307執(zhí)行對(duì)本地方法的調(diào)用。接下來(lái)參考圖4,圖4示出了根據(jù)本發(fā)明的實(shí)施例在出口性能測(cè)試模板副本中執(zhí)行的操作的流程。由于在入口性能測(cè)試模板副本中,本地方法的返回地址被替換為出口模板副本的地址,因此在本地方法調(diào)用結(jié)束后將自動(dòng)執(zhí)行出口模板副本。如圖4所示,在進(jìn)入出口模板副本之后,首先在步驟401,為恢復(fù)本地方法的返回地址(即,調(diào)用本地方法的調(diào)用方法的地址)而在棧中預(yù)留??臻g。接著,在步驟402,保存寄存器狀態(tài),為隨后與性能測(cè)試相關(guān)的操作做準(zhǔn)備。然后,在步驟403,得到當(dāng)前CPU的內(nèi)部定時(shí)器的值,以便得到調(diào)用該方法的結(jié)束時(shí)間。接下來(lái),可以將當(dāng)前的堆棧指針?biāo)谖恢?,即預(yù)留的棧空間設(shè)置為調(diào)用該本地方法的調(diào)用方法的地址,即本地方法的原始返回地址。此后,在步驟404,執(zhí)行自定義的出口性能測(cè)試方法。與入口性能測(cè)試方法類似,出口性能測(cè)試方法可以以C/C++編寫,可以用來(lái)記錄訪問存儲(chǔ)器的次數(shù)或時(shí)間,訪問網(wǎng)絡(luò)的次數(shù)、流量或時(shí)間,或者CPU的高速緩存的命中率等。另外,也可以將本地方法的索引作為該自定義的性能測(cè)試方法的參數(shù),以便實(shí)現(xiàn)對(duì)于不同的本地方法執(zhí)行不同的出口性能測(cè)試。接著,在步驟405,將寄存器狀態(tài)恢復(fù)到本地方法調(diào)用結(jié)束時(shí)的狀態(tài),然后在步驟406執(zhí)行返回,以便返回本地方法的調(diào)用方法。根據(jù)上面描述的本發(fā)明的方法,通過在執(zhí)行路徑中動(dòng)態(tài)地插入?yún)R編級(jí)別的性能測(cè)試模板副本代碼,可以容易地實(shí)現(xiàn)對(duì)本地方法調(diào)用的性能測(cè)試。而且,添加到執(zhí)行路徑中的機(jī)器指令數(shù)量較少,至多40條,因此對(duì)本地方法調(diào)用的性能測(cè)試不會(huì)對(duì)本地方法調(diào)用的執(zhí)行產(chǎn)生明顯影響。并且與現(xiàn)有技術(shù)的方法相比,也不會(huì)對(duì)諸如類裝載器、JIT編譯器等JVM組件造成影響。另外,在進(jìn)行性能測(cè)試的過程中,也不會(huì)觸發(fā)中斷處理和系統(tǒng)調(diào)用,并且對(duì)系統(tǒng)性能的影響很小。為了檢驗(yàn)本發(fā)明的方法對(duì)于系統(tǒng)性能的影響,本發(fā)明人利用本發(fā)明提供的方法對(duì)標(biāo)準(zhǔn)性會(huì)g評(píng)估機(jī)構(gòu)(StandardPerformanceEvalimtionCorporation,SPEC)發(fā)布的Java虛擬機(jī)基準(zhǔn)程序SPECjvm2008中1/0操作最密集的應(yīng)用Complier.compiler進(jìn)行了性能測(cè)試,結(jié)果表明在沒有進(jìn)行性能測(cè)試的情況下,每秒操作數(shù)平均為515.45,而在執(zhí)行了性能測(cè)試的情況下,每秒鐘的平均操作數(shù)為504.68。由此可見,與現(xiàn)有技術(shù)相比,本發(fā)明的方法對(duì)17于系統(tǒng)性能操作影響非常小。在上文中,已經(jīng)參考圖2至圖4、性能測(cè)試模板的實(shí)例、包裝器實(shí)例等對(duì)本發(fā)明提供的方法進(jìn)行了詳細(xì)描述。應(yīng)當(dāng)說明的是,上述描述僅僅是出于說明的目的,本發(fā)明不僅限于此。根據(jù)應(yīng)用需求,本發(fā)明的方法可以存在很多實(shí)施例。在上面描述的實(shí)施例中,性能測(cè)試模板包括入口性能測(cè)試模板和出口性能測(cè)試模板,然而本發(fā)明并不局限于此。而是可以根據(jù)性能測(cè)試的需要來(lái)設(shè)計(jì)性能測(cè)試模板。在根據(jù)本發(fā)明的另一實(shí)施例中,只對(duì)本地方法調(diào)用進(jìn)行入口性能測(cè)試,因此就無(wú)需復(fù)制出口性能測(cè)試模板。在這種情況下,可以省略執(zhí)行保存本地方法的返回地址以及將本地方法的返回地址替換為出口模板副本的步驟。而在另外的實(shí)施例中,只對(duì)本地方法調(diào)用進(jìn)行出口性能測(cè)試,這只需在本地方法調(diào)用之前執(zhí)行保存本地方法的返回地址以及將其替換為出口模板副本的步驟。另外,在根據(jù)本發(fā)明的又一實(shí)施例中,不存在自定義的入口性能測(cè)試方法和/或自定義的出口性能測(cè)試方法??蓛H僅執(zhí)行對(duì)本地方法調(diào)用次數(shù)的記錄和/或?qū)Ρ镜胤椒ㄕ{(diào)用開始時(shí)間、結(jié)束時(shí)間的記錄。并且,記錄本地方法調(diào)用次數(shù)可以在入口模板副本中執(zhí)行,也可以在出口模板副本中執(zhí)行。此外,在執(zhí)行性能測(cè)試不會(huì)改變寄存器狀態(tài)時(shí),可以不用執(zhí)行保存和恢復(fù)寄存器狀態(tài)的步驟。另外,在上述本發(fā)明的實(shí)施例中,是在入口模板副本中判定性能測(cè)試開關(guān)的值來(lái)確定是否執(zhí)行性能測(cè)試。然而,本領(lǐng)域技術(shù)人員應(yīng)該理解的是,也可以在諸如本地方法綁定事件的本地方法關(guān)聯(lián)時(shí)間啟動(dòng)后,首先確定性能測(cè)試開關(guān)的值。在確定改性能開關(guān)打開時(shí),才執(zhí)行隨后的復(fù)制性能測(cè)試副本和填寫信息等步驟。另外,也可以在填寫信息的步驟中,首先確定性能測(cè)試開關(guān)的值,在確定該性能測(cè)試開關(guān)打開時(shí),才執(zhí)行隨后的填寫以及改變代碼執(zhí)行流程的步驟。需要說明的上述的這些變型以及本領(lǐng)域技術(shù)人員能夠設(shè)想的其他變型都屬于本發(fā)明的范圍。下面,將參考圖5來(lái)描述本發(fā)明的裝置的實(shí)施例。圖5示出了根據(jù)本發(fā)明的一個(gè)實(shí)施例的用于對(duì)本地方法調(diào)用進(jìn)行性能測(cè)試的裝置500。如圖5所示,裝置500包括副本生成裝置501,用于響應(yīng)于本地方法調(diào)用關(guān)聯(lián)事件,由用于對(duì)本地方法調(diào)用進(jìn)行性能測(cè)試的通用性能測(cè)試模板生成性能測(cè)試模板副本;信息填寫裝置502,用于將對(duì)所述本地方法調(diào)用進(jìn)行性能測(cè)試所需的信息填寫到所述性能測(cè)試模板副本中的相應(yīng)位置;以及流程改變裝置503,用于改變代碼執(zhí)行流程,以便執(zhí)行所述性能測(cè)試模板副本。在根據(jù)本發(fā)明的一個(gè)實(shí)施例中,所述性能測(cè)試模板副本可以包括在開始所述本地方法調(diào)用之前進(jìn)行性能測(cè)試的入口模板副本。該入口模板副本用于執(zhí)行對(duì)所述本地方法調(diào)用的入口性能測(cè)試;以及調(diào)用所述本地方法。在根據(jù)本發(fā)明的另一實(shí)施例中,所述入口模板副本可以進(jìn)一步用于保存寄存器狀態(tài);對(duì)性能測(cè)試開關(guān)進(jìn)行判定、記錄本地方法調(diào)用的次數(shù)以及執(zhí)行自定義的入口性能測(cè)試方法中的一種或多種;以及恢復(fù)寄存器狀態(tài)。在根據(jù)本發(fā)明的又一實(shí)施例中,所述性能測(cè)試模板副本可以進(jìn)一步包括在完成本地方法調(diào)用后進(jìn)行性能測(cè)試的出口模板副本。在該實(shí)施例中,所述本地方法調(diào)用的返回地址在執(zhí)行本地方法調(diào)用之前被替換為所述出口模板副本的地址,以便在完成本地方法的調(diào)用后執(zhí)行所述出口模板副本。在該實(shí)施例中,所述出口模板副本可以用于執(zhí)行對(duì)本地方法調(diào)用的出口性能測(cè)試以及恢復(fù)所述本地方法調(diào)用的返回地址,以便在執(zhí)行所述出口模板副本之后,返回至調(diào)用所述本地方法的調(diào)用方法。在根據(jù)本發(fā)明的再一實(shí)施例中,所述入口模板副本可以進(jìn)一步用于記錄所述本地方法調(diào)用的開始時(shí)間,所述出口模板副本可以進(jìn)一步用于記錄所述本法方法調(diào)用的結(jié)束時(shí)間。在根據(jù)本發(fā)明的另一實(shí)施例中,所述出口模板副本可以進(jìn)一步用于保存寄存器狀態(tài);執(zhí)行自定義的出口性能測(cè)試方法;以及恢復(fù)寄存器狀態(tài)。在根據(jù)本發(fā)明的又一實(shí)施例中,對(duì)所述本地方法調(diào)用進(jìn)行性能測(cè)試所需的信息可以包括以下一個(gè)或多個(gè)本地方法的地址;存儲(chǔ)本地方法的返回地址的地址;性能測(cè)試模板副本的地址;性能測(cè)試開關(guān)值的地址;存儲(chǔ)性能測(cè)試的各項(xiàng)信息的地址;用于本地方法的索引;自定義的入口性能測(cè)試方法的地址;以及自定義的出口性能測(cè)試方法的地址。在根據(jù)本發(fā)明的又一實(shí)施例中,所述本地方法調(diào)用關(guān)聯(lián)事件可以是Java虛擬機(jī)工具接口所提供的本地方法綁定事件。在該實(shí)施例的情況下,所述流程改變裝置503可以用于通過將所述本地方法綁定事件的新地址參數(shù)設(shè)定為所述性能測(cè)試模板副本的地址,來(lái)改變代碼執(zhí)行流程。在根據(jù)本發(fā)明的再一實(shí)施例中,所述流程改變裝置503可以用于通過將所述本地方法的代碼的最開始字節(jié)修改為至所述性能測(cè)試模板副本的跳轉(zhuǎn),以及在開始本地方法調(diào)用之前恢復(fù)所述本地方法的代碼的最開始字節(jié),來(lái)改變代碼執(zhí)行流程。關(guān)于上述實(shí)施方式中的副本生成裝置501、信息填寫裝置502以及流程改變裝置503的具體操作,可以參考上面結(jié)合2至圖4對(duì)于本發(fā)明的方法的描述。根據(jù)本發(fā)明的裝置,在本地方法被調(diào)用時(shí),通過在匯編級(jí)別動(dòng)態(tài)地在執(zhí)行路徑中插入性能測(cè)試模板副本,來(lái)實(shí)現(xiàn)對(duì)本地方法的性能測(cè)試。因此,相對(duì)于現(xiàn)有技術(shù)而言,本發(fā)明提供的裝置不需要針對(duì)每個(gè)本地方法提供關(guān)聯(lián)代理,具有很高的可行性,并且?guī)缀跷磳?duì)系統(tǒng)性能造成任何影響。下面,將參考圖6來(lái)描述可以實(shí)現(xiàn)本發(fā)明的計(jì)算機(jī)設(shè)備。圖6示意性示出了可以實(shí)現(xiàn)根據(jù)本發(fā)明的實(shí)施方式的計(jì)算設(shè)備的結(jié)構(gòu)方框圖。圖6中所示的計(jì)算機(jī)系統(tǒng)包括CPU(中央處理單元)601、RAM(隨機(jī)存取存儲(chǔ)器)602、ROM(只讀存儲(chǔ)器)603、系統(tǒng)總線604、硬盤控制器605、鍵盤控制器606、串行接口控制器607、并行接口控制器608、顯示器控制器609、硬盤610、鍵盤611、串行外部設(shè)備612、并行外部設(shè)備613和顯示器614。在這些部件中,與系統(tǒng)總線604相連的有CPU601、RAM602、ROM603、硬盤控制器605、鍵盤控制器606、串行接口控制器607、并行接口控制器608和顯示器控制器609。硬盤610與硬盤控制器605相連,鍵盤611與鍵盤控制器606相連,串行外部設(shè)備612與串行接口控制器607相連,并行外部設(shè)備613與并行接口控制器608相連,以及顯示器614與顯示器控制器609相連。圖6所述的結(jié)構(gòu)方框圖僅僅為了示例的目的而示出的,并非是對(duì)本發(fā)明的限制。在一些情況下,可以根據(jù)需要添加或者減少其中的一些設(shè)備。此外,本發(fā)明的實(shí)施方式可以以軟件、硬件或者軟件和硬件的結(jié)合來(lái)實(shí)現(xiàn)。硬件部分可以利用專用邏輯來(lái)實(shí)現(xiàn);軟件部分可以存儲(chǔ)在存儲(chǔ)器中,由適當(dāng)?shù)闹噶顖?zhí)行系統(tǒng),例如微處理器或者專用設(shè)計(jì)硬件來(lái)執(zhí)行。雖然已經(jīng)參考目前考慮到的實(shí)施方式描述了本發(fā)明,但是應(yīng)該理解本發(fā)明不限于所公開的實(shí)施方式。相反,本發(fā)明旨在涵蓋所附權(quán)利要求的精神和范圍內(nèi)所包括的各種修改和等同布置。以下權(quán)利要求的范圍符合最廣泛解釋,以便包含所有這樣的修改及等同結(jié)構(gòu)和功能。權(quán)利要求一種用于對(duì)本地方法調(diào)用進(jìn)行性能測(cè)試的方法,包括響應(yīng)于本地方法調(diào)用關(guān)聯(lián)事件,由用于對(duì)本地方法調(diào)用進(jìn)行性能測(cè)試的通用性能測(cè)試模板生成性能測(cè)試模板副本;將對(duì)所述本地方法調(diào)用進(jìn)行性能測(cè)試所需的信息填寫到所述性能測(cè)試模板副本中的相應(yīng)位置;以及改變代碼執(zhí)行流程,以便執(zhí)行所述性能測(cè)試模板副本。2.根據(jù)權(quán)利要求1所述的方法,其中,所述性能測(cè)試模板副本包括在開始所述本地方法調(diào)用之前進(jìn)行性能測(cè)試的入口模板副本,該入口模板副本用于執(zhí)行對(duì)所述本地方法調(diào)用的入口性能測(cè)試;以及調(diào)用所述本地方法。3.根據(jù)權(quán)利要求2所述的方法,其中,所述執(zhí)行對(duì)所述本地方法調(diào)用的入口性能測(cè)試包括保存寄存器狀態(tài);對(duì)性能測(cè)試開關(guān)進(jìn)行判定、記錄本地方法調(diào)用的次數(shù)以及執(zhí)行自定義的入口性能測(cè)試方法中的一種或多種;以及恢復(fù)寄存器狀態(tài)。4.根據(jù)權(quán)利要求1所述的方法,其中,所述性能測(cè)試模板副本包括在完成本地方法調(diào)用后進(jìn)行性能測(cè)試的出口模板副本,其中,所述本地方法調(diào)用的返回地址在執(zhí)行本地方法調(diào)用之前被替換為所述出口模板副本的地址,以便在完成本地方法的調(diào)用后執(zhí)行所述出口模板副本,以及其中,所述出口模板副本用于執(zhí)行對(duì)本地方法調(diào)用的出口性能測(cè)試;以及恢復(fù)所述本地方法調(diào)用的返回地址,以便在執(zhí)行所述出口模板副本之后,返回至調(diào)用所述本地方法的調(diào)用方法。5.根據(jù)權(quán)利要求4所述的方法,其中,所述執(zhí)行對(duì)所述本地方法調(diào)用的入口性能測(cè)試進(jìn)一步包括記錄所述本地方法調(diào)用的開始時(shí)間;以及執(zhí)行對(duì)本地方法調(diào)用的出口性能測(cè)試進(jìn)一步包括記錄所述本法方法調(diào)用的結(jié)束時(shí)間。6.根據(jù)權(quán)利要求4所述的方法,其中,所述執(zhí)行對(duì)本地方法調(diào)用的出口性能測(cè)試進(jìn)一步包括保存寄存器狀態(tài);執(zhí)行自定義的出口性能測(cè)試方法;以及恢復(fù)寄存器狀態(tài)。7.根據(jù)權(quán)利要求1至6任一項(xiàng)所述的方法,其中對(duì)所述本地方法調(diào)用進(jìn)行性能測(cè)試所需的信息包括以下一個(gè)或多個(gè)本地方法的地址;存儲(chǔ)本地方法的返回地址的地址;性能測(cè)試模板副本的地址;性能測(cè)試開關(guān)的地址;存儲(chǔ)性能測(cè)試的各項(xiàng)信息的地址;用于本地方法的索引;自定義的入口性能測(cè)試方法的地址;以及自定義的出口性能測(cè)試方法的地址。8.根據(jù)權(quán)利要求1所述的方法,所述本地方法調(diào)用關(guān)聯(lián)事件是Java虛擬機(jī)工具接口所提供的本地方法綁定事件。9.根據(jù)權(quán)利要求8所述的方法,其中,通過將所述本地方法綁定事件的新地址參數(shù)設(shè)定為所述性能測(cè)試模板副本的地址,來(lái)改變代碼執(zhí)行流程。10.根據(jù)權(quán)利要求1或8所述的方法,其中,通過將所述本地方法的代碼的最開始字節(jié)修改為跳轉(zhuǎn)到所述性能測(cè)試模板副本的代碼,以及在開始本地方法調(diào)用之前恢復(fù)所述本地方法的代碼的最開始字節(jié),來(lái)改變代碼執(zhí)行流程。11.一種用于對(duì)本地方法調(diào)用進(jìn)行性能測(cè)試的裝置,包括副本生成裝置,用于響應(yīng)于本地方法調(diào)用關(guān)聯(lián)事件,由用于對(duì)本地方法調(diào)用進(jìn)行性能測(cè)試的通用性能測(cè)試模板生成性能測(cè)試模板副本;信息填寫裝置,用于將對(duì)所述本地方法調(diào)用進(jìn)行性能測(cè)試所需的信息填寫到所述性能測(cè)試模板副本中的相應(yīng)位置;以及流程改變裝置,用于改變代碼執(zhí)行流程,以便執(zhí)行所述性能測(cè)試模板副本。12.根據(jù)權(quán)利要求11所述的裝置,其中,所述性能測(cè)試模板副本包括在開始所述本地方法調(diào)用之前進(jìn)行性能測(cè)試的入口模板副本,該入口模板副本用于執(zhí)行對(duì)所述本地方法調(diào)用的入口性能測(cè)試;以及調(diào)用所述本地方法。13.根據(jù)權(quán)利要求12所述的裝置,其中,所述入口模板副本進(jìn)一步用于保存寄存器狀態(tài);對(duì)性能測(cè)試開關(guān)進(jìn)行判定、記錄本地方法調(diào)用的次數(shù)以及執(zhí)行自定義的入口性能測(cè)試方法中的一種或多種;以及恢復(fù)寄存器狀態(tài)。14.根據(jù)權(quán)利要求11所述的裝置,其中,所述性能測(cè)試模板副本包括在完成本地方法調(diào)用后進(jìn)行性能測(cè)試的出口模板副本,其中,所述本地方法調(diào)用的返回地址在執(zhí)行本地方法調(diào)用之前被替換為所述出口模板副本的地址,以便在完成本地方法的調(diào)用后執(zhí)行所述出口模板副本,以及其中,所述出口模板副本用于執(zhí)行對(duì)本地方法調(diào)用的出口性能測(cè)試;以及恢復(fù)所述本地方法調(diào)用的返回地址,以便在執(zhí)行所述出口模板副本之后,返回至調(diào)用所述本地方法的調(diào)用方法。15.根據(jù)權(quán)利要求14所述的裝置,其中,所述入口模板副本進(jìn)一步用于記錄所述本地方法調(diào)用的開始時(shí)間;以及所述出口模板副本進(jìn)一步用于記錄所述本法方法調(diào)用的結(jié)束時(shí)間。16.根據(jù)權(quán)利要求14所述的裝置,其中,所述出口模板副本進(jìn)一步用于保存寄存器狀態(tài);執(zhí)行自定義的出口性能測(cè)試方法;以及恢復(fù)寄存器狀態(tài)。17.根據(jù)權(quán)利要求11至16中任一項(xiàng)所述的裝置,其中對(duì)所述本地方法調(diào)用進(jìn)行性能測(cè)試所需的信息包括以下一個(gè)或多個(gè)本地方法的地址;存儲(chǔ)本地方法的返回地址的地址;性能測(cè)試模板副本的地址;性能測(cè)試開關(guān)的地址;存儲(chǔ)性能測(cè)試的各項(xiàng)信息的地址;用于本地方法的索引;自定義的入口性能測(cè)試方法的地址;以及自定義的出口性能測(cè)試方法的地址。18.根據(jù)權(quán)利要求ll所述的裝置,所述本地方法調(diào)用關(guān)聯(lián)事件是Java虛擬機(jī)工具接口所提供的本地方法綁定事件。19.根據(jù)權(quán)利要求18所述的裝置,其中,所述流程改變裝置用于通過將所述本地方法綁定事件的新地址參數(shù)設(shè)定為所述性能測(cè)試模板副本的地址,來(lái)改變代碼執(zhí)行流程。20.根據(jù)權(quán)利要求11或18所述的裝置,其中,所述流程改變裝置用于通過將所述本地方法的代碼的最開始字節(jié)修改為至所述性能測(cè)試模板副本的跳轉(zhuǎn),以及在開始本地方法調(diào)用之前恢復(fù)所述本地方法的代碼的最開始字節(jié),來(lái)改變代碼執(zhí)行流程。全文摘要本發(fā)明提供了一種用于對(duì)本地方法調(diào)用進(jìn)行性能測(cè)試的方法和裝置。所述方法包括響應(yīng)于本地方法調(diào)用關(guān)聯(lián)事件,由用于對(duì)本地方法調(diào)用進(jìn)行性能測(cè)試的通用性能測(cè)試模板生成性能測(cè)試模板副本;將對(duì)所述本地方法調(diào)用進(jìn)行性能測(cè)試所需的信息填寫到所述性能測(cè)試模板副本中的相應(yīng)位置;以及改變代碼執(zhí)行流程,以便執(zhí)行所述性能測(cè)試模板副本。根據(jù)本發(fā)明,在本地方法被調(diào)用時(shí),通過在匯編級(jí)別將性能測(cè)試模板副本動(dòng)態(tài)地插入在執(zhí)行路徑中,來(lái)實(shí)現(xiàn)對(duì)本地方法的性能測(cè)試。因此,相對(duì)于現(xiàn)有技術(shù)而言,本發(fā)明不需要針對(duì)每個(gè)本地方法提供關(guān)聯(lián)代理,具有很高的可行性,并且?guī)缀跷磳?duì)系統(tǒng)性能造成任何影響。文檔編號(hào)G06F11/36GK101782868SQ20091000324公開日2010年7月21日申請(qǐng)日期2009年1月21日優(yōu)先權(quán)日2009年1月21日發(fā)明者滕啟明,王峰,王海川,鐘虓申請(qǐng)人:國(guó)際商業(yè)機(jī)器公司