新四季網

Java虛擬機的編譯方法和Java虛擬的製造方法

2023-10-11 22:47:34 5

Java虛擬機的編譯方法和Java虛擬的製造方法
【專利摘要】本發明實施例提供了一種Java虛擬機的編譯方法和Java虛擬機,該方法包括:在Java虛擬機啟動對第一Java方法的編譯後根據該Java虛擬機的方法計數器總表獲取多個方法,該多個方法包括該第一Java方法,該方法計數器總表用於記錄該Java虛擬機的所有Java方法的方法計數器的當前值;並行啟動多個任務對該多個方法進行編譯,該多個任務中的每一個任務通過即時JIT編譯器編譯該多個方法之一;在該多個任務的編譯完成後刷新該方法計數器總表,並用該多個方法編譯後的本地代碼的指針替換該多個方法對應的方法入口。本發明實施例的JVM及其編譯方法,能夠以較低的成本提高JVM的編譯效率,優化JVM的性能。
【專利說明】Java虛擬機的編譯方法和Java虛擬機
【技術領域】
[0001]本發明實施例涉及計算機網絡領域,並且更具體地,涉及一種Java虛擬機的編譯方法和Java虛擬機。
【背景技術】
[0002]JAVA是目前用戶最多、使用範圍最廣的軟體開發技術,它擺脫了硬體平臺的束縛,實現了程序「一次編寫,到處運行」的理想。而在這期間,JAVA虛擬機(JVM)可謂功不可沒。
[0003]用戶編寫的JAVA程序,只需要在本地編譯成JAVA字節碼(.class文件)。然後該字節碼程序放在不同的平臺上執行時,由平臺上的Java虛擬機(Java Virtual Machine,JVM)將字節碼翻譯成與平臺相關的指令,運行在平臺上。正是因為有JVM實現了程序和作業系統的分離,從而實現了 JAVA的平臺無關性。
[0004]JVM包括解釋器(Interpreter)、即時(JIT)編譯器和運行時系統(Run Time)三部分。
[0005]JAVA程序最初由解釋器解釋執行,當JVM發現某個方法或代碼塊調用很頻繁時,就會用JIT將其編譯成和本地平臺相關的機器碼,並進行各種層次的優化,當執行該方法時直接調用本地代碼,以提高程序執行效率。
[0006]—種分布式JIT編譯的方法,由若干個計算節點(Computer Node)連網組成一個並行計算機(Parallel Computer),每個Computer Node上有程序觸發JIT編譯時會發出JIT編譯請求,然後應用管理裝置(Application Manager)響應請求,將該程序分成許多程序片段,通過全局聯合網絡(Global Combining Network)分發給其他Computer Node同時並行編譯。編譯完成後,將生成的本地代碼通過Global Combining Network傳給JIT請求的發出方,由此實現並行加速JIT編譯的目的。其缺點是需要很多電腦組網成一個Parallel Computer,數據通過 Global Combining Network 在 Computer Node 間傳輸,耗時較大,且分割、傳輸、收集數據較複雜。
[0007]另一種由JIT伺服器專門執行JIT編譯的方法,設立一個專用JIT編譯系統(Dedicated JIT Compilation System)伺服器。每個客戶端將需要JIT編譯的JAVA字節碼和客戶端的JAVA平臺信息通過網絡(Network)傳給伺服器,伺服器利用其強大的編譯功能將字節碼程序編譯成和客戶平臺相關的本地代碼,再將編好的本地代碼通過Network傳回客戶端。其缺點是需要設立專門的Dedicated JIT Compilation System伺服器,該伺服器的實現、控制比較複雜,並且數據需要在Network間傳輸,耗時較大。
[0008]需要一種優化JVM編譯的方法,能夠在提高編譯效率的同時避免較高的硬體成本。

【發明內容】

[0009]本發明實施例提供一種Java虛擬機的編譯方法和Java虛擬機,能夠以較低的成本提高Java虛擬機的編譯效率,優化Java虛擬機的性能。[0010]第一方面,提供了一種Java虛擬機的編譯方法,該方法包括:在Java虛擬機啟動對第一 Java方法的編譯後根據該Java虛擬機的方法計數器總表獲取多個方法,該多個方法包括該第一 Java方法,該方法計數器總表用於記錄該Java虛擬機的所有Java方法的方法計數器的當前值;並行啟動多個任務對該多個方法進行編譯,該多個任務中的每一個任務通過即時JIT編譯器編譯該多個方法之一;在該多個任務的編譯完成後刷新該方法計數器總表,並用該多個方法編譯後的本地代碼的指針替換該多個方法對應的方法入口。
[0011]結合第一方面,在第一種可能的實現方式中,根據該Java虛擬機的方法計數器總表獲取多個方法具體實現為:獲取該方法計數器總表中的所有方法。
[0012]結合第一方面,在第二種可能的實現方式中,根據該Java虛擬機的方法計數器總表獲取多個方法具體實現為:獲取該方法計數器總表的所有方法中的前N個熱點方法,N大於1,且N小於該方法計數器總表的所有方法的個數。
[0013]結合第一方面或第一方面的第一種可能的實現方式或第一方面的第二種可能的實現方式,在第三種可能的實現方式中,並行啟動多個任務對該多個方法進行編譯具體實現為:將該多個方法中的每一個方法的字節碼程序壓入該Java虛擬機所在主機的GPU的一個Kernel中,以使得該Kernel執行的JIT編譯器對壓入該Kernel的方法進行編譯,其中該Kernel在創建時被設置為執行該Java虛擬機的JIT編譯器。
[0014]結合第一方面或第一方面的第一種可能的實現方式或第一方面的第二種可能的實現方式,在第四種可能的實現方式中,並行啟動多個任務對該多個方法進行編譯具體實現為:根據該多個方法,將該多個方法中每一個方法的字節碼作為參數開啟該Java虛擬機所在主機的CPU的一個新線程,該新線程用於調用JIT編譯器編譯方法。
[0015]結合第一方面或第一方面的第一種可能的實現方式至第一方面的第四種可能的實現方式中任一種可能的實現方式,在第五種可能的實現方式中,該方法還包括:在該並行啟動多個任務對該多個方法進行編譯的過程中,並行以解釋方式執行該第一 Java方法。
[0016]結合第一方面或第一方面的第一種可能的實現方式至第一方面的第四種可能的實現方式中任一種可能的實現方式,在第六種可能的實現方式中,該方法還包括:在該並行啟動多個任務對該多個方法進行編譯的過程中,停止以解釋方式執行該第一 Java方法。
[0017]結合第一方面或第一方面的第一種可能的實現方式至第一方面的第六種可能的實現方式中任一種可能的實現方式,在第七種可能的實現方式中,該方法還包括:在該多個任務的編譯完成後刷新該方法計數器總表,並用該多個方法編譯後的本地代碼的指針替換該多個方法對應的方法入口之前,對該多個任務進行線程同步,該線程同步操作用於控制該多個任務的編譯操作都完成後再執行以後的步驟。
[0018]第二方面,提供了一種Java虛擬機,包括解釋器、編譯器和運行期系統,該編譯器包括即時JIT編譯器,該Java虛擬機還包括並行編譯單元,獲取單元和更新單元,其中:該獲取單元用於在該Java虛擬機啟動對第一 Java方法的編譯後,根據該Java虛擬機的方法計數器總表獲取多個方法,該多個方法包括該第一 Java方法,該方法計數器總表用於記錄該Java虛擬機的所有Java方法的方法計數器的當前值;該並行編譯單元用於並行啟動多個任務對該多個方法進行編譯,該多個任務中的每一個任務通過JIT編譯器編譯該多個方法之一;該更新單元用於在該多個任務的編譯完成後刷新該方法計數器總表,並用該多個方法編譯後的本地代碼的指針替換該多個方法對應的方法入口。[0019]結合第二方面,在第一種可能的實現方式中,具體實現為:該獲取單元具體用於獲取該方法計數器總表中的所有方法。
[0020]結合第二方面,在第二種可能的實現方式中,具體實現為:該獲取單元具體用於獲取該方法計數器總表的所有方法中的前N個熱點方法,N大於1,且N小於該方法計數器總表的所有方法的個數。
[0021]結合第二方面或第二方面的第一種可能的實現方式或第二方面的第二種可能的實現方式,在第三種可能的實現方式中,具體實現為:該並行編譯單元具體用於將該多個方法中的每一個方法的字節碼程序壓入該Java虛擬機所在主機的GPU的一個Kernel中,,以使得該Kernel執行的JIT編譯器對壓入該Kernel的方法進行編譯,其中該Kernel在創建時被設置為執行該Java虛擬機的JIT編譯器。
[0022]結合第二方面或第二方面的第一種可能的實現方式或第二方面的第二種可能的實現方式,在第四種可能的實現方式中,具體實現為:該並行編譯單元具體用於根據該多個方法,將該多個方法中每一個方法的字節碼作為參數開啟該Java虛擬機所在主機的CPU的一個新線程,該新線程用於調用JIT編譯器編譯方法。
[0023]結合第二方面或第二方面的第一種可能的實現方式至第二方面的第四種可能的實現方式中任一種可能的實現方式,在第五種可能的實現方式中,具體實現為:該Java虛擬機還包括並行控制單元,用於在該並行啟動多個任務對該多個方法進行編譯的過程中,還通過該解釋器並行以解釋方式執行該第一 Java方法。
[0024]結合第二方面或第二方面的第一種可能的實現方式至第二方面的第四種可能的實現方式中任一種可能的實現方式,在第六種可能的實現方式中,具體實現為:該Java虛擬機還包括並行控制單元,用於在該並行啟動多個任務對該多個方法進行編譯的過程中,停止該解釋器以解釋方式執行該第一 Java方法。
[0025]結合第二方面或第二方面的第一種可能的實現方式至第二方面的第六種可能的實現方式中任一種可能的實現方式,在第七種可能的實現方式中,具體實現為:該Java虛擬機還包括同步單元,該同步單元用於通過對該多個任務進行同步操作,控制該更新單元在該多個任務的編譯完成後再執行更新操作。
[0026]基於以上技術方案,本發明實施例的Java虛擬機的編譯方法和Java虛擬機,通過啟動多個任務並行編譯Java程序的多個方法,從而能夠以較低的成本提高Java虛擬機的編譯效率,優化Java虛擬機的性能。
【專利附圖】

【附圖說明】
[0027]為了更清楚地說明本發明實施例的技術方案,下面將對實施例或現有技術描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本發明的一些實施例,對於本領域普通技術人員來講,在不付出創造性勞動的前提下,還可以根據這些附圖獲得其他的附圖。
[0028]圖1是本發明實施例JVM的編譯方法流程圖。
[0029]圖2是本發明實施例JVM編譯方法的一個具體流程圖。
[0030]圖3是本發明實施例JVM編譯方法的另一個具體流程圖。
[0031]圖4是本發明實施例JVM編譯方法的再一個具體流程圖。[0032]圖5是本發明實施例JVM編譯方法的再一個具體流程圖。
[0033]圖6是本發明實施例JVM的結構示意圖。
[0034]圖7是本發明實施例JVM的另一結構示意圖。
【具體實施方式】
[0035]下面將結合本發明實施例中的附圖,對本發明實施例中的技術方案進行清楚、完整地描述,顯然,所描述的實施例是本發明一部分實施例,而不是全部的實施例。基於本發明中的實施例,本領域普通技術人員在沒有作出創造性勞動前提下所獲得的所有其他實施例,都屬於本發明保護的範圍。
[0036]為了方便理解本發明實施例,首先在此介紹本發明實施例描述中會引入的幾個要素。
[0037]現有系統中,JVM可包括解釋器、編譯器和運行期系統。其中,編譯器包括JIT編譯器。
[0038]解釋器,用於使得運行期系統以解釋方式執行JVM的方法。
[0039]JIT編譯器,用於在執行時即時將JVM的方法的字節碼編譯成本地代碼(NativeCode),使得運行期系統以本地代碼執行JVM的方法。
[0040]運行期系統,用於執行Java的方法。
[0041]實際上,JVM還可包括類加載器等,但這與本發明的方法無關,對此不作描述。
[0042]開放運算語言(Open Computing Language, OpenCL),—個面向異構系統通用目的並行編程的開放式、免費標準,也是一個統一的編程環境,便於軟體開發人員為高性能計算伺服器、桌面計算系統、手持設備編寫高效輕便的代碼。
[0043]字節碼(Byte-code ),一種包含執行程序、由一序列op代碼/數據對組成的二進位文件。字節碼是一種中間碼,比機器碼更抽象,經常被看作是包含一個執行程序的二進位文件,更像一個對象模型。
[0044]線程:線程有時被稱為輕量級進程(Lightweight Process, LWP),是程序執行流的最小單元。一個標準的線程由線程ID,當前指令指針(PC),寄存器集合和堆棧組成。
[0045]圖形處理器(Graphic Processing Unit, GPU),是顯示卡的「心臟」,相當於CPU在電腦中的作用,它決定了該顯卡的檔次和大部分性能,同時也是2D顯示卡和3D顯示卡的區別依據。
[0046]開放運算語言(Open Computing Language, 0PENCL)是一個為異構平臺編寫程序的框架,此異構平臺可由CPU,GPU或其他類型的處理器組成。OPENCL由一門用於編寫kernels (在OPENCL設備上運行的函數)的語言(基於C99)和一組用於定義並控制平臺的API組成。OPENCL提供了基於任務分割和數據分割的並行計算機制。
[0047]圖1是本發明實施例JVM的編譯方法流程圖,圖1的方法由JVM執行。
[0048]101,在Java虛擬機啟動對第一 Java方法的編譯後,根據JVM的方法計數器總表獲取多個方法。
[0049]其中,該多個方法包括第一 Java方法,該方法計數器總表用於記錄該Java虛擬機的所有Java方法的方法計數器的當前值。
[0050]102,並行啟動多個任務對該多個方法進行編譯。[0051]其中,該多個任務中的每一個任務通過JVM的即時JIT編譯器編譯該多個方法之
O
[0052]103,在該多個任務的編譯完成後刷新該方法計數器總表,並用該多個方法編譯後的本地代碼的指針替換該多個方法對應的方法入口。
[0053]本發明實施例中,通過啟動多個任務並行編譯Java程序的多個方法,能夠以較低的成本提高JVM的編譯效率,優化JVM的性能。
[0054]可選的,作為一個實施例,步驟101可實現為:獲取該方法計數器總表中的所有方法。
[0055]可選地,作為另一個實施例,步驟101可實現為:獲取該方法計數器總表的所有方法中的前N個熱點方法。其中,N大於1,且N小於該方法計數器總表的所有方法的個數。
[0056]可選地,作為一個實施例,步驟102可實現為:將該多個方法中的每一個方法的字節碼程序壓入該Java虛擬機所在主機的GPU的一個Kernel中,以使得一個Kernel中的JIT編譯器對壓入該Kernel的方法進行編譯。
[0057]可選地,作為另一個實施例,步驟102可實現為:根據該多個方法,將該多個方法中每一個方法的字節碼作為參數開啟CPU的一個新線程,該新線程用於調用JIT編譯器編譯方法。
[0058]可選地,作為一個實施例,該方法還包括:在該並行啟動多個任務對該多個方法進行編譯的過程中,並行以解釋方式執行該第一 Java方法。
[0059]可選地,作為另一個實施例,該方法還包括:在該並行啟動多個任務對該多個方法進行編譯的過程中,停止以解釋方式執行該第一 Java方法。
[0060]可選地,在步驟103之前,該方法還包括:對該多個任務進行同步操作。
[0061]其中,該同步操作用於控制該多個任務的編譯操作都完成後再執行以後的步驟。
[0062]下面,結合具體的實施例,對本發明實施例的方法作進一步的描述。
[0063]圖2是本發明實施例Java虛擬機編譯方法的一個具體流程圖。
[0064]201,JVM執行到第一 Java方法入口。
[0065]JVM的運行時系統執行到第一 Java的方法入口時,需要根據方法是否存在已編譯版本來確定需要執行的步驟。
[0066]需要注意的是,本發明實施例中,第一 Java方法可指代JVM中的任一個待執行的方法。
[0067]202,是否存在已編譯版本。
[0068]如果JVM發現第一 Java方法存在已編譯版本,則執行步驟213。
[0069]如果JVM發現第一 Java方法不存在已編譯版本,則執行步驟203。
[0070]203,方法調用計數器值加I。
[0071]第一 Java方法的方法調用計數器值加I。
[0072]204,判斷是否編譯第一 Java方法。
[0073]現有技術中,可通過多種方法判斷是否需要觸發第一 Java方法的編譯過程。
[0074]本發明實施例的一種判斷方式,可基於採樣的熱點探測判斷是否編譯第一 Java方法。JVM會周期性檢查各個線程的棧頂,如果發現第一 Java方法經常出現在棧頂,且達到預定的次數,那就認定第一 Java方法為需要編譯的熱點方法,進而發起向編譯器發起編譯請求。
[0075]本發明實施例的另一種判斷方式,可計數器的熱點探測判斷是否編譯第一 Java方法。如果Java方法的方法調用計數器(Invocation Counter)和回邊計數器(Back EdgeCounter)之和大於預定的閾值,則認定該Java方法為需要編譯的熱點方法,進而發起向編譯器發起編譯請求。
[0076]方法調用計數器,用於統計JVM所執行的進程中某個方法的調用次數。現有技術中,方法調用計數器並不是統計方法調用絕對次數,而是一個相對執行頻率,超過一定時間,如果方法調用次數不足以讓它提交給編譯器,則計數器就會被減少一半,這種現象稱為熱度衰減(Counter Decay),進行熱度衰減的動作是在垃圾回收時順便進行的,而這段時間就被稱為半衰周期。
[0077]回邊計數器用於統計方法中循環體的執行次數。字節碼遇到控制流向後跳轉的指令稱為回邊。
[0078]當然,還可能存在其它判斷是否進行編譯的方法,本發明實施例在此不作限制。
[0079]如果需要編譯第一 Java方法,則執行步驟205,否則,執行步驟214。
[0080]上述步驟201-204屬於本發明現有技術的內容,具體實現可參考現有技術,本發明實施例在此僅作簡單介紹。
[0081]205,向編譯器提交編譯請求。
[0082]當第一 Java方法觸發編譯條件後,JVM的運行期系統可向JVM的編譯器提交編譯請求。
[0083]JVM的編譯器接收到編譯請求後,可啟動編譯過程,執行步驟206。
[0084]同時,JVM還可並行地通過解釋器以解釋方式執行第一 Java方法,即並行執行步驟 214。
[0085]206,開啟 OpenCL 線程。
[0086]JVM的編譯器接收到編譯請求後,可開啟OpenCL線程,進行編譯。
[0087]207,根據方法計數器總表找到前N個熱點方法。
[0088]根據方法計數器總表,可以從JVM的方法區(Method Area)找到排在前N位的熱點方法。顯然,該前N個熱點方法必然包括第一 Java方法。
[0089]208,將前N個熱點方法的字節碼程序壓入GPU Kernel。
[0090]得到前N個熱點方法後,OpenCL線程可先在GPU內創建N個GPU Kernel,並將該前N個熱點方法中每一個方法的字節碼程序分別壓入N個GPU Kernel。其中,每一個GPUKernel設置為執行JIT編譯器。
[0091]需要注意的是,本發明實施例提到的GPU,是指支持異構處理的GPU,例如通用圖形處理器(General Purpose GPU, GPGPU)等,下同。
[0092]209,每個Kernel將各自的方法編譯成本地代碼。
[0093]210,線程同步。
[0094]進行線程同步,控制每個GPU Kernel都編譯完成後再執行計數器總表刷新。
[0095]211,刷新方法計數器總表。
[0096]編譯完成後,將已編譯方法的方法計數器置為0,包括將第一 Java方法的方法計數器置為O。[0097]212,用本地代碼指針替換方法入口。
[0098]此時,可對所有已編譯方法的方法入口進行指針替換,用編譯後的本地代碼替換對應的方法入口。
[0099]213,執行第一 Java方法編譯後的本地代碼版本。
[0100]編譯完成後,執行第一 Java方法編譯後的本地代碼版本。
[0101]執行完畢後,執行步驟215。
[0102]214,以解釋方式執行第一 Java方法。
[0103]當第一 Java方法未達到編譯條件時,可通過解釋器以解釋方式執行第一 Java方法。
[0104]當第一 Java方法達到編譯條件時,可在編譯的過程中,繼續以並行方式,通過解釋器以解釋方式執行第一 Java方法。
[0105]215,第一 Java 方法返回。
[0106]第一 Java方法運行完畢後,返回。
[0107]圖3是本發明實施例Java虛擬機編譯方法的另一個具體流程圖。
[0108]301,JVM執行到第一 Java方法入口。
[0109]JVM的運行時系統執行到第一 Java的方法入口時,需要根據方法是否存在已編譯版本來確定需要執行的步驟。
[0110]302,是否存在已編譯版本。
[0111]如果JVM發現第一 Java方法存在已編譯版本,則執行步驟313。
[0112]如果JVM發現第一 Java方法不存在已編譯版本,則執行步驟303。
[0113]303,方法調用計數器值加I。
[0114]第一 Java方法的方法調用計數器值加I。
[0115]304,判斷是否編譯第一 Java方法。
[0116]如果需要編譯第一 Java方法,則執行步驟305,否則,執行步驟314。
[0117]305,向編譯器提交編譯請求。
[0118]當第一 Java方法觸發編譯條件後,JVM的運行期系統可向JVM的編譯器提交編譯請求。
[0119]JVM的編譯器接收到編譯請求後,可啟動編譯過程,執行步驟306。
[0120]此時,JVM停止以解釋方式執行第一 Java方法。
[0121]306,開啟 OpenCL 線程。
[0122]JVM的編譯器接收到編譯請求後,可開啟OpenCL線程,進行編譯。
[0123]307,根據方法計數器總表找到前N個熱點方法。
[0124]根據方法計數器總表,可以從JVM的Method Area找到排在前N位的熱點方法。
[0125]308,將前N個熱點方法的字節碼程序壓入GPU Kernel。
[0126]得到前N個熱點方法後,OpenCL線程可先在GPU內創建N個GPU Kernel,並將該前N個熱點方法中每一個方法的字節碼程序分別壓入N個GPU Kernel中。其中,每一個GPU Kernel設置為執行JIT編譯器。
[0127]309,每個Kernel將各自的方法編譯成本地代碼。
[0128]310,線程同步。[0129]進行線程同步,控制每個GPU Kernel都編譯完成後再執行計數器總表刷新。
[0130]311,刷新方法計數器總表。
[0131]編譯完成後,將已編譯方法的方法計數器置為0,包括將第一 Java方法的
[0132]312,用本地代碼指針替換方法入口。
[0133]此時,可對所有已編譯方法的方法入口進行指針替換,用編譯後的本地代碼替換對應的方法入口。
[0134]313,執行第一 Java方法編譯後的本地代碼版本。
[0135]編譯完成後,執行第一 Java方法編譯後的本地代碼版本。
[0136]執行完畢後,執行步驟315。
[0137]314,以解釋方式執行第一 Java方法。
[0138]當第一 Java方法未達到編譯條件時,可通過解釋器以解釋方式執行第一 Java方法。
[0139]315,第一 Java 方法返回。
[0140]第一 Java方法運行完畢後,返回。
[0141]圖3所示實施例與圖2所示實施例的區別在於,編譯階段不再通過解釋器以解釋方式執行方法。
[0142]圖4是本發明實施例Java虛擬機編譯方法的再一個具體流程圖。
[0143]401,JVM執行到第一 Java方法入口。
[0144]JVM的運行時系統執行到第一 Java的方法入口時,需要根據方法是否存在已編譯版本來確定需要執行的步驟。
[0145]402,是否存在已編譯版本。
[0146]如果JVM發現第一 Java方法存在已編譯版本,則執行步驟412。
[0147]如果JVM發現第一 Java方法不存在已編譯版本,則執行步驟403。
[0148]403,方法調用計數器值加I。
[0149]第一 Java方法的方法調用計數器值加I。
[0150]404,判斷是否編譯第一 Java方法。
[0151]如果需要編譯第一 Java方法,則執行步驟405,否則,執行步驟413。
[0152]405,向編譯器提交編譯請求。
[0153]當第一 Java方法觸發編譯條件後,JVM的運行期系統可向JVM的編譯器提交編譯請求。
[0154]JVM的編譯器接收到編譯請求後,可啟動編譯過程,執行步驟406。
[0155]同時,JVM還可並行地通過解釋器以解釋方式執行第一 Java方法,即並行執行步驟 413。
[0156]406,開啟 OpenCL 線程。
[0157]JVM的編譯器接收到編譯請求後,可開啟OpenCL線程,進行編譯。
[0158]407,將所有方法的字節碼程序壓入GPU Kernel。
[0159]OpenCL線程可根據方法計數器總表的方法個數創建相應個數的GPUKernel,並將方法計數器總表中的所有方法的字節碼程序分別壓入GPUKernel中。其中,每一個GPUKernel設置為執行JIT編譯器。[0160]408,每個Kernel將各自的方法編譯成本地代碼。
[0161]409,線程同步。
[0162]進行線程同步,控制每個Kernel都編譯完成後再執行計數器總表刷新。
[0163]410,刷新方法計數器總表。
[0164]編譯完成後,將已編譯方法的方法計數器置為O,包括將第一 Java方法的
[0165]411,用本地代碼指針替換方法入口。
[0166]此時,可對所有已編譯方法的方法入口進行指針替換,用編譯後的本地代碼替換對應的方法入口。
[0167]412,執行第一 Java方法編譯後的本地代碼版本。
[0168]編譯完成後,執行第一 Java方法編譯後的本地代碼版本。
[0169]執行完畢後,執行步驟414。
[0170]413,以解釋方式執行第一 Java方法。
[0171]當第一 Java方法未達到編譯條件時,可通過解釋器以解釋方式執行第一 Java方法。
[0172]當第一 Java方法達到編譯條件時,可在編譯的過程中,繼續以並行方式,通過解釋器以解釋方式執行第一 Java方法。
[0173]414,第一 Java 方法返回。
[0174]第一 Java方法運行完畢後,返回。
[0175]圖4所示實施例與圖2所示實施例的區別在於,編譯階段對所有方法進行編譯。
[0176]圖5是本發明實施例Java虛擬機編譯方法的再一個具體流程圖。
[0177]501,JVM執行到第一 Java方法入口。
[0178]JVM的運行時系統執行到第一 Java的方法入口時,需要根據方法是否存在已編譯版本來確定需要執行的步驟。
[0179]502,是否存在已編譯版本。
[0180]如果JVM發現第一 Java方法存在已編譯版本,則執行步驟512。
[0181]如果JVM發現第一 Java方法不存在已編譯版本,則執行步驟503。
[0182]503,方法調用計數器值加I。
[0183]第一 Java方法的方法調用計數器值加I。
[0184]504,判斷是否編譯第一 Java方法。
[0185]如果需要編譯第一 Java方法,則執行步驟505,否則,執行步驟513。
[0186]505,向編譯器提交編譯請求。
[0187]當第一 Java方法觸發編譯條件後,JVM的運行期系統可向JVM的編譯器提交編譯請求。
[0188]JVM的編譯器接收到編譯請求後,可啟動編譯過程,執行步驟506。
[0189]同時,JVM還可並行地通過解釋器以解釋方式執行第一 Java方法,即並行執行步驟 513。
[0190]506,根據方法計數器總表找到前N個熱點方法。
[0191]根據方法計數器總表,可以從JVM的Method Area找到排在前N位的熱點方法。
[0192]507,開啟N個線程,調用JIT編譯器編譯前N個熱點方法。[0193]得到前N個熱點方法後,可開啟N個線程調用JIT編譯器,並將前N個熱點方法中每一個方法的字節碼程序作為參數傳入線程中。
[0194]508,每個線程將各自的方法編譯成本地代碼。
[0195]509,線程同步。
[0196]進行線程同步,控制每個線程都編譯完成後再執行計數器總表刷新。
[0197]510,刷新方法計數器總表。
[0198]編譯完成後,將已編譯方法的方法計數器置為O,包括將第一 Java方法的
[0199]511,用本地代碼指針替換方法入口。
[0200]此時,可對所有已編譯方法的方法入口進行指針替換,用編譯後的本地代碼替換對應的方法入口。
[0201]512,執行第一 Java方法編譯後的本地代碼版本。
[0202]編譯完成後,執行第一 Java方法編譯後的本地代碼版本。
[0203]執行完畢後,執行步驟514。
[0204]513,以解釋方式執行第一 Java方法。
[0205]當第一 Java方法未達到編譯條件時,可通過解釋器以解釋方式執行第一 Java方法。
[0206]當第一 Java方法達到編譯條件時,可在編譯的過程中,繼續以並行方式,通過解釋器以解釋方式執行第一 Java方法。
[0207]514,第一 Java 方法返回。
[0208]第一 Java方法運行完畢後,返回。
[0209]圖5所示實施例與圖2所示實施例的區別在於,編譯階段通過開啟多個線程調用JIT編譯器對方法進行編譯。
[0210]圖6是本發明實施例JVM600的結構示意圖。JTV600包括運行期系統610、解釋器620和編譯器630,其中編譯器630可包括JIT編譯器631。此外,如圖6所示,JTV600還可包括虛線區域640內的獲取單元641、並行編譯單元642和更新單元643。其中,虛線區域640內為新增的邏輯單元。
[0211]獲取單元641,用於根據該Java虛擬機的方法計數器總表獲取多個方法。
[0212]並行編譯單元642,用於並行啟動多個任務對該多個方法進行編譯。
[0213]其中,該多個任務中的每一個任務通過JIT編譯器631編譯該多個方法之一。
[0214]具體的,該任務可以是CPU中的線程,或者GPU中的Kernel。
[0215]更新單元643,用於在該多個任務的編譯完成後刷新該方法計數器總表,並用該多個方法編譯後的本地代碼的指針替換該多個方法中對應的方法入口。
[0216]本發明實施例中,JVM600通過啟動多個任務並行編譯Java程序的多個方法,能夠以較低的成本提高JVM的編譯效率,優化JVM的性能。
[0217]可選的,作為一個實施例,獲取單元641具體用於獲取該方法計數器總表中的所有方法。
[0218]可選地,作為另一個實施例,獲取單元641具體用於獲取該方法計數器總表的所有方法中的前N個熱點方法,N大於1,且N小於該方法計數器總表的所有方法的個數。
[0219]可選地,作為一個實施例,並行編譯單元642具體用於將該多個方法中的每一個方法的字節碼程序壓入該Java虛擬機所在主機的GPU的一個Kernel中,以使得一個Kernel中的JIT編譯器631對壓入該Kernel的方法進行編譯,其中Kernel在創建時被設置為執行JVM600的JIT編譯器631。
[0220]可選地,作為另一個實施例,並行編譯單元642具體用於根據該多個方法,將該多個方法中每一個方法的字節碼作為參數開啟該Java虛擬機所在主機的CPU的一個新線程,該新線程用於調用JVM600的JIT編譯器631編譯方法。
[0221]可選地,如圖7所示,JVM600還可包括並行控制單元644。可選地,作為一個實施例,並行控制單元644可用於在該並行啟動多個任務對該多個方法進行編譯的過程中,還通過該解釋器並行以解釋方式執行該第一 Java方法。可選地,作為另一個實施例,並行控制單元644可用於在該並行啟動多個任務對該多個方法進行編譯的過程中,停止該解釋器以解釋方式執行該第一 Java方法。
[0222]可選地,如圖7所示,JVM600還可包括同步單元645,用於通過對該多個任務進行同步操作,控制更新單元643在該多個任務的編譯完成後再執行更新操作。
[0223]JVM600還可執行圖1的方法,並具備JVM在圖1至圖5所示實施例的功能,具體實現可參考圖1至圖5所示實施例,本發明實施例在此不再贅述。
[0224]在具體的應用中,虛線區域640內的多個邏輯單元可以有多種具體實現方式。例如,該多個邏輯單元可以組合成一個並行調度模塊,作為一個與運行期系統、解釋器和編譯器類似的模塊存在於JVM中。或者,並行編譯單元642可以位於JVM的編譯器630中,其餘邏輯單元位於JVM的運行期系統610中,或者,所有邏輯模塊都位於JVM的運行期系統610中,所有邏輯模塊都位於JVM的編譯器630中,等等。具體的實現形式還可能有多種,本發明實施例不再 舉例。
[0225]本領域普通技術人員可以意識到,結合本文中所公開的實施例描述的各示例的單元及算法步驟,能夠以電子硬體、或者計算機軟體和電子硬體的結合來實現。這些功能究竟以硬體還是軟體方式來執行,取決於技術方案的特定應用和設計約束條件。專業技術人員可以對每個特定的應用來使用不同方法來實現所描述的功能,但是這種實現不應認為超出本發明的範圍。
[0226]所屬領域的技術人員可以清楚地了解到,為描述的方便和簡潔,上述描述的系統、裝置和單元的具體工作過程,可以參考前述方法實施例中的對應過程,在此不再贅述。
[0227]在本申請所提供的幾個實施例中,應該理解到,所揭露的系統、裝置和方法,可以通過其它的方式實現。例如,以上所描述的裝置實施例僅僅是示意性的,例如,所述單元的劃分,僅僅為一種邏輯功能劃分,實際實現時可以有另外的劃分方式,例如多個單元或組件可以結合或者可以集成到另一個系統,或一些特徵可以忽略,或不執行。另一點,所顯示或討論的相互之間的耦合或直接耦合或通信連接可以是通過一些接口,裝置或單元的間接耦合或通信連接,可以是電性,機械或其它的形式。
[0228]所述作為分離部件說明的單元可以是或者也可以不是物理上分開的,作為單元顯示的部件可以是或者也可以不是物理單元,即可以位於一個地方,或者也可以分布到多個網絡單元上。可以根據實際的需要選擇其中的部分或者全部單元來實現本實施例方案的目的。
[0229]另外,在本發明各個實施例中的各功能單元可以集成在一個處理單元中,也可以是各個單元單獨物理存在,也可以兩個或兩個以上單元集成在一個單元中。
[0230]所述功能如果以軟體功能單元的形式實現並作為獨立的產品銷售或使用時,可以存儲在一個計算機可讀取存儲介質中。基於這樣的理解,本發明的技術方案本質上或者說對現有技術做出貢獻的部分或者該技術方案的部分可以以軟體產品的形式體現出來,該計算機軟體產品存儲在一個存儲介質中,包括若干指令用以使得一臺計算機設備(可以是個人計算機,伺服器,或者網絡設備等)執行本發明各個實施例所述方法的全部或部分步驟。而前述的存儲介質包括:U盤、移動硬碟、只讀存儲器(ROM,Read-Only Memory)、隨機存取存儲器(RAM, Random Access Memory)、磁碟或者光碟等各種可以存儲程序代碼的介質。
[0231]以上所述,僅為本發明的【具體實施方式】,但本發明的保護範圍並不局限於此,任何熟悉本【技術領域】的技術人員在本發明揭露的技術範圍內,可輕易想到變化或替換,都應涵蓋在本發明的保護範圍之內。因此,本發明的保護範圍應所述以權利要求的保護範圍為準。
【權利要求】
1.一種Java虛擬機的編譯方法,其特徵在於,包括: 在Java虛擬機啟動對第一 Java方法的編譯後根據所述Java虛擬機的方法計數器總表獲取多個方法,所述多個方法包括所述第一 Java方法,所述方法計數器總表用於記錄所述Java虛擬機的所有Java方法的方法計數器的當前值; 並行啟動多個任務對所述多個方法進行編譯,所述多個任務中的每一個任務通過即時JIT編譯器編譯所述多個方法之一; 在所述多個任務的編譯完成後刷新所述方法計數器總表,並用所述多個方法編譯後的本地代碼的指針替換所述多個方法對應的方法入口。
2.如權利要求1所述的方法,其特徵在於,所述根據所述Java虛擬機的方法計數器總表獲取多個方法包括:獲取所述方法計數器總表中的所有方法。
3.如權利要求1所述的方法,其特徵在於,所述根據所述Java虛擬機的方法計數器總表獲取多個方法包括:獲取所述方法計數器總表的所有方法中的前N個熱點方法,N大於1,且N小於所述方法計數器總表的所有方法的個數。
4.如權利 要求1至3任一項所述的方法,其特徵在於,所述並行啟動多個任務對所述多個方法進行編譯包括:將所述多個方法中的每一個方法的字節碼程序壓入所述Java虛擬機所在主機的圖形處理器GPU的一個內核Kernel中,以使得所述Kernel執行的JIT編譯器對壓入所述Kernel的方法進行編譯,其中所述Kernel在創建時被設置為執行所述Java虛擬機的JIT編譯器。
5.如權利要求1至3任一項所述的方法,其特徵在於,所述並行啟動多個任務對所述多個方法進行編譯包括:根據所述多個方法,將所述多個方法中每一個方法的字節碼作為參數開啟所述Java虛擬機所在主機的中央處理器CPU的一個新線程,所述新線程用於調用JIT編譯器編譯方法。
6.如權利要求1至5任一項所述的方法,其特徵在於,所述方法還包括:在所述並行啟動多個任務對所述多個方法進行編譯的過程中,並行以解釋方式執行所述第一 Java方法。
7.如權利要求1至5任一項所述的方法,其特徵在於,所述方法還包括:在所述並行啟動多個任務對所述多個方法進行編譯的過程中,停止以解釋方式執行所述第一 Java方法。
8.如權利要求1至7任一項所述的方法,其特徵在於,在所述多個任務的編譯完成後刷新所述方法計數器總表,並用所述多個方法編譯後的本地代碼的指針替換所述多個方法對應的方法入口之前,所述方法還包括: 對所述多個任務進行同步操作,所述同步操作用於控制所述多個任務的編譯操作都完成後再執行以後的步驟。
9.一種Java虛擬機,包括解釋器、編譯器和運行期系統,所述編譯器包括即時JIT編譯器,其特徵在於,所述Java虛擬機還包括並行編譯單元,獲取單元和更新單元,其中: 所述獲取單元用於在所述Java虛擬機啟動對第一 Java方法的編譯後,根據所述Java虛擬機的方法計數器總表獲取多個方法,所述多個方法包括所述第一 Java方法,所述方法計數器總表用於記錄所述Java虛擬機的所有Java方法的方法計數器的當前值; 所述並行編譯單元用於並行啟動多個任務對所述多個方法進行編譯,所述多個任務中的每一個任務通過JIT編譯器編譯所述多個方法之一; 所述更新單元用於在所述多個任務的編譯完成後刷新所述方法計數器總表,並用所述多個方法編譯後的本地代碼的指針替換所述多個方法對應的方法入口。
10.如權利要求9所述的Java虛擬機,其特徵在於,所述獲取單元具體用於獲取所述方法計數器總表中的所有方法。
11.如權利要求9所述的Java虛擬機,其特徵在於,所述獲取單元具體用於獲取所述方法計數器總表的所有方法中的前N個熱點方法,N大於1,且N小於所述方法計數器總表的所有方法的個數。
12.如權利要求9至11任一項所述的Java虛擬機,其特徵在於,所述並行編譯單元具體用於將所述多個方法中的每一個方法的字節碼程序壓入所述Java虛擬機所在主機的圖形處理器GPU的一個內核Kernel中,以使得所述Kernel執行的JIT編譯器對壓入所述Kernel的方法進行編譯,其中所述Kernel在創建時被設置為執行所述Java虛擬機的JIT編譯器。
13.如權利要求9至11任一項所述的Java虛擬機,其特徵在於,所述並行編譯單元具體用於根據所述多個方法,將所述多個方法中每一個方法的字節碼作為參數開啟所述Java虛擬機所在主機的中央處理器CPU的一個新線程,所述新線程用於調用JIT編譯器編譯方法。
14.如權利要求9至13任一項所述的Java虛擬機,其特徵在於,所述Java虛擬機還包括並行控制單元,用於在所述並行啟動多個任務對所述多個方法進行編譯的過程中,還通過所述解釋器並行以解釋方式執行所述第一 Java方法。
15.如權利要求9至13任一項所述的Java虛擬機,其特徵在於,所述Java虛擬機還包括並行控制單元,用於在所述並行啟動多個任務對所述多個方法進行編譯的過程中,停止所述解釋器以解釋方式執行所述第一 Java方法。
16.如權利要求9至15任一項所述的Java虛擬機,其特徵在於,所述Java虛擬機還包括同步單元,所述同步單元用於通過對所述多個任務進行同步操作,控制所述更新單元在所述多個任務的編譯完成後再執行更新操作。
【文檔編號】G06F9/455GK103729235SQ201310722834
【公開日】2014年4月16日 申請日期:2013年12月24日 優先權日:2013年12月24日
【發明者】鮑翀, 王彥茹 申請人:華為技術有限公司

同类文章

一種新型多功能組合攝影箱的製作方法

一種新型多功能組合攝影箱的製作方法【專利摘要】本實用新型公開了一種新型多功能組合攝影箱,包括敞開式箱體和前攝影蓋,在箱體頂部設有移動式光源盒,在箱體底部設有LED脫影板,LED脫影板放置在底板上;移動式光源盒包括上蓋,上蓋內設有光源,上蓋部設有磨沙透光片,磨沙透光片將光源封閉在上蓋內;所述LED脫影

壓縮模式圖樣重疊檢測方法與裝置與流程

本發明涉及通信領域,特別涉及一種壓縮模式圖樣重疊檢測方法與裝置。背景技術:在寬帶碼分多址(WCDMA,WidebandCodeDivisionMultipleAccess)系統頻分復用(FDD,FrequencyDivisionDuplex)模式下,為了進行異頻硬切換、FDD到時分復用(TDD,Ti

個性化檯曆的製作方法

專利名稱::個性化檯曆的製作方法技術領域::本實用新型涉及一種檯曆,尤其涉及一種既顯示月曆、又能插入照片的個性化檯曆,屬於生活文化藝術用品領域。背景技術::公知的立式檯曆每頁皆由月曆和畫面兩部分構成,這兩部分都是事先印刷好,固定而不能更換的。畫面或為風景,或為模特、明星。功能單一局限性較大。特別是畫

一種實現縮放的視頻解碼方法

專利名稱:一種實現縮放的視頻解碼方法技術領域:本發明涉及視頻信號處理領域,特別是一種實現縮放的視頻解碼方法。背景技術: Mpeg標準是由運動圖像專家組(Moving Picture Expert Group,MPEG)開發的用於視頻和音頻壓縮的一系列演進的標準。按照Mpeg標準,視頻圖像壓縮編碼後包

基於加熱模壓的纖維增強PBT複合材料成型工藝的製作方法

本發明涉及一種基於加熱模壓的纖維增強pbt複合材料成型工藝。背景技術:熱塑性複合材料與傳統熱固性複合材料相比其具有較好的韌性和抗衝擊性能,此外其還具有可回收利用等優點。熱塑性塑料在液態時流動能力差,使得其與纖維結合浸潤困難。環狀對苯二甲酸丁二醇酯(cbt)是一種環狀預聚物,該材料力學性能差不適合做纖

一種pe滾塑儲槽的製作方法

專利名稱:一種pe滾塑儲槽的製作方法技術領域:一種PE滾塑儲槽一、 技術領域 本實用新型涉及一種PE滾塑儲槽,主要用於化工、染料、醫藥、農藥、冶金、稀土、機械、電子、電力、環保、紡織、釀造、釀造、食品、給水、排水等行業儲存液體使用。二、 背景技術 目前,化工液體耐腐蝕貯運設備,普遍使用傳統的玻璃鋼容

釘的製作方法

專利名稱:釘的製作方法技術領域:本實用新型涉及一種釘,尤其涉及一種可提供方便拔除的鐵(鋼)釘。背景技術:考慮到廢木材回收後再加工利用作業的方便性與安全性,根據環保規定,廢木材的回收是必須將釘於廢木材上的鐵(鋼)釘拔除。如圖1、圖2所示,目前用以釘入木材的鐵(鋼)釘10主要是在一釘體11的一端形成一尖

直流氧噴裝置的製作方法

專利名稱:直流氧噴裝置的製作方法技術領域:本實用新型涉及ー種醫療器械,具體地說是ー種直流氧噴裝置。背景技術:臨床上的放療過程極易造成患者的局部皮膚損傷和炎症,被稱為「放射性皮炎」。目前對於放射性皮炎的主要治療措施是塗抹藥膏,而放射性皮炎患者多伴有局部疼痛,對於止痛,多是通過ロ服或靜脈注射進行止痛治療

新型熱網閥門操作手輪的製作方法

專利名稱:新型熱網閥門操作手輪的製作方法技術領域:新型熱網閥門操作手輪技術領域:本實用新型涉及一種新型熱網閥門操作手輪,屬於機械領域。背景技術::閥門作為流體控制裝置應用廣泛,手輪傳動的閥門使用比例佔90%以上。國家標準中提及手輪所起作用為傳動功能,不作為閥門的運輸、起吊裝置,不承受軸向力。現有閥門

用來自動讀取管狀容器所載識別碼的裝置的製作方法

專利名稱:用來自動讀取管狀容器所載識別碼的裝置的製作方法背景技術:1-本發明所屬領域本發明涉及一種用來自動讀取管狀容器所載識別碼的裝置,其中的管狀容器被放在循環於配送鏈上的文檔匣或託架裝置中。本發明特別適用於,然而並非僅僅專用於,對引入自動分析系統的血液樣本試管之類的自動識別。本發明還涉及專為實現讀