專利名稱:用于定位java程序的瓶頸的方法和設(shè)備的制作方法
技術(shù)領(lǐng)域:
本發(fā)明一般涉及計算機領(lǐng)域。更具體地說,本發(fā)明涉及一種用于檢測并定位Java 程序的瓶頸的方法和設(shè)備。
背景技術(shù):
Java語言是是一種可以編寫跨平臺應(yīng)用軟件的面向?qū)ο蟮某绦蛟O(shè)計語言。Java 不同于一般的編譯執(zhí)行計算機語言(諸如C語言)和解釋執(zhí)行計算機語言(諸如HTML)。 它首先將源代碼編譯成字節(jié)碼(bytecode),然后依賴各種不同平臺上的Java虛擬機(JVM) 來解釋執(zhí)行字節(jié)碼,從而實現(xiàn)了 “一次編譯、到處執(zhí)行”的跨平臺特性。如今,Java已經(jīng)成為企業(yè)應(yīng)用程序的主流開發(fā)語言,理解Java線程如何工作是非常重要的。尤其當一個企業(yè)應(yīng)用程序無法良好地利用下層的硬件服務(wù)器時,就需要找出在 CPU利用率低的情況下一些應(yīng)用程序線程仍然被阻塞的原因。不過,Java應(yīng)用程序具有如下性質(zhì)在硬件和應(yīng)用程序代碼之間存在許多層,這些層包括但不限于硬件層、操作系統(tǒng)層 (也稱作本地層)、Java虛擬機層、中間件層以及應(yīng)用程序?qū)?。由于上述的原因,如果發(fā)現(xiàn)CPU的利用率低,難以在Java源代碼中找到問題所在。 但是應(yīng)用程序開發(fā)者恰恰需要定位Java源代碼中的問題從而能夠解決該問題。例如,圖IA示出了 JVM層的線程狀態(tài),我們發(fā)現(xiàn)很多應(yīng)用程序線程在Java虛擬機層是可運行的,并且在Java虛擬機層不存在明顯的問題。但是,圖IB示出了本地層中的、 與JVM層的線程對應(yīng)的線程的狀態(tài),如圖IB所示,存在許多的線程阻塞。因此,Java應(yīng)用程序開發(fā)者需要弄清楚在CPU利用率低的情況下線程為什么被阻塞以及源代碼中的哪個地方導(dǎo)致了發(fā)生該問題。在現(xiàn)有技術(shù)中,已經(jīng)存在很多監(jiān)視及瓶頸分析工具。下面舉例說明現(xiàn)有技術(shù)中存在的各種工具。例如,存在一種本地瓶頸分析工具,該瓶頸分析工具查看執(zhí)行棧中的一層以定位瓶頸。這種本地層瓶頸分析工具例如包括LockStat,該LockStat提供針對鎖的統(tǒng)計結(jié)果。 這種瓶頸分析工具的缺點在于對于例如鎖的每種資源,均需要一種專用的工具,這導(dǎo)致對于本地層的多種資源,需要很多的專用工具對每種資源進行監(jiān)視和分析。此外,這種瓶頸分析工具只能在本地層即操作系統(tǒng)層中進行監(jiān)視,而無法將在本地層中發(fā)生的事件與Java 源代碼的相應(yīng)部分聯(lián)系起來。此外,存在一種篩選工具,該篩選工具跨越多層架構(gòu)的各層進行查找以定位可疑的瓶頸。這種篩選工具主要用于多層架構(gòu)的Web開發(fā)框架,其示例為哥倫比亞大學(xué)Watson 實驗室的WAIT。所述多層架構(gòu)典型地包括Web層、應(yīng)用層以及數(shù)據(jù)庫層。這種篩選工具僅能在該多層框架結(jié)構(gòu)中識別引起可以瓶頸的節(jié)點(即硬件服務(wù)器)。因此,這種篩選工具識別的是包含多個節(jié)點的系統(tǒng)中導(dǎo)致瓶頸的節(jié)點,但是并不能在源代碼中定位瓶頸。此外,目前還存在Java運行時監(jiān)視工具,諸如jstack和JFluid。該jstack工具可以進行運行時棧分析,但是這種工具具有顯著的性能開銷,甚至?xí)蓴_應(yīng)用程序的行為。而JFluid工具監(jiān)控與特定資源相關(guān)的所有函數(shù)調(diào)用,這種工具同樣具有顯著的性能開銷,因為即使有些函數(shù)調(diào)用與線程阻塞并無關(guān)聯(lián),JFluid仍會記錄所有的函數(shù)調(diào)用。此外,jstack 和JFluid屬于JVM層的監(jiān)控工具,它們對JVM層中的瓶頸進行監(jiān)視,但是無法監(jiān)視位于JVM 層之下的本地層中的線程狀 態(tài)。
發(fā)明內(nèi)容
現(xiàn)有技術(shù)的各種工具都不能實現(xiàn)根據(jù)本地層中的瓶頸找出Java源代碼中引起該瓶頸的精確位置的功能。因此,需要提供一種能夠?qū)⒈镜貙又械钠款i鏈接回Java源代碼的有效方法。為了解決上述問題,本發(fā)明的主要目的是提供一種用于檢測并定位Java程序的瓶頸的方法和設(shè)備。該方法和設(shè)備能夠?qū)⒈镜貙又械钠款i鏈接回Java源代碼。此外,該方法和設(shè)備沒有明顯的性能開銷,不會對目標應(yīng)用程序的正常運行產(chǎn)生不利影響。根據(jù)本發(fā)明的一方面,提供了一種用于定位Java程序的瓶頸的方法,包括以下步驟在對應(yīng)于所述Java程序的Java進程中創(chuàng)建輔助線程,并將所述輔助線程掛接到在該Java進程中創(chuàng)建的Java虛擬機;在操作系統(tǒng)內(nèi)核中插入探測器;所述探測器監(jiān)視所述 Java進程中的Java線程在操作系統(tǒng)內(nèi)核中的狀態(tài)并且響應(yīng)于檢測到Java線程被阻塞而向所述輔助線程發(fā)送信號;以及所述輔助線程響應(yīng)于接收到來自操作系統(tǒng)內(nèi)核的所述信號, 從所述JVM中取回調(diào)用棧信息,并利用所取回的調(diào)用棧信息定位到所述Java程序的源代碼中的引起所述阻塞位置。根據(jù)本發(fā)明的另一方面,提供了一種用于定位Java程序的瓶頸的設(shè)備,包括用于在對應(yīng)于所述Java程序的Java進程中創(chuàng)建輔助線程,并將所述輔助線程掛接到在該 Java進程中創(chuàng)建的Java虛擬機的裝置;用于在操作系統(tǒng)內(nèi)核中插入探測器的裝置;用于由所述探測器監(jiān)視所述Java進程中的Java線程在操作系統(tǒng)內(nèi)核中的狀態(tài)并且響應(yīng)于檢測到 Java線程被阻塞而向所述輔助線程發(fā)送信號的裝置;以及用于在所述輔助線程響應(yīng)于接收到來自操作系統(tǒng)內(nèi)核的所述信號從所述JVM中取回調(diào)用棧信息,并利用所取回的調(diào)用棧信息定位到所述Java程序的源代碼中的引起所述阻塞的位置的裝置。采用本發(fā)明的上述設(shè)備和方法,能夠?qū)⒈镜貙又械钠款i準確地鏈接回Java源代碼,即找到引起所述本地層中的瓶頸的Java源代碼的相應(yīng)位置。因此,上述設(shè)備和方法能夠在JVM層中沒有任何指示的情況下,找到Java線程狀態(tài)改變的原因。此外,上述方法是獨立且自足的方法,不需要其它的監(jiān)視器或工具的幫助。另外,上述設(shè)備和方法沒有明顯的性能開銷,不會對目標應(yīng)用程序的正常運行產(chǎn)生不利影響。
以下通過結(jié)合附圖閱讀參考下述對說明性實施例的詳細描述,將更好地理解本發(fā)明本身、實施方式、其它目的及其優(yōu)點。在附圖中圖IA和圖IB示出了 JVM層的線程狀態(tài)和本地層的線程狀態(tài)之間的差別;圖2是示出本發(fā)明的總體發(fā)明構(gòu)思的示意圖;圖3示出了根據(jù)本發(fā)明的一個實施例的方法流程;圖4是示出了用戶空間中的Java線程和內(nèi)核空間中的本地任務(wù)之間的關(guān)系的示意圖;圖5是示出了圖3中的步驟320的處理的一個示例的示意圖;圖6是示出了圖3中的步驟340的處理的一個示例的示意圖;以及圖7是示出了在四核處理器的情況下的輔助線程示例的示意圖?,F(xiàn)在參照附圖描述優(yōu)選方法和系統(tǒng),其中,在附圖中相同的附圖標號用來指相同的部件。在下面的描述中,為了解釋的目的,闡述大量特定的細節(jié),以便幫助完全了解系統(tǒng)及方法等。在其它的例子中,為了簡化描述,以框圖的形式示出常用的結(jié)構(gòu)和裝置。對于本領(lǐng)域技術(shù)人員來說,可以想到很多修改和其它實施例,同時擁有在說明書和附圖中所教導(dǎo)的益處。因此,應(yīng)該理解,本發(fā)明不局限于所公開的特定實施例,另外可選的實施例應(yīng)當包含在本發(fā)明的范圍和范例發(fā)明構(gòu)思內(nèi)。雖然本文采用了一些特定術(shù)語,但是僅僅為了一般的描述意義而非限制目的使用它們。
具體實施例方式以下將參照附圖對本發(fā)明的具體實施方式
進行詳細說明。在以下的說明中,術(shù)語 “內(nèi)核空間”和“用戶空間”是針對操作系統(tǒng)的內(nèi)核而言的。在本發(fā)明中,操作系統(tǒng)可以是諸如Unix、Linux以及Windows的各種操作系統(tǒng)。為了簡單起見,在本發(fā)明中,僅以Linux作為操作系統(tǒng)的示例。但是本領(lǐng)域的技術(shù)人員應(yīng)該明白,本發(fā)明的方法和設(shè)備同樣適用于其它操作系統(tǒng)。Linux的虛擬地址空間為0至4G。Linux內(nèi)核將這4G字節(jié)的空間分為兩部分。將最高的IG字節(jié)(從虛擬地址OxCOOOOOOO到OxFFFFFFFF)供內(nèi)核使用,稱為“內(nèi)核空間”。 而將較低的3G字節(jié)(從虛擬地址0x00000000到OxBFFFFFFF)供各個進程使用,稱為“用戶空間”。因為每個進程可以通過系統(tǒng)調(diào)度進入內(nèi)核,因此,Linux內(nèi)核由系統(tǒng)內(nèi)的所有進程共享。內(nèi)核空間中存放的是內(nèi)核代碼和數(shù)據(jù),而進程的用戶空間中存放的是用戶程序的代碼和數(shù)據(jù)。圖2是示出本發(fā)明的總體發(fā)明構(gòu)思的示意圖。在本發(fā)明中,在作為監(jiān)視目標的 Java進程中創(chuàng)建輔助線程,并且在操作系統(tǒng)的調(diào)度器中插入探測器。當該探測器檢測到該 Java進程中的線程被阻塞時,向所述輔助線程發(fā)送用戶定義的信號,接收到該用戶定義的信號的輔助線程到JVM的棧中取回此時的調(diào)用棧信息,從而可以定位到Java源代碼中的精確位置。這樣就實現(xiàn)了將本地層中的瓶頸準確地鏈接回Java源代碼。參照圖3,本發(fā)明提供了一種用于檢測并定位Java程序的瓶頸的方法。圖3示出了根據(jù)本發(fā)明的一個實施例的方法流程300,包括如下步驟步驟310 創(chuàng)建輔助線程,并將其掛接到JVM。步驟320 在操作系統(tǒng)內(nèi)核中插入探測器。步驟330 探測器監(jiān)視Java線程并且在Java線程被阻塞時向輔助線程發(fā)送信號。步驟340 輔助線程接收信號,從JVM中取回調(diào)用棧信息并利用該信息定位到Java 源代碼中的對應(yīng)位置。這里需要說明的是,Java程序在被運行時表現(xiàn)為用戶空間中的進程。JVM對應(yīng)于一個獨立運行的Java程序,即對應(yīng)于一個Java進程。當啟動一個Java程序時,一個JVM 實例就被啟動起來了,任何一個擁有public static void main (String[]args)函數(shù)的類都可以作為Java程序運行的起點在JVM上運行。下面詳細描述本發(fā)明的方法流程300中的各個步驟。步驟310 創(chuàng)津輔助線稈,并將其梓接到TVM 在步驟310中,在對應(yīng)于所述Java程序的Java進程中創(chuàng)建輔助線程,并將所述輔助線程掛接到在該Java進程中創(chuàng)建的Java虛擬機。例如,可以通過Java虛擬機工具接口(JVMTI)提供的回調(diào)機制來創(chuàng)建輔助線程, 并且通過Java本地接口(JNI)提供的方法將創(chuàng)建的輔助線程掛接到JVM上。JVMTI可以用來監(jiān)控JVM的一些行為。JNI是為了擴展Java標準類庫以使之支持依賴于平臺的特性而提供的接口。JNI接口允許以較低級的語言實現(xiàn)代碼的一部分,然后令Java應(yīng)用程序來調(diào)用這些以較低級語言編寫的函數(shù)。具體地說,在JVM啟動初始化完成的位置設(shè)置回調(diào)函數(shù)。例如,利用JVMTI,通過以下代碼來啟動響應(yīng)虛擬機初始化事件的回調(diào)函數(shù)機制。jvmtiEventCallbacks callbacks ;//聲明memset(&callbacks,0, sizeof (callbacks)) ;//初始化callbacks. VMInit = &vmlnit ;//編寫的回調(diào)函數(shù)的入口jvmti- > SetEventCallbacks (&callbacks,sizeof (callbacks)) ;// 完成設(shè)置jvmti- > SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_VM_INIT, NULL) ;//啟用對虛擬機初始化事件的通知上述代碼的功能是把程序員自己編寫的回調(diào)函數(shù)vmlnitO的地址賦值給 jvmtiEventCalIbacks類型的callbacks結(jié)構(gòu)的變量VMInit,該變量表示在虛擬機初始化事件發(fā)生時調(diào)用的回調(diào)函數(shù)的入口。通過調(diào)用SetEventCalIbacksO方法完成設(shè)置,并且通過調(diào)用SetEventNotificationModeO方法啟動對虛擬機初始化事件的通知,完成了回調(diào)函數(shù)vmlnitO的設(shè)置。這樣,當虛擬機初始化時,回調(diào)函數(shù)vmlnitO就會被執(zhí)行。要注意的是,為了便于說明,在本文中,不對公知方法或函數(shù)的參數(shù)進行描述,例如只簡單將其表示為function ()。而對于用戶自定義的函數(shù),由于其參數(shù)可以由用戶任意定義,因此也省略對這種函數(shù)的參數(shù)的定義和描述。本領(lǐng)域技術(shù)人員通過這種描述完全能夠知道如何實現(xiàn)本發(fā)明的方法。在回調(diào)函數(shù)vmlnit ()中,調(diào)用JVMTI的RunAgentThread ()方法創(chuàng)建新的輔助線程。這里,需要說明的是,在一個創(chuàng)建了 JVM的進程中,并不是所有線程都能夠直接使用JVM。為了區(qū)別于創(chuàng)建的輔助線程,Java進程中的對應(yīng)于Java應(yīng)用程序的線程在本文中被稱為“Java應(yīng)用線程”,而Java應(yīng)用線程和輔助線程統(tǒng)稱為Java線程。Java應(yīng)用線程能夠直接訪問JVM,而輔助線程不能直接訪問JVM。這就需要通過JOT接口提供的 AttachCurrentThreadO方法將當前的輔助線程掛接(attach)到JVM環(huán)境上。進行上述掛接的目的是為了使輔助線程能夠?qū)崿F(xiàn)對JVM中的棧的訪問。為了使輔助線程能夠?qū)€程阻塞事件進行快速反應(yīng),需要將輔助線程設(shè)置為高的調(diào)度優(yōu)先級。在描述步驟320之前,需要對用戶空間中的Java線程和內(nèi)核空間中的對應(yīng)線程 (這里稱為本地任務(wù)(native task))之間的關(guān)系進行描述。Java線程的調(diào)用棧位于用戶空間中的JVM內(nèi),而本地任務(wù)的調(diào)用棧位于內(nèi)核空間中。當一個Java進程通過系統(tǒng)調(diào)度進入內(nèi)核時,其Java線程在內(nèi)核中對應(yīng)于一個本地任務(wù),該本地任務(wù)被內(nèi)核的調(diào)度器調(diào)度進入處理器而執(zhí)行。當一個Java進程存在多個Java應(yīng)用線程時,這些Java應(yīng)用線程分別對應(yīng)于內(nèi)核中的一個本地任務(wù),并且在上述的步驟310中創(chuàng)建的輔助線程同樣對應(yīng)于內(nèi)核中的一個本地任務(wù)。如圖4所示。圖4是示出了用戶空間中的Java線程和內(nèi)核空間中的本地任務(wù)之間的關(guān)系的示意圖。在圖4中,示例性地示出了三個Java應(yīng)用線程以及創(chuàng)建的輔助線程。 Java應(yīng)用線程1至Java應(yīng)用線程1分別對應(yīng)于本地任務(wù)1至本地任務(wù)3,輔助線程對應(yīng)于本地任務(wù)4。Java線程在用戶空間中通過Java線程ID進行識別,但是本地任務(wù)在內(nèi)核空間中通過本地任務(wù)ID進行識別。此外,在JVM中有每個Java線程的對應(yīng)棧。當在內(nèi)核空間中檢測到一個本地任務(wù)(例如本地任務(wù)2)被阻塞時,需要知道在用戶空間中與之對應(yīng)的 Java線程(例如Java應(yīng)用線程2),從而能夠訪問該Java線程的在JVM中的調(diào)用棧。為了實現(xiàn)上述目的,可以在每個Java線程啟動時,通過回調(diào)函數(shù)建立該Java線程和操作系統(tǒng)內(nèi)核中的對應(yīng)于該Java線程的本地任務(wù)之間的映射關(guān)系。具體地說,與步驟 310類似,在JVM啟動時設(shè)置 回調(diào)函數(shù)。例如,利用JVMTI,通過以下代碼來啟動響應(yīng)線程啟動事件的回調(diào)函數(shù)機制。jvmtiEventCallbacks callbacks ;//聲明memset(&callbacks,0, sizeof (callbacks)) ;//初始化callbacks. ThreadStart = &threadStart ;// 編寫的回調(diào)函數(shù)的入口jvmti- > SetEventCallbacks (&callbacks,sizeof (callbacks)) ;// 完成設(shè)置jvmti- > SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_THREAD_ START, NULL) ;//啟用對線程啟動事件的通知上述代碼的功能是把程序員自己編寫的回調(diào)函數(shù)threadStart ()的地址賦值給 jvmtiEventCal lbacks類型的cal Ibacks結(jié)構(gòu)的變量ThreadStart,該變量表示在線程啟動事件發(fā)生時調(diào)用的回調(diào)函數(shù)的入口。通過調(diào)用SetEventCalIbacksO方法完成設(shè)置,并且通過調(diào)用SetEventNotificationModeO方法啟動對線程啟動事件的通知,完成了回調(diào)函數(shù)threadStart ()的設(shè)置。這樣,當Java線程啟動時,回調(diào)函數(shù)threadStart ()就會被執(zhí)行。在回調(diào)函數(shù)threadStart ()中,首先調(diào)用操作系統(tǒng)內(nèi)核提供的系統(tǒng)調(diào)用函數(shù),例如gettidO,獲得當前Java線程的在內(nèi)核空間中對應(yīng)的本地任務(wù)的ID,即本地任務(wù)ID。然后,再調(diào)用JNI提供的機制,獲得當前線程在JVM中的ID,即Java線程ID。然后,將獲得的本地任務(wù)ID和Java線程ID相關(guān)聯(lián)地存儲到如圖4所示的映射數(shù)據(jù)庫中。通過上述方式, 每當有線程啟動時,該線程都會調(diào)用回調(diào)函數(shù)threadStart ()將其在用戶空間的Java線程 ID與其在內(nèi)核空間的本地任務(wù)ID之間的映射關(guān)系存儲起來。下面的表1示出了在圖4的情況下建立的映射關(guān)系的可能的例子。表 1
本地任務(wù)ID Java線程ID 圖4中的對應(yīng)線程 5893 應(yīng)用線程權(quán)利要求
1.一種用于定位Java程序的瓶頸的方法,包括以下步驟在對應(yīng)于所述Java程序的Java進程中創(chuàng)建輔助線程,并將所述輔助線程掛接到在該 Java進程中創(chuàng)建的Java虛擬機JVM ;在操作系統(tǒng)內(nèi)核中插入探測器;所述探測器監(jiān)視所述Java進程中的Java線程在操作系統(tǒng)內(nèi)核中的狀態(tài)并且響應(yīng)于檢測到Java線程被阻塞而向所述輔助線程發(fā)送信號;以及所述輔助線程響應(yīng)于接收到來自操作系統(tǒng)內(nèi)核的所述信號,從所述JVM中取回調(diào)用棧信息,并利用所取回的調(diào)用棧信息定位到所述Java程序的源代碼中的引起所述阻塞的位置。
2.根據(jù)權(quán)利要求1所述的方法,其中,在執(zhí)行所述Java程序的處理器是多核處理器的情況下,創(chuàng)建多個所述輔助線程。
3.根據(jù)權(quán)利要求2所述的方法,其中,創(chuàng)建的多個所述輔助線程的數(shù)目與多核處理器的核數(shù)目相同。
4.根據(jù)權(quán)利要求3所述的方法,其中,創(chuàng)建的多個所述輔助線程中的每一個被分別綁定到多核處理器的一個核。
5.根據(jù)權(quán)利要求1所述的方法,還包括響應(yīng)于每個Java線程的啟動,通過回調(diào)函數(shù)建立該Java線程和操作系統(tǒng)內(nèi)核中的對應(yīng)于該Java線程的本地任務(wù)之間的映射關(guān)系。
6.根據(jù)權(quán)利要求5所述的方法,其中,所述信號包含被阻塞的本地任務(wù)的ID,并且其中,從所述JVM中取回調(diào)用棧信息包括根據(jù)本地任務(wù)的ID和所述映射關(guān)系,從所述JVM中取回與該本地任務(wù)對應(yīng)的Java線程的調(diào)用棧信息。
7.根據(jù)權(quán)利要求1所述的方法,其中,所述探測器被插入在操作系統(tǒng)的調(diào)度器中并且在發(fā)生任務(wù)上下文切換的情況下執(zhí)行操作。
8.根據(jù)權(quán)利要求7所述的方法,其中,所述探測器是被加載到操作系統(tǒng)內(nèi)核中的用戶自定義的模塊插入到所述調(diào)度器中的。
9.根據(jù)權(quán)利要求7或8所述的方法,其中,響應(yīng)于檢測到Java線程被阻塞而向所述輔助線程發(fā)送信號包括如果在處理器執(zhí)行任務(wù)上下文切換的情況下從處理器調(diào)出的本地任務(wù)對應(yīng)于所述Java進程中的Java線程并且該本地任務(wù)處于阻塞狀態(tài),則由所述探測器向所述輔助線程發(fā)送信號。
10.一種用于定位Java程序的瓶頸的設(shè)備,包括用于在對應(yīng)于所述Java程序的Java進程中創(chuàng)建輔助線程,并將所述輔助線程掛接到在該Java進程中創(chuàng)建的Java虛擬機JVM的裝置;用于在操作系統(tǒng)內(nèi)核中插入探測器的裝置;用于由所述探測器監(jiān)視所述Java進程中的Java線程在操作系統(tǒng)內(nèi)核中的狀態(tài)并且響應(yīng)于檢測到Java線程被阻塞而向所述輔助線程發(fā)送信號的裝置;以及用于在所述輔助線程響應(yīng)于接收到來自操作系統(tǒng)內(nèi)核的所述信號從所述JVM中取回調(diào)用棧信息,并利用所取回的調(diào)用棧信息定位到所述Java程序的源代碼中的引起所述阻塞的位置的裝置。
11.根據(jù)權(quán)利要求10所述的設(shè)備,其中,在執(zhí)行所述Java程序的處理器是多核處理器的情況下,所述用于在對應(yīng)于所述Java程序的Java進程中創(chuàng)建輔助線程,并將所述輔助線程掛接到在該Java進程中創(chuàng)建的Java虛擬機JVM的裝置創(chuàng)建多個所述輔助線程。
12.根據(jù)權(quán)利要求11所述的設(shè)備,其中,創(chuàng)建的多個所述輔助線程的數(shù)目與多核處理器的核數(shù)目相同。
13.根據(jù)權(quán)利要求12所述的設(shè)備,其中,創(chuàng)建的多個所述輔助線程中的每一個被分別綁定到多核處理器的一個核。
14.根據(jù)權(quán)利要求10所述的設(shè)備,還包括用于響應(yīng)于每個Java線程的啟動,通過回調(diào)函數(shù)建立該Java線程和操作系統(tǒng)內(nèi)核中的對應(yīng)于該Java線程的本地任務(wù)之間的映射關(guān)系的裝置。
15.根據(jù)權(quán)利要求14所述的設(shè)備,其中,所述信號包含被阻塞的本地任務(wù)的ID,并且其中,所述用于在所述輔助線程響應(yīng)于接收到來自操作系統(tǒng)內(nèi)核的所述信號從所述JVM中取回調(diào)用棧信息,并利用所取回的調(diào)用棧信息定位到所述Java程序的源代碼中的引起所述阻塞的位置的裝置包括用于根據(jù)本地任務(wù)的ID和所述映射關(guān)系,從所述JVM中取回與該本地任務(wù)對應(yīng)的Java線程的調(diào)用棧信息的裝置。
16.根據(jù)權(quán)利要求10所述的設(shè)備,其中,所述探測器被插入在操作系統(tǒng)的調(diào)度器中并且在發(fā)生任務(wù)上下文切換的情況下執(zhí)行操作。
17.根據(jù)權(quán)利要求16所述的設(shè)備,其中,所述探測器是被加載到操作系統(tǒng)內(nèi)核中的用戶自定義的模塊插入到所述調(diào)度器中的。
18.根據(jù)權(quán)利要求16或17所述的設(shè)備,其中,所述用于由所述探測器監(jiān)視所述Java進程中的Java線程在操作系統(tǒng)內(nèi)核中的狀態(tài)并且響應(yīng)于檢測到Java線程被阻塞而向所述輔助線程發(fā)送信號的裝置包括用于在處理器執(zhí)行任務(wù)上下文切換的情況下從處理器調(diào)出的本地任務(wù)對應(yīng)于所述Java進程中的Java線程并且該本地任務(wù)處于阻塞狀態(tài)的情況下向所述輔助線程發(fā)送信號的裝置。
全文摘要
本發(fā)明涉及用于定位Java程序的瓶頸的方法和設(shè)備。提供了一種用于定位Java程序的瓶頸的方法,包括以下步驟在對應(yīng)于所述Java程序的Java進程中創(chuàng)建輔助線程,并將所述輔助線程掛接到在該Java進程中創(chuàng)建的Java虛擬機;在操作系統(tǒng)內(nèi)核中插入探測器;所述探測器監(jiān)視所述Java進程中的Java線程在操作系統(tǒng)內(nèi)核中的狀態(tài)并且響應(yīng)于檢測到Java線程被阻塞而向所述輔助線程發(fā)送信號;以及所述輔助線程響應(yīng)于接收到來自操作系統(tǒng)內(nèi)核的所述信號,從所述JVM中取回調(diào)用棧信息,并利用所取回的調(diào)用棧信息定位到所述Java程序的源代碼中的引起所述阻塞位置。
文檔編號G06F11/36GK102222037SQ201010150110
公開日2011年10月19日 申請日期2010年4月15日 優(yōu)先權(quán)日2010年4月15日
發(fā)明者李影, 滕啟明, 王海川, 鐘虓 申請人:國際商業(yè)機器公司