一種Java對象分配優(yōu)化方法、裝置及設(shè)備的制造方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及計(jì)算機(jī)技術(shù)領(lǐng)域,尤其是涉及一種Java對象分配優(yōu)化方法、裝置及系 統(tǒng)。
【背景技術(shù)】
[0002] Java是一種可以撰寫跨平臺應(yīng)用軟件的面向?qū)ο蟮某绦蛟O(shè)計(jì)語言。Java技術(shù)具有 卓越的通用性、高效性、平臺移植性和安全性,廣泛應(yīng)用于個人PC、數(shù)據(jù)中心、游戲控制臺、 科學(xué)超級計(jì)算機(jī)、移動電話和互聯(lián)網(wǎng)。
[0003] Java平臺結(jié)構(gòu)組成如圖1所示,包括Java編程語言,主要涉及Java的編程語法; Java文件格式,主要包括各類java的目錄、文件及后綴等;Java應(yīng)用程序接口; Java虛擬機(jī), 主要包括Java bytecode的編譯優(yōu)化、加載、解釋及運(yùn)行、管理等模塊。其中Java四個模塊之 間的關(guān)系如圖2所示。編寫Java代碼(.java文件),然后將之編譯成字節(jié)碼(.class文件)。最 后字節(jié)碼被裝入內(nèi)存,字節(jié)碼進(jìn)入虛擬機(jī),該字節(jié)碼就會被Java解釋器解釋執(zhí)行,或者是被 即時代碼編譯器器有選擇的轉(zhuǎn)換成機(jī)器碼執(zhí)行。Java平臺由Java虛擬機(jī)和Java應(yīng)用程序接 口搭建,Java語言則是進(jìn)入這個平臺的通道,用Java語言編寫并編譯的程序可以運(yùn)行在這 個平臺上。在Java程序運(yùn)行時,Java代碼中某些對象調(diào)用后可能不再繼續(xù)使用,有些對象調(diào) 用后仍然會被再次調(diào)用。通常情況下,采用逃逸分析技術(shù),識別出可能不再繼續(xù)使用的對 象,然后采用標(biāo)量替換或函數(shù)復(fù)制棧上分配的方法對該些分析得到的對象進(jìn)行優(yōu)化。但是 這兩種方式有很多缺陷:
[0004] 首先,標(biāo)量替換的方式僅適合小對象,符合條件的場景少,會額外參加函數(shù)參數(shù), 變量格式。其次,函數(shù)復(fù)制棧上分配的方式,對象較多時需要復(fù)制多份函數(shù),會導(dǎo)致代碼體 積膨脹較大,并且僅適合小函數(shù)。多層次的函數(shù)調(diào)用,需要復(fù)制調(diào)用棧中的多個函數(shù)。
[0005] 由上述可知,通常情況下對Java對象分配優(yōu)化的方式局限性較強(qiáng)、需要占用較多 的處理資源。
【發(fā)明內(nèi)容】
[0006] 本發(fā)明提供了一種Java對象分配優(yōu)化方法、裝置及設(shè)備,用于解決對Java對象分 配優(yōu)化的方式局限性較強(qiáng)、需要占用較多的處理資源的問題。
[0007] 第一方面,提供了一種Java對象分配優(yōu)化方法,包括:在運(yùn)行的Java代碼中,確定 所述Java代碼中存在對應(yīng)關(guān)系的被調(diào)用函數(shù)和調(diào)用函數(shù);將所述被調(diào)用函數(shù)中的非逃逸的 Java對象,轉(zhuǎn)存到與所述被調(diào)用函數(shù)對應(yīng)的調(diào)用函數(shù)的函數(shù)棧中分配。
[0008] 結(jié)合第一方面,在第一方面的第一種可能的實(shí)現(xiàn)方式中,確定所述Java代碼中存 在對應(yīng)關(guān)系的被調(diào)用函數(shù)和調(diào)用函數(shù),包括:在所述Java代碼中,根據(jù)Java函數(shù)的方法標(biāo)識 Me thod ID,確定存在對應(yīng)關(guān)系的被調(diào)用函數(shù)和調(diào)用函數(shù)。
[0009] 結(jié)合第一方面或第一方面的第一種可能的實(shí)現(xiàn)方式,在第一方面的第二種可能的 實(shí)現(xiàn)方式中,將所述被調(diào)用函數(shù)中的非逃逸的Java對象,轉(zhuǎn)存到與所述被調(diào)用用函數(shù)對應(yīng) 的調(diào)用函數(shù)的函數(shù)棧中分配,包括:若所述被調(diào)用函數(shù)中的非逃逸的Java對象的數(shù)量大于 第一設(shè)定值時,將被調(diào)用次數(shù)大于第二設(shè)定值的非逃逸的Java對象存儲在函數(shù)棧中分配。
[0010] 結(jié)合第一方面的第二種可能的實(shí)現(xiàn)方式,在第一方面的第三種可能的實(shí)現(xiàn)方式 中,還包括:將被調(diào)用次數(shù)小于第二設(shè)定值的非逃逸的Java對象存儲在堆中分配。
[0011] 結(jié)合第一方面至第一方面的第三種可能的實(shí)現(xiàn)方式中的任一一種可能的實(shí)現(xiàn)方 式,在第一方面的第四種可能的實(shí)現(xiàn)方式中,還包括:將除所述非逃逸的Java對象之外的其 它Java對象存儲在堆中分配。
[0012] 第二方面,提供了一種Java對象分配優(yōu)化裝置,包括:確定模塊,用于在運(yùn)行的 Java代碼中,確定所述Java代碼中存在對應(yīng)關(guān)系的被調(diào)用函數(shù)和調(diào)用函數(shù);執(zhí)行模塊,用于 將所述被調(diào)用函數(shù)中的非逃逸的Java對象,轉(zhuǎn)存到與所述被調(diào)用函數(shù)對應(yīng)的調(diào)用函數(shù)的函 數(shù)棧中分配。
[0013] 結(jié)合第二方面,在第二方面的第一種可能的實(shí)現(xiàn)方式中,所述確定模塊,具體用于 在所述Java代碼中,根據(jù)Java函數(shù)的方法標(biāo)識MethodID,確定存在對應(yīng)關(guān)系的被調(diào)用函數(shù) 和調(diào)用函數(shù)。
[0014] 結(jié)合第二方面或第二方面的第一種可能的實(shí)現(xiàn)方式,在第二方面的第二種可能的 實(shí)現(xiàn)方式中,所述執(zhí)行模塊,具體用于若所述被調(diào)用函數(shù)中的非逃逸的Java對象的數(shù)量大 于第一設(shè)定值時,將被調(diào)用次數(shù)大于第二設(shè)定值的非逃逸的Java對象存儲在函數(shù)棧中分 配。
[0015] 結(jié)合第二方面的第二種可能的實(shí)現(xiàn)方式,在第二方面的第三種可能的實(shí)現(xiàn)方式 中,所述執(zhí)行模塊,還用于將被調(diào)用次數(shù)小于第二設(shè)定值的非逃逸的Java對象存儲在堆中 分配。
[0016] 結(jié)合第二方面至第二方面的第三種可能的實(shí)現(xiàn)方式中的任一一種可能的實(shí)現(xiàn)方 式,在第二方面的第四種可能的實(shí)現(xiàn)方式中,所述執(zhí)行模塊,還用于將除所述非逃逸的Java 對象之外的其它Java對象存儲在堆中分配。
[0017] 第三方面,提供了一種Java對象分配優(yōu)化設(shè)備,包括:存儲器,用于存儲Java代碼, 虛擬機(jī),用于運(yùn)行Java代碼,在運(yùn)行的Java代碼中,確定所述Java代碼中存在對應(yīng)關(guān)系的被 調(diào)用函數(shù)和調(diào)用函數(shù);將所述被調(diào)用函數(shù)中的非逃逸的Java對象,轉(zhuǎn)存到與所述被調(diào)用函 數(shù)對應(yīng)的調(diào)用函數(shù)的函數(shù)棧中分配。
[0018] 結(jié)合第三方面,在第三方面的第一種可能的實(shí)現(xiàn)方式中,所述虛擬機(jī),具體用于在 所述Java代碼中,根據(jù)Java函數(shù)的方法標(biāo)識MethodID,確定存在對應(yīng)關(guān)系的被調(diào)用函數(shù)和 調(diào)用函數(shù)。
[0019] 結(jié)合第三方面或第三方面的第一種可能的實(shí)現(xiàn)方式,在第三方面的第二種可能的 實(shí)現(xiàn)方式中,所述虛擬機(jī),具體用于若所述被調(diào)用函數(shù)中的非逃逸的Java對象的數(shù)量大于 第一設(shè)定值時,將被調(diào)用次數(shù)大于第二設(shè)定值的非逃逸的Java對象存儲在函數(shù)棧中分配。
[0020] 結(jié)合第三方面的第二種可能的實(shí)現(xiàn)方式,在第三方面的第三種可能的實(shí)現(xiàn)方式 中,所述虛擬機(jī),還用于將被調(diào)用次數(shù)小于第二設(shè)定值的非逃逸的Java對象存儲在堆中分 配。
[0021] 結(jié)合第三方面至第三方面的第三種可能的實(shí)現(xiàn)方式中的任一一種可能的實(shí)現(xiàn)方 式,在第三方面的第四種可能的實(shí)現(xiàn)方式中,所述虛擬機(jī),還用于將除所述非逃逸的Java對 象之外的其它Java對象存儲在堆中分配。
[0022]通過采用上述技術(shù)方案,在運(yùn)行的Java代碼中,確定Java代碼中存在對應(yīng)關(guān)系的 被調(diào)用函數(shù)和調(diào)用函數(shù);將被調(diào)用函數(shù)中的非逃逸的Java對象,轉(zhuǎn)存到與被調(diào)用函數(shù)對應(yīng) 的調(diào)用函數(shù)的函數(shù)棧中分配,這樣可以較好地解決對Java對象分配優(yōu)化的方式局限性較 強(qiáng)、需要占用較多的處理資源的問題。
【附圖說明】
[0023]圖1為Java平臺結(jié)構(gòu)組成示意圖;
[0024]圖2為Java四個模塊之間的關(guān)系示意圖;
[0025]圖3為本發(fā)明實(shí)施例中提出的Java代碼運(yùn)行的Java平臺結(jié)構(gòu)組成示意圖;
[0026] 圖4為本發(fā)明實(shí)施例中提出的Java對象分配優(yōu)化方法流程圖;
[0027] 圖5為本發(fā)明實(shí)施例中提出的對象逃逸分析示意圖;
[0028] 圖6為本發(fā)明實(shí)施例中提出的對象分配架構(gòu)示意圖;
[0029] 圖7為本發(fā)明實(shí)施例中,提出的Java對象分配優(yōu)化裝置結(jié)構(gòu)組成示意圖;
[0030] 圖8為本發(fā)明實(shí)施例中,提出的Java對象分配優(yōu)化設(shè)備機(jī)構(gòu)組成示意圖。
【具體實(shí)施方式】
[0031] Java代碼的運(yùn)行環(huán)境中,Java代碼中的所有Java對象只能放在堆中,這就導(dǎo)致了 較多不需要的Java對象回收問題,本發(fā)明實(shí)施例提出的技術(shù)方案中,針對該問題,通過對 Java代碼進(jìn)行靜態(tài)分析,確定出非逃逸的Java對象和逃逸的Java對象,將不同的Java對象 做出不同的存儲,從而實(shí)現(xiàn)節(jié)省處理資源的目的。
[0032] 在本發(fā)明實(shí)施例提出的技術(shù)方案中,通過逃逸分析優(yōu)化的方式,確定出非逃逸的 Java對象和逃逸的Java對象,將非逃逸的Java對象存儲在函數(shù)棧中存儲進(jìn)行分配。
[0033]其中在本發(fā)明實(shí)施例提出的技術(shù)方案中,函數(shù)棧,是用于臨時存儲Java函數(shù)內(nèi)局 部變量的空間,但是該Java函數(shù)執(zhí)行完畢之后,存儲該Java函數(shù)的??臻g會立即釋放。堆是 用于存儲新創(chuàng)建的Java對象,在堆中,存儲的Java對象執(zhí)行完畢后不會立即釋放存儲該 Java對象的空間。
[0034]下面將結(jié)合各個附圖對本發(fā)明實(shí)施例技術(shù)方案的主要實(shí)現(xiàn)原理、【具體實(shí)施方式】及 其對應(yīng)能夠達(dá)到的有益效果進(jìn)行詳細(xì)地闡述。
[0035]本發(fā)明實(shí)施例提出一種Java對象分配優(yōu)化的系統(tǒng),如圖3所示,Java代碼運(yùn)行的 Java平臺結(jié)構(gòu)組成示意圖,Java虛擬機(jī)(JVM)是整個系統(tǒng)的核心的位置,是程序與底層操作 系統(tǒng)和硬件無關(guān)的關(guān)鍵。JVM的下方是移植接口,移植接口由兩部分組成:適配器和Java操 作系統(tǒng),其中依賴于平臺的部分稱為適配器;JVM通過移植接口在具體的平臺和操作系統(tǒng)上 實(shí)現(xiàn);在JVM的上方是Java的基本類庫和擴(kuò)展類庫以及它們的API,利用Java API編寫的應(yīng) 用程序(application)和小程序(Java applet)可以在任何Java平臺上運(yùn)行而無需考慮底 層平臺,就是因?yàn)橛蠮ava虛擬機(jī)(JVM)實(shí)現(xiàn)了程序與操作系統(tǒng)的分離,從而實(shí)現(xiàn)了Java的平 臺無關(guān)性。
[0036]基于圖3所示的系統(tǒng)架構(gòu),本發(fā)明實(shí)施例提出一種Java對象分配優(yōu)化方法,如圖4 所示,其具體處理流程如下述:
[0037] 步驟41,在運(yùn)行的Java代碼中,確定Java代碼中的非逃逸的Java對象。
[0038] 通過逃逸分析技術(shù),在運(yùn)行的Java代碼中,確定Java代碼中的非逃逸的Java對象 和逃逸的Java對象。
[0039] 舉一例進(jìn)行詳細(xì)闡述,具體示例Java代碼如下述所示:
[0040]
[0041 ] 針對上述Java代碼,經(jīng)過逃逸技術(shù)分析后,如圖5所示,確定Java對象v3對象在 Java函數(shù)Caller 1中是非逃逸的Java對象。
[0042]步驟42,確定Java代碼中的被調(diào)用函數(shù)和調(diào)用函數(shù)。
[0043] 仍以上述Java代碼為例,在上述Java代碼中,Callee函數(shù)是被調(diào)用函數(shù),Caller函 數(shù)是調(diào)用函數(shù)。
[0044]步驟43,將被調(diào)用函數(shù)中的非逃逸的Java對象,轉(zhuǎn)存到與被調(diào)用函數(shù)對應(yīng)的調(diào)用 函數(shù)的函數(shù)棧中分配。
[0045]本發(fā)明實(shí)施例提出的技術(shù)方案中,具體實(shí)施時,可以在被調(diào)用函數(shù)Callee函數(shù)中 插入的一段代碼,來實(shí)現(xiàn)上述步驟41~步驟43的處理流程。
[0046] 可選地,在上述步驟43之前,步驟42之后,還可以包括:
[0047]根據(jù)Java函數(shù)的方法標(biāo)識(MethodID),確定被調(diào)用函數(shù)對應(yīng)的調(diào)用函數(shù)。
[0048] 例如,如圖6所示,假設(shè)調(diào)用函數(shù)Cal 1 er 1需