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

一種使用寄生對(duì)象管理對(duì)象堆的方法和裝置制造方法

文檔序號(hào):6517716閱讀:231來(lái)源:國(guó)知局
一種使用寄生對(duì)象管理對(duì)象堆的方法和裝置制造方法
【專利摘要】本發(fā)明公開一種使用寄生對(duì)象管理對(duì)象堆的方法和裝置,通過(guò)使用寄生對(duì)象標(biāo)記對(duì)象堆中的空閑空間,并根據(jù)寄生對(duì)象在對(duì)象堆中為待創(chuàng)建對(duì)象申請(qǐng)空間,能夠有效地管理對(duì)象堆中的空閑空間,提高對(duì)象堆的空間利用率;在執(zhí)行完刪包或刪應(yīng)用操作后,以及在檢測(cè)到j(luò)ava卡應(yīng)用程序調(diào)用與垃圾回收對(duì)應(yīng)的預(yù)設(shè)API后,僅需要執(zhí)行一個(gè)空操作,而不再需要通過(guò)移動(dòng)對(duì)象堆中的已創(chuàng)建對(duì)象進(jìn)行垃圾回收,減少了對(duì)已創(chuàng)建對(duì)象的移動(dòng)次數(shù)以及移動(dòng)對(duì)象帶來(lái)的時(shí)間消耗,提高了Java卡虛擬機(jī)的工作效率,并在一定程度上達(dá)到磨損平衡。
【專利說(shuō)明】一種使用寄生對(duì)象管理對(duì)象堆的方法和裝置
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及計(jì)算機(jī)【技術(shù)領(lǐng)域】,特別是涉及一種使用寄生對(duì)象管理對(duì)象堆的方法和 裝直。
【背景技術(shù)】
[0002]現(xiàn)有技術(shù)中,Java卡虛擬機(jī)將已創(chuàng)建的對(duì)象存儲(chǔ)到對(duì)象堆中,在需要使用已創(chuàng)建的對(duì)象時(shí),從對(duì)象表中獲取該對(duì)象的引用值,并使用該引用值訪問對(duì)象堆中的該對(duì)象。Java卡虛擬機(jī)在創(chuàng)建新對(duì)象時(shí),為新對(duì)象申請(qǐng)的空間通常為對(duì)象堆中位于最后一個(gè)對(duì)象后的空間。如果對(duì)象堆中位于最后一個(gè)對(duì)象后的空間小于新對(duì)象占用的空間,Java卡虛擬機(jī)會(huì)返回資源不足的錯(cuò)誤信息。此外,Java卡虛擬機(jī)在執(zhí)行完刪包或刪應(yīng)用操作后,以及在檢測(cè)到j(luò)ava卡應(yīng)用程序調(diào)用與垃圾回收對(duì)應(yīng)的預(yù)設(shè)API后,會(huì)進(jìn)行垃圾回收操作,即,掃描對(duì)象堆,通過(guò)移動(dòng)對(duì)象使對(duì)象堆中的已創(chuàng)建的對(duì)象連續(xù)排列,將不同對(duì)象之間的空間碎片集合成一個(gè)連續(xù)的存儲(chǔ)空間。
[0003]發(fā)明人在實(shí)現(xiàn)本發(fā)明的過(guò)程中,發(fā)現(xiàn)現(xiàn)有技術(shù)至少存在以下缺陷:
[0004]由于對(duì)象堆中的各個(gè)對(duì)象的生命周期不同,經(jīng)過(guò)多次創(chuàng)建和刪除對(duì)象后,對(duì)象堆中的可用空間通常是不連續(xù)的,而在 創(chuàng)建新對(duì)象時(shí),為新對(duì)象申請(qǐng)的空間通常為對(duì)象堆中位于最后一個(gè)對(duì)象后的空間,因此,在進(jìn)行垃圾回收之前,已創(chuàng)建對(duì)象之間的空閑碎片無(wú)法得到有效的利用,導(dǎo)致對(duì)象堆的空間利用率低。另外,當(dāng)上層應(yīng)用頻繁地調(diào)用API進(jìn)行垃圾回收,Java卡虛擬機(jī)也需要頻繁移動(dòng)對(duì)象合并碎片,時(shí)間消耗較大,降低了 Java卡虛擬機(jī)的工作效率。

【發(fā)明內(nèi)容】

[0005]本發(fā)明提供了一種使用寄生對(duì)象管理對(duì)象堆的方法和裝置,以解決現(xiàn)有技術(shù)中對(duì)象堆的空間利用率低的缺陷。
[0006]本發(fā)明提供了一種使用寄生對(duì)象管理對(duì)象堆的方法,所述寄生對(duì)象用于標(biāo)記所述對(duì)象堆中的空閑空間,包括地址字節(jié)和容量字節(jié),所述地址字節(jié)用于表示所述寄生對(duì)象的后一個(gè)寄生對(duì)象的地址,所述容量字節(jié)用于表示所述寄生對(duì)象所標(biāo)記的空閑空間的大小,Java卡虛擬機(jī)的系統(tǒng)信息中存儲(chǔ)有所述對(duì)象堆中的第一個(gè)寄生對(duì)象的地址;
[0007]所述Java卡虛擬機(jī)需要在所述對(duì)象堆中創(chuàng)建非寄生對(duì)象時(shí),執(zhí)行以下操作:
[0008]S1、所述Java卡虛擬機(jī)讀取所述對(duì)象堆中的第一個(gè)寄生對(duì)象,將所述第一個(gè)寄生對(duì)象作為當(dāng)前寄生對(duì)象;
[0009]S2、所述Java卡虛擬機(jī)判斷當(dāng)前寄生對(duì)象所標(biāo)記的空閑空間是否小于待創(chuàng)建對(duì)象所占用的空間,如果是,則執(zhí)行步驟S3 ;否則,執(zhí)行步驟SlO ;
[0010]S3、所述Java卡虛擬機(jī)判斷所述對(duì)象堆中是否存在當(dāng)前寄生對(duì)象的后一個(gè)寄生對(duì)象,如果是,則執(zhí)行步驟S4 ;否則,執(zhí)行步驟S5 ;
[0011]S4、所述Java卡虛擬機(jī)將當(dāng)前寄生對(duì)象的后一個(gè)寄生對(duì)象,作為更新后的當(dāng)前寄生對(duì)象,并返回步驟S2 ;
[0012]S5、所述Java卡虛擬機(jī)將所述對(duì)象堆中的所有空閑空間進(jìn)行合并,根據(jù)合并后的空閑空間創(chuàng)建對(duì)應(yīng)的寄生對(duì)象,判斷所述合并后的空閑空間是否小于所述待創(chuàng)建對(duì)象所占用的空間,如果是,則將創(chuàng)建的寄生對(duì)象的地址作為所述對(duì)象堆中的第一個(gè)寄生對(duì)象的地址保存到所述系統(tǒng)信息中,結(jié)束流程;否則,執(zhí)行步驟S6 ;
[0013]S6、所述Java卡虛擬機(jī)讀取當(dāng)前寄生對(duì)象的地址字節(jié),將讀取到的結(jié)果作為所述對(duì)象堆中的第一個(gè)寄生對(duì)象的地址保存到所述系統(tǒng)信息中;
[0014]S7、所述Java卡虛擬機(jī)從當(dāng)前寄生對(duì)象的地址開始,為所述待創(chuàng)建對(duì)象申請(qǐng)空間,獲取申請(qǐng)空間后的剩余空間;
[0015]S8、所述Java卡虛擬機(jī)判斷所述剩余空間是否大于寄生對(duì)象所占用的空間,如果是,則執(zhí)行步驟S9 ;否則,結(jié)束流程;
[0016]S9、所述Java卡虛擬機(jī)從所述剩余空間的首地址開始,創(chuàng)建第一寄生對(duì)象,將所述第一寄生對(duì)象的地址作為所述對(duì)象堆中的第一個(gè)寄生對(duì)象的地址保存到所述系統(tǒng)信息中,結(jié)束流程;
[0017]S10、所述Java卡虛擬機(jī)從當(dāng)前寄生對(duì)象的地址開始,為所述待創(chuàng)建對(duì)象申請(qǐng)空間,并對(duì)當(dāng)前寄生對(duì)象的前一個(gè)寄生對(duì)象,和/或所述系統(tǒng)信息中存儲(chǔ)的所述對(duì)象堆中的第一個(gè)寄生對(duì)象的地址進(jìn)行更新。
[0018]本發(fā)明還提供了一種使用寄生對(duì)象管理對(duì)象堆的裝置,所述寄生對(duì)象用于標(biāo)記所述對(duì)象堆中的空閑空間,包括地址字節(jié)和容量字節(jié),所述地址字節(jié)用于表示所述寄生對(duì)象的后一個(gè)寄生對(duì)象的地址,所述容量字節(jié)用于表示所述寄生對(duì)象所標(biāo)記的空閑空間的大小,系統(tǒng)信息中存儲(chǔ)有所述對(duì)象堆中的第一個(gè)寄生對(duì)象的地址;
[0019]所述裝置,包括:
[0020]第一讀取模塊,用于在需要在所述對(duì)象堆中創(chuàng)建非寄生對(duì)象時(shí),讀取所述對(duì)象堆中的第一個(gè)寄生對(duì)象,將所述第一個(gè)寄生對(duì)象作為當(dāng)前寄生對(duì)象,并觸發(fā)第一判斷模塊;
[0021]第一判斷模塊,用于判斷當(dāng)前寄生對(duì)象所標(biāo)記的空閑空間是否小于待創(chuàng)建對(duì)象所占用的空間,并在判斷出當(dāng)前寄生對(duì)象所標(biāo)記的空閑空間小于待創(chuàng)建對(duì)象所占用的空間時(shí),觸發(fā)第二判斷模塊;
[0022]第二判斷模塊,用于在所述第一判斷模塊判斷出當(dāng)前寄生對(duì)象所標(biāo)記的空閑空間小于待創(chuàng)建對(duì)象所占用的空間時(shí),判斷所述對(duì)象堆中是否存在當(dāng)前寄生對(duì)象的后一個(gè)寄生對(duì)象,并在判斷出所述對(duì)象堆中不存在當(dāng)前寄生對(duì)象的后一個(gè)寄生對(duì)象時(shí),觸發(fā)合并模塊;
[0023]第一更新模塊,用于在所述第二判斷模塊判斷出所述對(duì)象堆中存在當(dāng)前寄生對(duì)象的后一個(gè)寄生對(duì)象時(shí),將當(dāng)如寄生對(duì)象的后一個(gè)寄生對(duì)象,作為更新后的當(dāng)如寄生對(duì)象,并觸發(fā)所述第二判斷模塊;
[0024]合并模塊,用于將所述對(duì)象堆中的所有空閑空間進(jìn)行合并,根據(jù)合并后的空閑空間創(chuàng)建對(duì)應(yīng)的寄生對(duì)象;
[0025]第三判斷模塊,用于判斷所述合并模塊合并后的空閑空間是否小于所述待創(chuàng)建對(duì)象所占用的空間,并在判斷出所述合并后的空閑空間小于所述待創(chuàng)建對(duì)象所占用的空間時(shí),觸發(fā)第一處理模塊;[0026]保存模塊,用于在所述第三判斷模塊判斷出所述合并后的空閑空間小于所述待創(chuàng)建對(duì)象所占用的空間時(shí),將創(chuàng)建的寄生對(duì)象的地址作為所述對(duì)象堆中的第一個(gè)寄生對(duì)象的地址保存到所述系統(tǒng)信息中;
[0027]第一處理模塊,用于讀取當(dāng)前寄生對(duì)象的地址字節(jié),將讀取到的結(jié)果作為所述對(duì)象堆中的第一個(gè)寄生對(duì)象的地址保存到所述系統(tǒng)信息中;從當(dāng)前寄生對(duì)象的地址開始,為所述待創(chuàng)建對(duì)象申請(qǐng)空間,獲取申請(qǐng)空間后的剩余空間;
[0028]第四判斷模塊,用于判斷所述第一處理模塊獲取的所述剩余空間是否大于寄生對(duì)象所占用的空間;
[0029]第一創(chuàng)建模塊,用于在所述第四判斷模塊判斷出所述剩余空間大于寄生對(duì)象所占用的空間時(shí),從所述剩余空間的首地址開始,創(chuàng)建第一寄生對(duì)象,將所述第一寄生對(duì)象的地址作為所述對(duì)象堆中的第一個(gè)寄生對(duì)象的地址保存到所述系統(tǒng)信息中;
[0030]第二處理模塊,用于在所述第一判斷模塊判斷出當(dāng)前寄生對(duì)象所標(biāo)記的空閑空間不小于待創(chuàng)建對(duì)象所占用的空間時(shí),從當(dāng)前寄生對(duì)象的地址開始,為所述待創(chuàng)建對(duì)象申請(qǐng)空間,并對(duì)當(dāng)前寄生對(duì)象的前一個(gè)寄生對(duì)象,和/或所述系統(tǒng)信息中存儲(chǔ)的所述對(duì)象堆中的第一個(gè)寄生對(duì)象的地址進(jìn)行更新。
[0031]本發(fā)明達(dá)到的有益效果:通過(guò)使用寄生對(duì)象標(biāo)記對(duì)象堆中的空閑空間,并根據(jù)寄生對(duì)象在對(duì)象堆中為待創(chuàng)建對(duì)象申請(qǐng)空間,能夠有效地管理對(duì)象堆中的空閑空間,提高對(duì)象堆的空間利用率;在執(zhí)行完刪包或刪應(yīng)用操作后,以及在檢測(cè)到j(luò)ava卡應(yīng)用程序調(diào)用與垃圾回收對(duì)應(yīng)的預(yù)設(shè)API后,僅需要執(zhí)行一個(gè)空操作,而不再需要通過(guò)移動(dòng)對(duì)象堆中的已創(chuàng)建對(duì)象進(jìn)行垃圾回收,減少了對(duì)已創(chuàng)建對(duì)象的移動(dòng)次數(shù)以及移動(dòng)對(duì)象帶來(lái)的時(shí)間消耗,提高了 Java卡虛擬機(jī)的工作效率,并在一定程度上達(dá)到磨損平衡。
【專利附圖】

【附圖說(shuō)明】
[0032]圖1為本發(fā)明實(shí)施例中的Java卡虛擬機(jī)第一次上電初始化后,對(duì)象堆的分布示意圖;
[0033]圖2為本發(fā)明實(shí)施例中的Java卡虛擬機(jī)連續(xù)創(chuàng)建多個(gè)非寄生對(duì)象后,對(duì)象堆的分布示意圖;
[0034]圖3為本發(fā)明實(shí)施例中的Java卡虛擬機(jī)刪除非寄生對(duì)象后,對(duì)象堆的分布示意圖;
[0035]圖4為本發(fā)明實(shí)施例中的Java卡虛擬機(jī)創(chuàng)建和刪除非寄生對(duì)象后,對(duì)象堆的分布示意圖;
[0036]圖5為本發(fā)明實(shí)施例中的Java卡虛擬機(jī)創(chuàng)建非寄生對(duì)象的流程圖;
[0037]圖6為本發(fā)明實(shí)施例中的Java卡虛擬機(jī)更新系統(tǒng)信息后,對(duì)象堆的分布示意圖;
[0038]圖7為本發(fā)明實(shí)施例中的Java卡虛擬機(jī)申請(qǐng)空間后,對(duì)象堆的分布示意圖;
[0039]圖8為本發(fā)明實(shí)施例中的Java卡虛擬機(jī)創(chuàng)建第一寄生對(duì)象后,對(duì)象堆的分布示意圖;
[0040]圖9為圖5中步驟107的細(xì)化的流程圖;
[0041]圖10為本發(fā)明實(shí)施例中的Java卡虛擬機(jī)刪除非寄生對(duì)象的流程圖;
[0042]圖11為本發(fā)明實(shí)施例中的使用寄生對(duì)象管理對(duì)象堆的裝置結(jié)構(gòu)圖;[0043]圖12為本發(fā)明實(shí)施例中的合并模塊450的結(jié)構(gòu)圖;
[0044]圖13為本發(fā)明實(shí)施例中的第二處理模塊510的結(jié)構(gòu)圖;
[0045]圖14為本發(fā)明實(shí)施例中的第二更新模塊550的結(jié)構(gòu)圖。
【具體實(shí)施方式】
[0046]下面將結(jié)合本發(fā)明實(shí)施例中的附圖,對(duì)本發(fā)明實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例僅僅是本發(fā)明一部分實(shí)施例,而不是全部的實(shí)施例?;诒景l(fā)明中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒有做出創(chuàng)造性勞動(dòng)前提下所獲得的所有其他實(shí)施例,都屬于本發(fā)明保護(hù)的范圍。
[0047]本發(fā)明實(shí)施例的技術(shù)方案應(yīng)用于Java卡虛擬機(jī)的對(duì)象堆中,該對(duì)象堆中包含寄生對(duì)象和非寄生對(duì)象,其中,非寄生對(duì)象為Java程序運(yùn)行時(shí)創(chuàng)建的Java對(duì)象,寄生對(duì)象用于標(biāo)記對(duì)象堆中的空閑空間。Java卡虛擬機(jī)的系統(tǒng)信息中存儲(chǔ)有對(duì)象堆中的第一個(gè)寄生對(duì)象的地址。本發(fā)明實(shí)施例中的對(duì)象堆是從低地址向高地址使用的,對(duì)象堆中的第一個(gè)寄生對(duì)象為對(duì)象堆中地址最小的寄生對(duì)象。
[0048]具體地,寄生對(duì)象包括類型字節(jié)、地址字節(jié)和容量字節(jié),其中,類型字節(jié)用于表示寄生對(duì)象的類型,地址字節(jié)用于表示該寄生對(duì)象的后一個(gè)寄生對(duì)象的地址,容量字節(jié)用于表示所標(biāo)記的空閑空間的大小。其中,寄生對(duì)象的類型字節(jié)的取值可以為第一預(yù)設(shè)值,例如,“0x01”。當(dāng)前寄生對(duì)象的后一個(gè)寄生對(duì)象是指對(duì)象堆中地址比當(dāng)前寄生對(duì)象的地址大,且地址差值最小的寄生對(duì)象。
[0049]本發(fā)明實(shí)施例中,Java卡虛擬機(jī)第一次上電初始化時(shí),從對(duì)象堆的首地址開始,創(chuàng)建對(duì)象堆中的第一個(gè)寄生對(duì)象,并將對(duì)象堆的首地址作為對(duì)象堆中的第一個(gè)寄生對(duì)象的地址存儲(chǔ)到Java卡虛擬機(jī)的系統(tǒng)信息中。上述寄生對(duì)象用于標(biāo)記整個(gè)對(duì)象堆,其容量字節(jié)的取值為對(duì)象堆的空間大小,其地址字節(jié)為空。
[0050]如圖1所示,為Java卡虛擬機(jī)第一次上電初始化后,對(duì)象堆的分布示意圖,對(duì)象堆中的空閑空間_1為對(duì)象堆的所有空間,寄生對(duì)象parasiticObj_l為對(duì)象堆中的第一個(gè)寄生對(duì)象,也是對(duì)象堆中唯一的寄生對(duì)象。
[0051]當(dāng)Java卡虛擬機(jī)基于圖1所示的對(duì)象堆連續(xù)創(chuàng)建多個(gè)非寄生對(duì)象后,對(duì)象堆中的空閑空間為對(duì)象堆中位于最后一個(gè)對(duì)象后的空間,對(duì)象堆的分布示意圖如圖2所示,其中,objl、obj2、obj3、obj4、obj5和obj6為對(duì)象堆中的非寄生對(duì)象,parasiticObj_l為對(duì)象堆中的寄生對(duì)象,用于標(biāo)記對(duì)象堆中的空閑空間。
[0052]當(dāng)Java卡虛擬機(jī)從對(duì)象堆中刪除非寄生對(duì)象后,對(duì)象堆中的空閑空間除包括對(duì)象堆中位于最后一個(gè)對(duì)象后的空間外,還包括已刪除的非寄生對(duì)象曾占用的空間。例如,當(dāng)Java卡虛擬機(jī)從圖2所示的對(duì)象堆中刪除非寄生對(duì)象obj3和obj6后,對(duì)象堆的分布示意圖如圖3所示,其中,objl、obj2、obj4和obj5為對(duì)象堆中的非寄生對(duì)象,parasiticObj_l和parasiticObj_2為對(duì)象堆中的寄生對(duì)象,分別用于標(biāo)記對(duì)象堆中的空閑空間_1和空閑空間_2。
[0053]當(dāng)Java卡虛擬機(jī)基于圖3所示的對(duì)象堆創(chuàng)建和刪除非寄生對(duì)象后,對(duì)象堆的分布示意圖如圖4所示,其中,objl、obj5、obj6和obj7為對(duì)象堆中的非寄生對(duì)象,parasiticObj_l、parasitic0bj_2和parasiticObj_3為對(duì)象堆中的寄生對(duì)象,用于標(biāo)記對(duì)象堆中的空閑空間_1、空閑空間_2和空閑空間_3。系統(tǒng)信息中存儲(chǔ)有對(duì)象堆中的第一個(gè)寄生對(duì)象parasiticObj_l的地址“0x1111”,對(duì)象表中存儲(chǔ)有objl、obj5、obj6和obj7的引用值,即,objref_l> objref_5> objref_6 和 objref_70
[0054]基于本發(fā)明的技術(shù)方案,當(dāng)需要在如圖4所示的對(duì)象堆中創(chuàng)建非寄生對(duì)象0bj_8時(shí),Java卡虛擬機(jī)執(zhí)行的操作流程,如圖5所示,包括以下步驟:
[0055]步驟101,Java卡虛擬機(jī)從系統(tǒng)信息中獲取對(duì)象堆中的第一個(gè)寄生對(duì)象的地址。
[0056]步驟102,Java卡虛擬機(jī)判斷獲取到的地址是否為空,如果是,則執(zhí)行步驟107,否則執(zhí)行步驟103。
[0057]例如,Java卡虛擬機(jī)從系統(tǒng)信息中獲取到的對(duì)象堆中的第一個(gè)寄生對(duì)象的地址為“0x1111”時(shí),Java卡虛擬機(jī)判斷出該地址不為空,進(jìn)而確定對(duì)象堆中的第一個(gè)寄生對(duì)象的地址為“OxlllT’Java卡虛擬機(jī)從系統(tǒng)信息中獲取到的對(duì)象堆中的第一個(gè)寄生對(duì)象的地址為“0x0000”時(shí),Java卡虛擬機(jī)判斷出該地址字節(jié)為空,進(jìn)而確定系統(tǒng)中沒有存儲(chǔ)第一個(gè)寄生對(duì)象的地址,即對(duì)象堆中沒有寄生對(duì)象。
[0058]步驟103, Java卡虛擬機(jī)讀取對(duì)象堆中的第一個(gè)寄生對(duì)象,將第一個(gè)寄生對(duì)象作為當(dāng)如寄生對(duì)象。
[0059]具體地,Java卡虛擬機(jī)可以根據(jù)系統(tǒng)信息中存儲(chǔ)的對(duì)象堆中的第一個(gè)寄生對(duì)象的地址,讀取對(duì)象堆中的第一個(gè)寄生對(duì)象,并將該寄生對(duì)象作為當(dāng)前寄生對(duì)象。
[0060]例如,Java卡虛擬機(jī)的系統(tǒng)信息中存儲(chǔ)的對(duì)象堆中的第一個(gè)寄生對(duì)象的地址為“0x1111”時(shí),Java卡虛擬機(jī)可以根據(jù)該地址,讀取到對(duì)象堆中的第一個(gè)寄生對(duì)象parasiticObj_l “01 2222 0056”,將 parasiticObj_l “01 2222 0056”作為當(dāng)前寄生對(duì)象。
[0061]步驟104,Java卡虛擬機(jī)判斷當(dāng)前寄生對(duì)象所標(biāo)記的空閑空間是否小于待創(chuàng)建對(duì)象所占用的空間,如果是,則執(zhí)行步驟105 ;否則,執(zhí)行步驟109。
[0062]具體的,Java卡虛擬機(jī)可以讀取當(dāng)前寄生對(duì)象的容量字節(jié),從操作棧中讀取待創(chuàng)建對(duì)象的所占用的空間的大小,判斷上述容量字節(jié)的取值是否小于待創(chuàng)建對(duì)象所占用的空間的大小,如果是,則確定當(dāng)前寄生對(duì)象所標(biāo)記的空閑空間小于待創(chuàng)建對(duì)象所占用的空間;否則,確定當(dāng)前寄生對(duì)象所標(biāo)記的空閑空間不小于待創(chuàng)建對(duì)象所占用的空間。
[0063]例如,當(dāng)前寄生對(duì)象為“01 2222 0056”,寄生對(duì)象的第四個(gè)字節(jié)和第五個(gè)字節(jié)為容量字節(jié)時(shí),如果待創(chuàng)建對(duì)象所占用的空間為0x66個(gè)字節(jié),則Java卡虛擬機(jī)判斷出當(dāng)前寄生對(duì)象的容量字節(jié)的取值小于待創(chuàng)建對(duì)象所占用的空間的大小,確定當(dāng)前寄生對(duì)象所標(biāo)記的空閑空間小于待創(chuàng)建對(duì)象所占用的空間;如果待創(chuàng)建對(duì)象所占用的空間為0x45個(gè)字節(jié),則Java卡虛擬機(jī)判斷出當(dāng)前寄生對(duì)象的容量字節(jié)的取值大于待創(chuàng)建對(duì)象所占用的空間的大小,確定當(dāng)前寄生對(duì)象所標(biāo)記的空閑空間大于待創(chuàng)建對(duì)象所占用的空間。
[0064]步驟105, Java卡虛擬機(jī)判斷對(duì)象堆中是否存在當(dāng)前寄生對(duì)象的后一個(gè)寄生對(duì)象,如果是,則執(zhí)行步驟106 ;否則,執(zhí)行步驟107。
[0065]具體地,Java卡虛擬機(jī)可以讀取當(dāng)前寄生對(duì)象的地址字節(jié),判斷該地址字節(jié)是否為空,如果是,則確定對(duì)象堆中不存在當(dāng)前寄生對(duì)象的后一個(gè)寄生對(duì)象;否則,確定對(duì)象堆中存在當(dāng)前寄生對(duì)象的后一個(gè)寄生對(duì)象。本實(shí)施例中,對(duì)象堆是從低地址向高地址使用的,當(dāng)前寄生對(duì)象的后一個(gè)寄生對(duì)象是指對(duì)象堆中地址比當(dāng)前寄生對(duì)象的地址大,且地址差值最小的寄生對(duì)象。[0066]例如,如果當(dāng)前寄生對(duì)象為“01 2222 0056”,Java卡虛擬機(jī)可以讀取地址字節(jié)“0x2222”,判斷出該地址字節(jié)不為空,進(jìn)而確定對(duì)象堆中存在當(dāng)前寄生對(duì)象的后一個(gè)寄生對(duì)象;如果當(dāng)前寄生對(duì)象為“01 0000 0016”,Java卡虛擬機(jī)可以讀取地址字節(jié)“0x0000”,判斷出該地址字節(jié)為空,進(jìn)而確定對(duì)象堆中不存在當(dāng)前寄生對(duì)象的后一個(gè)寄生對(duì)象。
[0067]步驟106, Java卡虛擬機(jī)讀取當(dāng)前寄生對(duì)象的后一個(gè)寄生對(duì)象,將當(dāng)前寄生對(duì)象更新為讀取到的寄生對(duì)象,并返回步驟104。
[0068]具體地,Java卡虛擬機(jī)可以根據(jù)當(dāng)前寄生對(duì)象的地址字節(jié)的取值,讀取當(dāng)前寄生對(duì)象的后一個(gè)寄生對(duì)象,將當(dāng)如寄生對(duì)象更新為讀取到的寄生對(duì)象。
[0069]例如,當(dāng)前寄生對(duì)象為“01 2222 0056”,Java卡虛擬機(jī)可以根據(jù)地址字節(jié)“0x2222”,從地址“0x2222”處讀取當(dāng)前寄生對(duì)象的后一個(gè)寄生對(duì)象parasiticOb j_2,將當(dāng)前寄生對(duì)象更新為讀取到的寄生對(duì)象parasitic0bj_2。
[0070]步驟107,Java卡虛擬機(jī)將對(duì)象堆中的所有空閑空間進(jìn)行合并,根據(jù)合并后的空閑空間創(chuàng)建對(duì)應(yīng)的寄生對(duì)象,并將該寄生對(duì)象的地址作為對(duì)象堆中的第一個(gè)寄生對(duì)象的地址保存到系統(tǒng)信息中。
[0071]具體地,Java卡虛擬機(jī)可以通過(guò)移動(dòng)對(duì)象堆中的已創(chuàng)建的對(duì)象,將對(duì)象堆中的所有的空閑空間集中起來(lái),得到合并后的空閑空間,從合并后的空閑空間的首地址開始,創(chuàng)建對(duì)應(yīng)的寄生對(duì)象,將該寄生對(duì)象的類型字節(jié)的取值設(shè)置為第一預(yù)設(shè)值,將該寄生對(duì)象的地址字節(jié)設(shè)置為空,將該寄生對(duì)象的容量字節(jié)的取值設(shè)置為上述合并后的空閑空間的大小。其中,對(duì)象堆中的空閑空間包括對(duì)象堆中的空間碎片以及寄生對(duì)象所標(biāo)記的空閑空間。
[0072]例如,合并后的空閑空間的大小為“0x0175”,Java卡虛擬機(jī)根據(jù)合并后的空閑空間創(chuàng)建對(duì)應(yīng)的寄生對(duì)象parasiticObj_l “01 0000 0175”。
[0073]需要說(shuō)明的是,本步驟的詳細(xì)過(guò)程可參照如圖9所示的流程圖。
[0074]步驟108,Java卡虛擬機(jī)判斷合并后的空閑空間是否小于待創(chuàng)建對(duì)象所占用的空間,如果是,則結(jié)束流程;否則,返回步驟103。
[0075]具體的,Java卡虛擬機(jī)可以讀取步驟107中創(chuàng)建的寄生對(duì)象的容量字節(jié),從操作棧中讀取待創(chuàng)建對(duì)象的所占用的空間的大小,判斷上述寄生對(duì)象的容量字節(jié)的取值是否小于待創(chuàng)建對(duì)象所占用的空間的大小,如果是,則確定合并后的空閑空間小于待創(chuàng)建對(duì)象所占用的空間;否則,確定合并后的空閑空間不小于待創(chuàng)建對(duì)象所占用的空間。
[0076]例如,當(dāng)待創(chuàng)建對(duì)象所占用的空間為0x66個(gè)字節(jié),寄生對(duì)象的第四個(gè)字節(jié)和第五個(gè)字節(jié)為容量字節(jié)時(shí),如果步驟107中創(chuàng)建的寄生對(duì)象parasiticObj_l為“01 00000175”,則Java卡虛擬機(jī)可以判斷出步驟107中創(chuàng)建的寄生對(duì)象的容量字節(jié)的取值大于待創(chuàng)建對(duì)象所占用的空間的大小,確定合并后的空閑空間大于待創(chuàng)建對(duì)象所占用的空間。
[0077]步驟109,Java卡虛擬機(jī)判斷當(dāng)前寄生對(duì)象是否為對(duì)象堆中的第一個(gè)寄生對(duì)象,如果是,則執(zhí)行步驟Iio ;否則,執(zhí)行步驟114。
[0078]具體地,Java卡虛擬機(jī)可以判斷當(dāng)前寄生對(duì)象的地址是否為Java卡虛擬機(jī)的系統(tǒng)信息中存儲(chǔ)的對(duì)象堆中的第一個(gè)寄生對(duì)象的地址,如果是,則確定當(dāng)前寄生對(duì)象為對(duì)象堆中的第一個(gè)寄生對(duì)象;否則,確定當(dāng)前寄生對(duì)象不是對(duì)象堆中的第一個(gè)寄生對(duì)象。
[0079]例如,Java卡虛擬機(jī)的系統(tǒng)信息中存儲(chǔ)的對(duì)象堆中的第一個(gè)寄生對(duì)象的地址為“0x1111”時(shí),如果當(dāng)前寄生對(duì)象的地址為“0x1111”,Java卡虛擬機(jī)可以確定當(dāng)前寄生對(duì)象為對(duì)象堆中的第一個(gè)寄生對(duì)象。
[0080]步驟110,Java卡虛擬機(jī)讀取當(dāng)前寄生對(duì)象的地址字節(jié),將讀取到的結(jié)果作為對(duì)象堆中的第一個(gè)寄生對(duì)象的地址保存到系統(tǒng)信息中。
[0081]例如,如果當(dāng)前寄生對(duì)象為“01 2222 0056”,Java卡虛擬機(jī)可以讀取地址字節(jié)“0x2222”,將“0x2222”作為對(duì)象堆中的第一個(gè)寄生對(duì)象的地址保存到系統(tǒng)信息中,如圖6所示。如果當(dāng)前寄生對(duì)象為“01 0000 0175”,Java卡虛擬機(jī)可以讀取地址字節(jié)“0x0000”,判斷出該地址字節(jié)為空,進(jìn)而確定對(duì)象堆中不存在當(dāng)前寄生對(duì)象的后一個(gè)寄生對(duì)象,將系統(tǒng)信息中記錄的第一個(gè)寄生對(duì)象的地址更新為“0x0000”。
[0082]步驟111, Java卡虛擬機(jī)從當(dāng)前寄生對(duì)象的地址開始,為待創(chuàng)建對(duì)象申請(qǐng)空間,初始化對(duì)象頭,將待創(chuàng)建對(duì)象添加到對(duì)象表中,并獲取申請(qǐng)空間后的剩余空間。
[0083]具體地,Java卡虛擬機(jī)可以從當(dāng)前寄生對(duì)象的地址開始,為待創(chuàng)建對(duì)象申請(qǐng)空間,初始化對(duì)象頭,將待創(chuàng)建對(duì)象的偏移地址作為引用值添加到對(duì)象表中,將當(dāng)前寄生對(duì)象所標(biāo)記的空閑空間的大小減去已被申請(qǐng)的空間的大小,將得到的結(jié)果作為申請(qǐng)空間后的剩余空間的大小,并獲取當(dāng)前寄生對(duì)象的地址與已被申請(qǐng)的空間的大小相加,將得到的結(jié)果作為申請(qǐng)空間后的剩余空間的首地址。
[0084]例如,當(dāng)前寄生對(duì)象為“01 2222 0056”,其地址為“0x1111”,待創(chuàng)建對(duì)象Obj_8所占用的空間為0x45個(gè)字節(jié)時(shí),Java卡虛擬機(jī)可以從地址“0x1111”開始,為待創(chuàng)建對(duì)象Ob j_8申請(qǐng)0x45個(gè)字節(jié)的空間,將待創(chuàng)建對(duì)象Ob j_8的偏移地址“ Ox 1111 ”作為弓I用值添加到對(duì)象表中,剩余空間的大小為當(dāng)前寄生對(duì)象所標(biāo)記的空閑空間的大小減去已被申請(qǐng)的空間的大小,即,0x56字節(jié)-0x45字節(jié)=Oxll字節(jié),剩余空間的首地址為“0x1111”+0x45= “0x1156”,如圖 7 所示。
[0085]步驟112, Java卡虛擬機(jī)判斷剩余空間是否大于寄生對(duì)象所占用的空間,如果是,則執(zhí)行步驟113 ;否則,結(jié)束流程。
[0086]本實(shí)施例中,寄生對(duì)象所占用的空間可以為0x05個(gè)字節(jié);相應(yīng)地,Java卡虛擬機(jī)可以判斷剩余空間的大小是否大于0x05個(gè)字節(jié),如果是,則確定剩余空間大于寄生對(duì)象所占用的空間;否則,確定剩余空間不大于寄生對(duì)象所占用的空間。
[0087]例如,剩余空間的大小為Oxll個(gè)字節(jié)時(shí),Java卡虛擬機(jī)可以判斷出剩余空間的大小大于0x05個(gè)字節(jié),進(jìn)而確定剩余空間大于寄生對(duì)象所占用的空間。
[0088]步驟113, Java卡虛擬機(jī)從剩余空間的首地址開始,倉(cāng)Il建第一寄生對(duì)象,將該第一寄生對(duì)象的地址作為對(duì)象堆中的第一個(gè)寄生對(duì)象的地址保存到系統(tǒng)信息中,結(jié)束流程。
[0089]具體地,Java卡虛擬機(jī)可以將第一寄生對(duì)象的類型字節(jié)的取值設(shè)置為第一預(yù)設(shè)值,將第一寄生對(duì)象的地址字節(jié)的取值設(shè)置為第一寄生對(duì)象的后一個(gè)寄生對(duì)象的地址,將第一寄生對(duì)象的容量字節(jié)的取值設(shè)置為剩余空間的大小,并將該第一寄生對(duì)象的地址作為對(duì)象堆中的第一個(gè)寄生對(duì)象的地址保存到系統(tǒng)信息中。本實(shí)施例中,對(duì)象堆是從低地址向高地址使用的,第一寄生對(duì)象的后一個(gè)寄生對(duì)象是指對(duì)象堆中地址比第一寄生對(duì)象的地址大,且地址差值最小的寄生對(duì)象。
[0090]例如,剩余空間的大小為Oxll個(gè)字節(jié),首地址為“0x1156”,第一寄生對(duì)象的后一個(gè)寄生對(duì)象的地址為“0x2222”時(shí),則Java卡虛擬機(jī)生成的第一寄生對(duì)象parasiticOb j_4為“01 2222 0011 ”,Java卡虛擬機(jī)將該第一寄生對(duì)象parasiticObj_4的地址“0x1156”作為對(duì)象堆中的第一個(gè)寄生對(duì)象的地址保存到系統(tǒng)信息中,如圖8所示。
[0091]步驟114,Java卡虛擬機(jī)根據(jù)當(dāng)前寄生對(duì)象的后一個(gè)寄生對(duì)象的地址,更新當(dāng)前寄生對(duì)象的前一個(gè)寄生對(duì)象。
[0092]具體地,Java卡虛擬機(jī)可以讀取當(dāng)前寄生對(duì)象的地址字節(jié)的取值,將當(dāng)前寄生對(duì)象的前一個(gè)寄生對(duì)象的地址字節(jié)的取值,更新為當(dāng)前寄生對(duì)象的地址字節(jié)的取值。本實(shí)施例中,對(duì)象堆是從低地址向高地址使用的,當(dāng)前寄生對(duì)象的前一個(gè)寄生對(duì)象是指對(duì)象堆中地址比當(dāng)前寄生對(duì)象的地址小,且地址差值最小的寄生對(duì)象;當(dāng)前寄生對(duì)象的后一個(gè)寄生對(duì)象是指對(duì)象堆中地址比當(dāng)前寄生對(duì)象的地址大,且地址差值最小的寄生對(duì)象。
[0093]例如,當(dāng)前寄生對(duì)象為“01 2222 0056”,當(dāng)前寄生對(duì)象的前一個(gè)寄生對(duì)象為“011785 0020”時(shí),Java卡虛擬機(jī)可以將當(dāng)前寄生對(duì)象的前一個(gè)寄生對(duì)象更新為“01 22220020”。
[0094]步驟115, Java卡虛擬機(jī)從當(dāng)前寄生對(duì)象的地址開始,為待創(chuàng)建對(duì)象申請(qǐng)空間,初始化對(duì)象頭,將待創(chuàng)建對(duì)象添加到對(duì)象表中,獲取申請(qǐng)空間后的剩余空間。
[0095]具體地,Java卡虛擬機(jī)可以從當(dāng)前寄生對(duì)象的地址開始,為待創(chuàng)建對(duì)象申請(qǐng)空間,初始化對(duì)象頭,將待創(chuàng)建對(duì)象的偏移地址作為引用值添加到對(duì)象表中,將當(dāng)前寄生對(duì)象所標(biāo)記的空閑空間的大小減去已被申請(qǐng)的空間的大小,將得到的結(jié)果作為申請(qǐng)空間后的剩余空間的大小,并獲取當(dāng)前寄生對(duì)象的地址與已被申請(qǐng)的空間的大小相加,將得到的結(jié)果作為申請(qǐng)空間后的剩余空間的首地址。
[0096]例如,當(dāng)前寄生對(duì)象為“01 2222 0056”,其地址為“0x1900”時(shí),Java卡虛擬機(jī)從地址“0x1900”開始,為待創(chuàng)建對(duì)象申請(qǐng)0x45個(gè)字節(jié)的空間,將待創(chuàng)建對(duì)象的偏移地址“ Ox1900 ”作為引用值添加到對(duì)象表中,剩余空間的大小為當(dāng)前寄生對(duì)象所標(biāo)記的空閑空間減去已被申請(qǐng)的空間后得到的空間,即,0x56字節(jié)-0x45字節(jié)=Oxll字節(jié),剩余空間的首地址為 “0x1900”+0x45= “0x1945”。
[0097]步驟116, Java卡虛擬機(jī)判斷剩余空間是否大于寄生對(duì)象所占用的空間,如果是,則執(zhí)行步驟117 ;否則,結(jié)束流程。
[0098]本實(shí)施例中,寄生對(duì)象所占用的空間可以為0x05個(gè)字節(jié);相應(yīng)地,Java卡虛擬機(jī)可以判斷剩余空間的大小是否大于0x05個(gè)字節(jié),如果是,則確定剩余空間大于寄生對(duì)象所占用的空間;否則,確定剩余空間不大于寄生對(duì)象所占用的空間。
[0099]例如,剩余空間的大小為Oxll個(gè)字節(jié)時(shí),Java卡虛擬機(jī)可以判斷出剩余空間的大小大于0x05個(gè)字節(jié),進(jìn)而確定剩余空間大于寄生對(duì)象所占用的空間。
[0100]步驟117, Java卡虛擬機(jī)從剩余空間的首地址開始,倉(cāng)Ij建第二寄生對(duì)象,根據(jù)該第二寄生對(duì)象的地址,更新該第二寄生對(duì)象的前一個(gè)寄生對(duì)象,結(jié)束流程。
[0101]具體地,Java卡虛擬機(jī)可以將第二寄生對(duì)象的類型字節(jié)的取值設(shè)置為第一預(yù)設(shè)值,將第二寄生對(duì)象的地址字節(jié)的取值設(shè)置為第二寄生對(duì)象的后一個(gè)寄生對(duì)象的地址,將第二寄生對(duì)象的容量字節(jié)的取值設(shè)置為剩余空間的大小,將第二寄生對(duì)象的前一個(gè)寄生對(duì)象的地址字節(jié)的取值,更新為第二寄生對(duì)象的地址。本實(shí)施例中,對(duì)象堆是從低地址向高地址使用的,第二寄生對(duì)象的前一個(gè)寄生對(duì)象是指對(duì)象堆中地址比第二寄生對(duì)象的地址小,且地址差值最小的寄生對(duì)象;第二寄生對(duì)象的后一個(gè)寄生對(duì)象是指對(duì)象堆中地址比第二寄生對(duì)象的地址大,且地址差值最小的寄生對(duì)象。[0102]例如,剩余空間的大小為Oxll個(gè)字節(jié),第二寄生對(duì)象的后一個(gè)寄生對(duì)象的地址為“ 0x2222 ”,第二寄生對(duì)象的地址為“ Ox 1945 ”,第二寄生對(duì)象的前一個(gè)寄生對(duì)象為“0122220020”時(shí),則Java卡虛擬機(jī)生成的第二寄生對(duì)象為“01 2222 0011”,Java卡虛擬機(jī)根據(jù)該第二寄生對(duì)象的地址“0x1945”,將第二寄生對(duì)象的前一個(gè)寄生對(duì)象更新為“0119450020”。
[0103]上述實(shí)施例中,步驟107可細(xì)化為如圖9所示的流程圖,包括以下步驟:
[0104]步驟201,Java卡虛擬機(jī)將系統(tǒng)信息中保存的對(duì)象堆中的第一個(gè)寄生對(duì)象的地址
設(shè)置為空。
[0105]例如,Java卡虛擬機(jī)將系統(tǒng)信息中保存的對(duì)象堆中的第一個(gè)寄生對(duì)象的地址設(shè)置為“0x0000”。
[0106]步驟202,Java卡虛擬機(jī)將對(duì)象堆中的第一個(gè)非寄生對(duì)象作為當(dāng)前對(duì)象,獲取當(dāng)前對(duì)象的地址減去對(duì)象堆的首地址得到的差值,將空閑空間變量初始化為上述差值。
[0107]本發(fā)明實(shí)施例中,對(duì)象堆是從低地址向高地址使用的,對(duì)象堆中的第一個(gè)非寄生對(duì)象為對(duì)象堆中地址最小的非寄生對(duì)象。
[0108]例如,當(dāng)對(duì)象堆中的第一個(gè)非寄生對(duì)象Objl的地址為“0x0023”,對(duì)象堆的首地址為“0x0000”時(shí),Java卡虛擬機(jī)將對(duì)象堆中的第一個(gè)非寄生對(duì)象Objl作為當(dāng)前對(duì)象pObj,將PObj的地址減去對(duì)象堆的首地址,即,0x0023-0x0000,得到的差值為0x23字節(jié),Java卡虛擬機(jī)將空閑空間變量的取值設(shè)置為0x23字節(jié)。
[0109]步驟203,Java卡虛擬機(jī)判斷當(dāng)前對(duì)象的地址是否小于對(duì)象堆中最后一個(gè)非寄生對(duì)象的地址,如果是,則執(zhí)行步驟204 ;否則,執(zhí)行步驟207。
[0110]本發(fā)明實(shí)施例中,對(duì)象堆是從低地址向高地址使用的,對(duì)象堆中的最后一個(gè)非寄生對(duì)象為對(duì)象堆中地址最大的非寄生對(duì)象。
[0111]例如,當(dāng)前對(duì)象pObj的地址為“0x0023”,對(duì)象堆中最后一個(gè)非寄生對(duì)象的地址為“0x1529”時(shí),Java卡虛擬機(jī)判斷出當(dāng)前對(duì)象pObj的地址小于對(duì)象堆中最后一個(gè)非寄生對(duì)象的地址。
[0112]步驟204,Java卡虛擬機(jī)判斷空閑空間變量的取值是否為零,如果是,則執(zhí)行步驟206 ;否則,執(zhí)行步驟205。
[0113]步驟205,Java卡虛擬機(jī)根據(jù)空閑空間變量的取值,將當(dāng)前對(duì)象前移,更新當(dāng)前對(duì)象在對(duì)象表中的引用值,并執(zhí)行步驟206。
[0114]具體地,Java卡虛擬機(jī)將當(dāng)前對(duì)象前移的空間大小,可以為空閑空間變量的取值,Java卡虛擬機(jī)可以將對(duì)象表中記錄的當(dāng)前對(duì)象的引用值新為當(dāng)前對(duì)象前移后的偏移地址。
[0115]例如,空閑空間變量的取值為0x13字節(jié),當(dāng)前對(duì)象pObj的地址為“0x0023”時(shí),Java卡虛擬機(jī)將當(dāng)前對(duì)象pObj前移0x13個(gè)字節(jié),前移后的當(dāng)前對(duì)象pObj的地址為“0x0010”,Java卡虛擬機(jī)將對(duì)象表中記錄的當(dāng)前對(duì)象pObj的引用值更新為當(dāng)前對(duì)象前移后的偏移地址“0x0010”。
[0116]步驟206, Java卡虛擬機(jī)獲取當(dāng)前對(duì)象的后一個(gè)非寄生對(duì)象的地址減去當(dāng)前對(duì)象的地址和當(dāng)前對(duì)象占用的空間的大小得到的差值,將空閑空間變量更新為上述差值,將當(dāng)前對(duì)象的后一個(gè)非寄生對(duì)象作為更新后的當(dāng)前對(duì)象,并返回步驟203。
[0117]本發(fā)明實(shí)施例中,對(duì)象堆是從低地址向高地址使用的,當(dāng)前對(duì)象的后一個(gè)非寄生對(duì)象是指對(duì)象堆中地址比當(dāng)前對(duì)象的地址大,且地址差值最小的非寄生對(duì)象。
[0118]例如,當(dāng)前對(duì)象pObj的后一個(gè)非寄生對(duì)象為0bj2,0bj2的地址為“0x0059”,pObj的地址為“0x0023”,pObj占用的空間的大小為0x10個(gè)字節(jié),Java卡虛擬機(jī)將0bj2的地址減去PObj的地址和pObj占用的空間的大小,即,0x0059-0x0023-0x10,得到的差值為0x26字節(jié),Java卡虛擬機(jī)將空閑空間變量的取值設(shè)置為0x26字節(jié)。
[0119]步驟207,Java卡虛擬機(jī)根據(jù)空閑空間變量的取值,將當(dāng)前對(duì)象前移,更新當(dāng)前對(duì)象在對(duì)象表中的引用值。
[0120]具體地,具體地,Java卡虛擬機(jī)將當(dāng)前對(duì)象前移的空間大小為空閑空間變量的取值,Java卡虛擬機(jī)可以將對(duì)象表中記錄的當(dāng)前對(duì)象的引用值更新為當(dāng)前對(duì)象前移后的偏移地址。
[0121]例如,空閑空間變量的取值為0x125字節(jié),當(dāng)前對(duì)象pObj的地址為“0x1529”時(shí),Java卡虛擬機(jī)將當(dāng)前對(duì)象pObj前移0x125個(gè)字節(jié),前移后的當(dāng)前對(duì)象pObj的地址為“0x1404”, Java卡虛擬機(jī)將對(duì)象表中記錄的當(dāng)前對(duì)象pObj的引用值更新為“0x1404”。
[0122]步驟208, Java卡虛擬機(jī)將當(dāng)前對(duì)象的地址與當(dāng)前對(duì)象占用的空間的大小相加,將得到的結(jié)果作為地址,創(chuàng)建對(duì)應(yīng)的寄生對(duì)象,將該寄生對(duì)象的地址作為對(duì)象堆中的第一個(gè)寄生對(duì)象的地址保存到系統(tǒng)信息中。
[0123]具體地,Java卡虛擬機(jī)獲取當(dāng)前對(duì)象的地址與當(dāng)前對(duì)象占用的空間的大小相加得到的結(jié)果,從該結(jié)果開始創(chuàng)建對(duì)應(yīng)的寄生對(duì)象,將上述寄生對(duì)象的類型字節(jié)的取值設(shè)置為第一預(yù)設(shè)值,將上述寄生對(duì)象的地址字節(jié)的取值設(shè)置為空,將上述寄生對(duì)象的容量字節(jié)的取值設(shè)置為對(duì)象堆的尾地址與上述結(jié)果之間的差值。
[0124]例如,當(dāng)前對(duì)象pObj的地址為“0x1404”,占用的空間的大小為0x20個(gè)字節(jié),對(duì)象堆的尾地址為“0x1599”時(shí),Java卡虛擬機(jī)將當(dāng)前對(duì)象的地址與當(dāng)前對(duì)象占用的空間的大小相加,即,0x1404+0x20,得到的結(jié)果為“0x1424” Java卡虛擬機(jī)將對(duì)象堆的尾地址減去上述結(jié)果,即,0x1599-0x1424,得到的差值為0x175字節(jié)。Java卡虛擬機(jī)將“0x1424”作為地址創(chuàng)建寄生對(duì)象,將該寄生對(duì)象的類型字節(jié)的取值設(shè)置為第一預(yù)設(shè)值“0x01”,將該寄生對(duì)象的地址字節(jié)的取值設(shè)置為“0x0000”,將該寄生對(duì)象的容量字節(jié)的取值設(shè)置為“0x175”,則上述寄生對(duì)象為“01 0000 0175”。
[0125]基于本發(fā)明的技術(shù)方案,當(dāng)需要在對(duì)象堆中刪除非寄生對(duì)象時(shí),Java卡虛擬機(jī)執(zhí)行的操作,如圖10所示,包括以下步驟:
[0126]步驟301,Java卡虛擬機(jī)將待刪除對(duì)象從對(duì)象表中刪除。
[0127]具體地,Java卡虛擬機(jī)可以將待刪除對(duì)象的引用值從對(duì)象表中刪除,該引用值可以為待刪除對(duì)象的偏移地址。
[0128]步驟302,Java卡虛擬機(jī)判斷對(duì)象堆中是否存在位于待刪除對(duì)象之前的寄生對(duì)象,如果是,則將待刪除對(duì)象的前一個(gè)寄生對(duì)象作為當(dāng)前寄生對(duì)象,并執(zhí)行步驟309;否則,執(zhí)行步驟303。
[0129]具體地,Java卡虛擬機(jī)可以從系統(tǒng)信息中獲取對(duì)象堆中的第一個(gè)寄生對(duì)象的地址,判斷對(duì)象堆中的第一個(gè)寄生對(duì)象的地址是否為空,如果為空,則確定對(duì)象堆中不存在位于待刪除對(duì)象之前的寄生對(duì)象;如果不為空,則判斷待刪除對(duì)象的地址是否小于對(duì)象堆中的第一個(gè)寄生對(duì)象的地址,如果是,則確定對(duì)象堆中不存在位于待刪除對(duì)象之前的寄生對(duì)象;否則,確定對(duì)象堆中存在位于待刪除對(duì)象之前的寄生對(duì)象。本實(shí)施例中,對(duì)象堆是從低地址向高地址使用的,待刪除對(duì)象的前一個(gè)寄生對(duì)象是指對(duì)象堆中地址比待刪除對(duì)象的地址小,且地址差值最小的寄生對(duì)象。
[0130]例如,當(dāng)待刪除對(duì)象的地址為“0x2157”時(shí),如果系統(tǒng)信息中存儲(chǔ)的對(duì)象堆中的第一個(gè)寄生對(duì)象的地址為“0x0000”或“0x2177”,則Java卡虛擬機(jī)確定對(duì)象堆中不存在位于待刪除對(duì)象之前的寄生對(duì)象;如果系統(tǒng)信息中存儲(chǔ)的對(duì)象堆中的第一個(gè)寄生對(duì)象的地址為“0x2146”,則Java卡虛擬機(jī)判斷出對(duì)象堆中的第一個(gè)寄生對(duì)象的地址小于待刪除對(duì)象的地址,進(jìn)而確定對(duì)象堆中存在位于待刪除對(duì)象之前的寄生對(duì)象。
[0131]步驟303, Java卡虛擬機(jī)從待刪除對(duì)象的地址開始,創(chuàng)建第三寄生對(duì)象。
[0132]具體地,Java卡虛擬機(jī)可以將第三寄生對(duì)象的類型字節(jié)的取值設(shè)置為第一預(yù)設(shè)值,將第三寄生對(duì)象的容量字節(jié)的取值設(shè)置為待刪除對(duì)象所占用的空間的大小,將第三寄生對(duì)象的地址字節(jié)的取值設(shè)置為空。
[0133]例如,當(dāng)?shù)谝活A(yù)設(shè)值為“01”,待刪除對(duì)象的地址為“0x2157”,占用的空間的大小為0x20個(gè)字節(jié)時(shí),Java卡虛擬機(jī)從地址“0x2157”開始,創(chuàng)建的第三寄生對(duì)象為“01 00000020”。
[0134]步驟304,Java卡虛擬機(jī)判斷對(duì)象堆中是否存在位于第三寄生對(duì)象之后的寄生對(duì)象,如果是,則執(zhí)行步驟305 ;否則,執(zhí)行步驟308。
[0135]具體地,Java卡虛擬機(jī)可以從系統(tǒng)信息中讀取對(duì)象堆中的第一個(gè)寄生對(duì)象的地址,判斷對(duì)象堆中的第一個(gè)寄生對(duì)象的地址是否為空,如果為空,則確定對(duì)象堆中不存在位于第三寄生對(duì)象之后的寄生對(duì)象;如果不為空,則確定對(duì)象堆中存在位于第三寄生對(duì)象之后的寄生對(duì)象。
[0136]例如,當(dāng)系統(tǒng)信息中存儲(chǔ)的對(duì)象堆中的第一個(gè)寄生對(duì)象的地址為“0x2177”時(shí),Java卡虛擬機(jī)判斷對(duì)象堆中的第一個(gè)寄生對(duì)象的地址不為空,進(jìn)而確定對(duì)象堆中存在位于第三寄生對(duì)象之后的寄生對(duì)象。
[0137]步驟305,Java卡虛擬機(jī)將根據(jù)第三寄生對(duì)象的后一個(gè)寄生對(duì)象的地址,對(duì)第三寄生對(duì)象進(jìn)行更新。
[0138]具體地,Java卡虛擬機(jī)可以從系統(tǒng)信息中讀取對(duì)象堆中的第一個(gè)寄生對(duì)象的地址,將對(duì)象堆中的第一個(gè)寄生對(duì)象的地址作為第三寄生對(duì)象的后一個(gè)寄生對(duì)象的地址,將第三寄生對(duì)象的地址字節(jié)的取值設(shè)置為第三寄生對(duì)象的后一個(gè)寄生對(duì)象的地址。
[0139]例如,當(dāng)系統(tǒng)信息中存儲(chǔ)的對(duì)象堆中的第一個(gè)寄生對(duì)象的地址為“ 0x2177 ”,第三寄生對(duì)象為“01 0000 0020”時(shí),Java卡虛擬機(jī)從系統(tǒng)信息中讀取對(duì)象堆中的第一個(gè)寄生對(duì)象的地址“0x2177”,將第三寄生對(duì)象更新為“01 2177 0020”。
[0140]步驟306,Java卡虛擬機(jī)判斷第三寄生對(duì)象所標(biāo)記的空閑空間是否與第三寄生對(duì)象的后一個(gè)寄生對(duì)象物理地址相鄰,如果是,則執(zhí)行步驟307 ;否則,執(zhí)行步驟308。
[0141]具體地,Java卡虛擬機(jī)可以獲取第三寄生對(duì)象的地址與第三寄生對(duì)象所標(biāo)記的空閑空間的大小相加得到的結(jié)果,并判斷該結(jié)果是否與第三寄生對(duì)象的后一個(gè)寄生對(duì)象的地址相同,如果是,則確定第三寄生對(duì)象所標(biāo)記的空閑空間與第三寄生對(duì)象的后一個(gè)寄生對(duì)象物理地址相鄰;否則,確定第三寄生對(duì)象所標(biāo)記的空閑空間與第三寄生對(duì)象的后一個(gè)寄生對(duì)象物理地址不相鄰。[0142]例如,當(dāng)?shù)谌纳鷮?duì)象為“01 2177 0020”,其地址為“0x2157”時(shí),Java卡虛擬機(jī)獲取第三寄生對(duì)象的地址“0x2157”與第三寄生對(duì)象所標(biāo)記的空閑空間的大小“0x20”相加得到的結(jié)果,即,0x2157+0x20=0x2177,與第三寄生對(duì)象的后一個(gè)寄生對(duì)象的地址相同,Java卡虛擬機(jī)確定第三寄生對(duì)象所標(biāo)記的空閑空間與第三寄生對(duì)象的后一個(gè)寄生對(duì)象物理地址相鄰。
[0143]步驟307,Java卡虛擬機(jī)根據(jù)第三寄生對(duì)象的后一個(gè)寄生對(duì)象,對(duì)第三寄生對(duì)象進(jìn)行更新,并執(zhí)行步驟308。
[0144]具體地,Java卡虛擬機(jī)可以將第三寄生對(duì)象的地址字節(jié)的取值,更新為第三寄生對(duì)象的后一個(gè)寄生對(duì)象的地址字節(jié)的取值,讀取第三寄生對(duì)象的后一個(gè)寄生對(duì)象的容量字節(jié),將該容量字節(jié)的取值與第三寄生對(duì)象的容量字節(jié)的取值相加,將得到的結(jié)果作為更新后的第三寄生對(duì)象的容量字節(jié)的取值。
[0145]例如,當(dāng)?shù)谌纳鷮?duì)象為“01 2177 0020”,第三寄生對(duì)象的后一個(gè)寄生對(duì)象為“01 2298 0010”時(shí),Java卡虛擬機(jī)可以將第三寄生對(duì)象的地址字節(jié)的取值,更新為第三寄生對(duì)象的后一個(gè)寄生對(duì)象的地址字節(jié)的取值“xx2298”,獲取第三寄生對(duì)象的后一個(gè)寄生對(duì)象的容量字節(jié)的取值“0x10”與第三寄生對(duì)象的容量字節(jié)的取值“0x20”相加得到的結(jié)果,即,0x10+0x20=0x30,將得到的結(jié)果作為更新后的第三寄生對(duì)象的容量字節(jié)的取值,更新后的第三寄生對(duì)象為“01 22980030”。
[0146]步驟308,Java卡虛擬機(jī)將該第三寄生對(duì)象的地址作為對(duì)象堆中的第一個(gè)寄生對(duì)象的地址存儲(chǔ)到系統(tǒng)信息中,結(jié)束流程。
[0147]例如,當(dāng)?shù)谌纳鷮?duì)象的地址為“0x2157”時(shí),Java卡虛擬機(jī)將系統(tǒng)信息中存儲(chǔ)的對(duì)象堆中的第一個(gè)寄生對(duì)象的地址更新為“0x2157”。
[0148]步驟309,Java卡虛擬機(jī)判斷當(dāng)前寄生對(duì)象所標(biāo)記的空閑空間是否與待刪除對(duì)象物理地址相鄰,如果是,則執(zhí)行步驟310 ;否則,執(zhí)行步驟313。
[0149]具體地,Java卡虛擬機(jī)可以讀取當(dāng)前寄生對(duì)象的容量字節(jié)的取值,將該取值與當(dāng)前寄生對(duì)象的地址相加,判斷得到的結(jié)果是否與待刪除對(duì)象的地址相同,如果相同,則確定當(dāng)前寄生對(duì)象所標(biāo)記的空閑空間與待刪除對(duì)象物理地址相鄰;否則,確定當(dāng)前寄生對(duì)象所標(biāo)記的空閑空間與待刪除對(duì)象物理地址不相鄰。
[0150]例如,當(dāng)前寄生對(duì)象為“01 2177 0011”,其地址為“0x2146”,待刪除對(duì)象的地址為“0x2157”時(shí),Java卡虛擬機(jī)將當(dāng)前寄生對(duì)象的容量字節(jié)的取值“0x11”與當(dāng)前寄生對(duì)象的地址“0x2146”相加,得到“0x2157”,與待刪除對(duì)象的地址相同,確定當(dāng)前寄生對(duì)象所標(biāo)記的空閑空間與待刪除對(duì)象物理地址相鄰。
[0151]步驟310,Java卡虛擬機(jī)根據(jù)待刪除對(duì)象所占用的空間的大小,更新當(dāng)前寄生對(duì)象。
[0152]具體地,Java卡虛擬機(jī)可以將當(dāng)前寄生對(duì)象的容量字節(jié)的取值與待刪除對(duì)象所占用的空間的大小相加,將得到的結(jié)果作為更新后的當(dāng)前寄生對(duì)象的容量字節(jié)的取值。
[0153]例如,當(dāng)前寄生對(duì)象為“01 2177 0011”,待刪除對(duì)象所占用的空間的大小為0x20個(gè)字節(jié)時(shí),Java卡虛擬機(jī)將當(dāng)前寄生對(duì)象的容量字節(jié)的取值“0x11”與待刪除對(duì)象所占用的空間的大小相加,得到的結(jié)果為“0x31”,更新后的當(dāng)前寄生對(duì)象為“01 2177 0031”。
[0154]步驟311,Java卡虛擬機(jī)判斷當(dāng)前寄生對(duì)象所標(biāo)記的空閑空間是否與當(dāng)前寄生對(duì)象的后一個(gè)寄生對(duì)象物理地址相鄰,如果是,則執(zhí)行步驟312 ;否則,結(jié)束流程。
[0155]具體地,Java卡虛擬機(jī)可以讀取當(dāng)前寄生對(duì)象的容量字節(jié)的取值,將該取值與當(dāng)前寄生對(duì)象的地址相加,判斷得到的結(jié)果是否與當(dāng)前寄生對(duì)象的后一個(gè)寄生對(duì)象的地址相同,如果相同,則確定當(dāng)前寄生對(duì)象所標(biāo)記的空閑空間與當(dāng)前寄生對(duì)象的后一個(gè)寄生對(duì)象物理地址相鄰;否則,確定當(dāng)前寄生對(duì)象所標(biāo)記的空閑空間與當(dāng)前寄生對(duì)象的后一個(gè)寄生對(duì)象物理地址不相鄰。
[0156]例如,當(dāng)前寄生對(duì)象為“01 2177 0031”,其地址為“0x2146”,當(dāng)前寄生對(duì)象的后一個(gè)寄生對(duì)象的地址為“0x2177”時(shí),Java卡虛擬機(jī)將當(dāng)前寄生對(duì)象的容量字節(jié)的取值“0x31”與當(dāng)前寄生對(duì)象的地址“0x2146”相加,得到“0x2177”,與當(dāng)前寄生對(duì)象的后一個(gè)寄生對(duì)象的地址相同,確定當(dāng)前寄生對(duì)象所標(biāo)記的空閑空間與當(dāng)前寄生對(duì)象的后一個(gè)寄生對(duì)象物理地址相鄰。
[0157]步驟312, Java卡虛擬機(jī)根據(jù)當(dāng)前寄生對(duì)象的后一個(gè)寄生對(duì)象,更新當(dāng)前寄生對(duì)象,結(jié)束流程。
[0158]具體地,Java卡虛擬機(jī)可以將當(dāng)前寄生對(duì)象的地址字節(jié)的取值更新為當(dāng)前寄生對(duì)象的后一個(gè)寄生對(duì)象的地址字節(jié)的取值,將當(dāng)前寄生對(duì)象的容量字節(jié)的取值與當(dāng)前寄生對(duì)象的后一個(gè)寄生對(duì)象的容量字節(jié)的取值相加,將得到的結(jié)果作為更新后的當(dāng)前寄生對(duì)象的容量字節(jié)的取值。
[0159]例如,當(dāng)前寄生對(duì)象為“01 2177 0031”,當(dāng)前寄生對(duì)象的后一個(gè)寄生對(duì)象為“012298 0010”時(shí),Java卡虛擬機(jī)將當(dāng)前寄生對(duì)象的地址字節(jié)的取值更新為當(dāng)前寄生對(duì)象的后一個(gè)寄生對(duì)象的地址字節(jié)的取值“0x2298”,將當(dāng)前寄生對(duì)象的容量字節(jié)的取值“0x31”與當(dāng)前寄生對(duì)象的后一個(gè)寄生對(duì)象的容量字節(jié)的取值“0x10”相加,將得到的結(jié)果作為更新后的當(dāng)前寄生對(duì)象的容量字節(jié)的取值,更新后的當(dāng)前寄生對(duì)象為“01 2298 0041”。
[0160]步驟313,Java卡虛擬機(jī)從待刪除對(duì)象的地址開始,創(chuàng)建第四寄生對(duì)象。
[0161]具體地,Java卡虛擬機(jī)可以將第四寄生對(duì)象的容量字節(jié)的取值設(shè)置為待刪除對(duì)象所占用的空間的大小,將第四寄生對(duì)象的類型字節(jié)的取值設(shè)置為第一預(yù)設(shè)值,將第四寄生對(duì)象的地址字節(jié)設(shè)置為空。
[0162]例如,當(dāng)?shù)谝活A(yù)設(shè)值為“0x01”,待刪除對(duì)象所占用的空間的大小為0x20個(gè)字節(jié),其地址為“0x2157”時(shí),Java卡虛擬機(jī)在地址“0x2157”上創(chuàng)建第四寄生對(duì)象“01 00000020”。
[0163]步驟314,Java卡虛擬機(jī)判斷對(duì)象堆中是否存在位于第四寄生對(duì)象之后的寄生對(duì)象,如果是,則執(zhí)行步驟316 ;否則,執(zhí)行步驟315。
[0164]具體地,Java卡虛擬機(jī)可以讀取當(dāng)前寄生對(duì)象的地址字節(jié),判斷該地址字節(jié)的取值是否為空,如果是,則確定對(duì)象堆中不存在位于第四寄生對(duì)象之后的寄生對(duì)象;否則,確定對(duì)象堆中存在位于第四寄生對(duì)象之后的寄生對(duì)象。
[0165]例如,當(dāng)前寄生對(duì)象為“01 2177 0011”時(shí),Java卡虛擬機(jī)讀取當(dāng)前寄生對(duì)象的地址字節(jié)“xx2177”,判斷出該地址字節(jié)的取值不為空,進(jìn)而確定對(duì)象堆中存在位于第四寄生對(duì)象之后的寄生對(duì)象;當(dāng)前寄生對(duì)象為“01 0000 0011”時(shí),Java卡虛擬機(jī)讀取當(dāng)前寄生對(duì)象的地址字節(jié)“0x0000”,判斷出該地址字節(jié)的取值為空,進(jìn)而確定對(duì)象堆中不存在位于第四寄生對(duì)象之后的寄生對(duì)象。[0166]步驟315,Java卡虛擬機(jī)根據(jù)第四寄生對(duì)象的地址更新當(dāng)前寄生對(duì)象,結(jié)束流程。
[0167]具體地,Java卡虛擬機(jī)可以將當(dāng)前寄生對(duì)象的地址字節(jié)的取值,更新為第四寄生對(duì)象的地址。
[0168]例如,當(dāng)?shù)谒募纳鷮?duì)象的地址為“0x2157”,當(dāng)前寄生對(duì)象為“01 0000 0011”時(shí),Java卡虛擬機(jī)將當(dāng)前寄生對(duì)象更新為“01 2157 0011”。
[0169]步驟316,Java卡虛擬機(jī)根據(jù)第四寄生對(duì)象的后一個(gè)寄生對(duì)象的地址,對(duì)第四寄生對(duì)象進(jìn)行更新,并根據(jù)第四寄生對(duì)象的地址更新當(dāng)前寄生對(duì)象。
[0170]具體地,Java卡虛擬機(jī)可以讀取當(dāng)前寄生對(duì)象的地址字節(jié),將第四寄生對(duì)象的地址字節(jié)的取值更新為當(dāng)前寄生對(duì)象的地址字節(jié)的取值,并將當(dāng)前寄生對(duì)象的地址字節(jié)的取值更新為第四寄生對(duì)象的地址。
[0171]例如,當(dāng)?shù)谒募纳鷮?duì)象為“01 0000 0020”,其地址為“0x2157”,當(dāng)前寄生對(duì)象為“01 2177 0011”時(shí),Java卡虛擬機(jī)將第四寄生對(duì)象更新為“01 2177 0020”,將當(dāng)前寄生對(duì)象為 “01 2157 0011”。
[0172]步驟317,Java卡虛擬機(jī)判斷第四寄生對(duì)象所標(biāo)記的空閑空間是否與第四寄生對(duì)象的后一個(gè)寄生對(duì)象物理地址相鄰,如果是,則執(zhí)行步驟318 ;否則,結(jié)束流程。
[0173]具體地,Java卡虛擬機(jī)可以讀取第四寄生對(duì)象的容量字節(jié)的取值,將該取值與第四寄生對(duì)象的地址相加,并判斷得到的結(jié)果是否與第四寄生對(duì)象的地址字節(jié)的取值相同,如果是,則確定第四寄生對(duì)象所標(biāo)記的空閑空間與第四寄生對(duì)象的后一個(gè)寄生對(duì)象物理地址相鄰;否則,確定第四寄生對(duì)象所標(biāo)記的空閑空間與第四寄生對(duì)象的后一個(gè)寄生對(duì)象物理地址不相鄰。
[0174]例如,當(dāng)?shù)谒募纳鷮?duì)象為“01 2177 0020”,其地址為“0x2157”時(shí),Java卡虛擬機(jī)將第四寄生對(duì)象的容量字節(jié)的取值“0x20”與第四寄生對(duì)象的地址“0x2157”相加,得到“0x2177”,與第四寄生對(duì)象的地址字節(jié)的取值相同,確定第四寄生對(duì)象所標(biāo)記的空閑空間與第四寄生對(duì)象的后一個(gè)寄生對(duì)象物理地址相鄰。
[0175]步驟318,Java卡虛擬機(jī)根據(jù)第四寄生對(duì)象的后一個(gè)寄生對(duì)象,對(duì)第四寄生對(duì)象進(jìn)行更新,結(jié)束流程。
[0176]具體地,Java卡虛擬機(jī)可以將第四寄生對(duì)象的地址字節(jié)的取值,更新為第四寄生對(duì)象的后一個(gè)寄生對(duì)象的地址字節(jié)的取值,讀取第四寄生對(duì)象的后一個(gè)寄生對(duì)象的容量字節(jié),將該容量字節(jié)的取值與第四寄生對(duì)象的容量字節(jié)的取值相加,將得到的結(jié)果作為更新后的第四寄生對(duì)象的容量字節(jié)的取值。
[0177]例如,第四寄生對(duì)象為“01 2177 0020”,第四寄生對(duì)象的后一個(gè)寄生對(duì)象為“012298 0010”時(shí),Java卡虛擬機(jī)將第四寄生對(duì)象的地址字節(jié)的取值更新為第四寄生對(duì)象的后一個(gè)寄生對(duì)象的地址字節(jié)的取值“0x2298”,將第四寄生對(duì)象的容量字節(jié)的取值“0x20”與第四寄生對(duì)象的后一個(gè)寄生對(duì)象的容量字節(jié)的取值“0x10”相加,將得到的結(jié)果作為更新后的第四寄生對(duì)象的容量字節(jié)的取值,更新后的第四寄生對(duì)象為“01 2298 0030”。
[0178]本發(fā)明實(shí)施例的技術(shù)方案中,Java卡虛擬機(jī)通過(guò)使用寄生對(duì)象標(biāo)記對(duì)象堆中的空閑空間,并根據(jù)寄生對(duì)象在對(duì)象堆中為待創(chuàng)建對(duì)象申請(qǐng)空間,能夠有效地管理對(duì)象堆中的空閑空間,提高對(duì)象堆的空間利用率Java卡虛擬機(jī)在執(zhí)行完刪包或刪應(yīng)用操作后,以及在檢測(cè)到j(luò)ava卡應(yīng)用程序調(diào)用與垃圾回收對(duì)應(yīng)的預(yù)設(shè)API后,僅需要執(zhí)行一個(gè)空操作,而不再需要通過(guò)移動(dòng)對(duì)象堆中的已創(chuàng)建對(duì)象進(jìn)行垃圾回收,減少了對(duì)已創(chuàng)建對(duì)象的移動(dòng)次數(shù)以及移動(dòng)對(duì)象帶來(lái)的時(shí)間消耗,提高了 Java卡虛擬機(jī)的工作效率,并在一定程度上達(dá)到磨損平衡。
[0179]本發(fā)明實(shí)施例還提供了一種使用寄生對(duì)象管理對(duì)象堆的裝置,寄生對(duì)象用于標(biāo)記對(duì)象堆中的空閑空間,包括地址字節(jié)和容量字節(jié),地址字節(jié)用于表示寄生對(duì)象的后一個(gè)寄生對(duì)象的地址,容量字節(jié)用于表示寄生對(duì)象所標(biāo)記的空閑空間的大小,系統(tǒng)信息中存儲(chǔ)有對(duì)象堆中的第一個(gè)寄生對(duì)象的地址。
[0180]上述裝置的結(jié)構(gòu),如圖11至圖14所示,包括:
[0181]第一讀取模塊410,用于在需要在對(duì)象堆中創(chuàng)建非寄生對(duì)象時(shí),讀取對(duì)象堆中的第一個(gè)寄生對(duì)象,將第一個(gè)寄生對(duì)象作為當(dāng)前寄生對(duì)象,并觸發(fā)第一判斷模塊420 ;
[0182]第一判斷模塊420,用于判斷當(dāng)前寄生對(duì)象所標(biāo)記的空閑空間是否小于待創(chuàng)建對(duì)象所占用的空間,并在判斷出當(dāng)前寄生對(duì)象所標(biāo)記的空閑空間小于待創(chuàng)建對(duì)象所占用的空間時(shí),觸發(fā)第二判斷模塊430;
[0183]第二判斷模塊430,用于判斷對(duì)象堆中是否存在當(dāng)前寄生對(duì)象的后一個(gè)寄生對(duì)象,并在判斷出對(duì)象堆中不存在當(dāng)前寄生對(duì)象的后一個(gè)寄生對(duì)象時(shí),觸發(fā)合并模塊450 ;
[0184]第一更新模塊440,用于在第二判斷模塊430判斷出對(duì)象堆中存在當(dāng)前寄生對(duì)象的后一個(gè)寄生對(duì)象時(shí),將當(dāng)如寄生對(duì)象的后一個(gè)寄生對(duì)象,作為更新后的當(dāng)如寄生對(duì)象,并觸發(fā)第二判斷模塊430 ;
[0185]合并模塊450,用于將對(duì)象堆中的所有空閑空間進(jìn)行合并,根據(jù)合并后的空閑空間創(chuàng)建對(duì)應(yīng)的寄生對(duì)象;
[0186]其中,上述合并模塊450,如圖12所示包括:
[0187]第一獲取子模塊451,用于將對(duì)象堆中的第一個(gè)非寄生對(duì)象作為當(dāng)前對(duì)象,獲取當(dāng)前對(duì)象的地址減去對(duì)象堆的首地址得到的差值,將空閑空間變量初始化為差值,并觸發(fā)第七判斷子模塊452 ;
[0188]第七判斷子模塊452,用于判斷當(dāng)前對(duì)象的地址是否小于對(duì)象堆中最后一個(gè)非寄生對(duì)象的地址;
[0189]第八判斷子模塊453,用于在第七判斷子模塊452判斷出當(dāng)前對(duì)象的地址小于對(duì)象堆中最后一個(gè)非寄生對(duì)象的地址時(shí),判斷空閑空間變量的取值是否為零,并在判斷出空閑空間變量的取值為零時(shí),觸發(fā)第二獲取子模塊455 ;
[0190]第三更新子模塊454,用于在第八判斷子模塊453判斷出空閑空間變量的取值不為零時(shí),根據(jù)空閑空間變量的取值,將當(dāng)前對(duì)象前移,更新當(dāng)前對(duì)象在對(duì)象表中的引用值,并觸發(fā)第二獲取子模塊455;
[0191]第二獲取子模塊455,用于獲取當(dāng)前對(duì)象的后一個(gè)非寄生對(duì)象的地址減去當(dāng)前對(duì)象的地址和當(dāng)前對(duì)象占用的空間的大小得到的差值,將空閑空間變量更新為差值,將當(dāng)前對(duì)象的后一個(gè)非寄生對(duì)象作為更新后的當(dāng)前對(duì)象,并觸發(fā)第七判斷子模塊452 ;
[0192]第三處理子模塊456,用于在第七判斷子模塊452判斷出當(dāng)前對(duì)象的地址不小于對(duì)象堆中最后一個(gè)非寄生對(duì)象的地址時(shí),根據(jù)空閑空間變量的取值,將當(dāng)前對(duì)象前移,更新當(dāng)前對(duì)象在對(duì)象表中的引用值;將當(dāng)前對(duì)象的地址與當(dāng)前對(duì)象占用的空間的大小相加,將得到的結(jié)果作為地址,創(chuàng)建對(duì)應(yīng)的寄生對(duì)象。[0193]第三判斷模塊460,用于判斷合并模塊450合并后的空閑空間是否小于待創(chuàng)建對(duì)象所占用的空間,并在判斷出合并后的空閑空間小于待創(chuàng)建對(duì)象所占用的空間時(shí),觸發(fā)第一處理模塊480 ;
[0194]保存模塊470,用于在第三判斷模塊460判斷出合并后的空閑空間小于待創(chuàng)建對(duì)象所占用的空間時(shí),將創(chuàng)建的寄生對(duì)象的地址作為對(duì)象堆中的第一個(gè)寄生對(duì)象的地址保存到系統(tǒng)信息中;
[0195]第一處理模塊480,用于讀取當(dāng)前寄生對(duì)象的地址字節(jié),將讀取到的結(jié)果作為對(duì)象堆中的第一個(gè)寄生對(duì)象的地址保存到系統(tǒng)信息中;從當(dāng)前寄生對(duì)象的地址開始,為待創(chuàng)建對(duì)象申請(qǐng)空間,獲取申請(qǐng)空間后的剩余空間;
[0196]第四判斷模塊490,用于判斷第一處理模塊480獲取的剩余空間是否大于寄生對(duì)象所占用的空間;
[0197]第一創(chuàng)建模塊500,用于在第四判斷模塊490判斷出剩余空間大于寄生對(duì)象所占用的空間時(shí),從剩余空間的首地址開始,創(chuàng)建第一寄生對(duì)象,將第一寄生對(duì)象的地址作為對(duì)象堆中的第一個(gè)寄生對(duì)象的地址保存到系統(tǒng)信息中;
[0198]第二處理模塊510,用于在第一判斷模塊420判斷出當(dāng)前寄生對(duì)象所標(biāo)記的空閑空間不小于待創(chuàng)建對(duì)象所占用的空間時(shí),從當(dāng)前寄生對(duì)象的地址開始,為待創(chuàng)建對(duì)象申請(qǐng)空間,并對(duì)當(dāng)前寄生對(duì)象的前一個(gè)寄生對(duì)象,和/或系統(tǒng)信息中存儲(chǔ)的對(duì)象堆中的第一個(gè)寄生對(duì)象的地址進(jìn)行更新。
[0199]其中,上述第二處理模塊510,如圖13所示包括:
[0200]第一判斷子模塊511,用于在第一判斷模塊420判斷出當(dāng)前寄生對(duì)象所標(biāo)記的空閑空間不小于待創(chuàng)建對(duì)象所占用的空間時(shí),判斷當(dāng)前寄生對(duì)象是否為對(duì)象堆中的第一個(gè)寄生對(duì)象,并在判斷出當(dāng)前寄生對(duì)象為對(duì)象堆中的第一個(gè)寄生對(duì)象時(shí),觸發(fā)第一處理模塊480 ;
[0201]第一處理子模塊512,用于在第一判斷子模塊511判斷出當(dāng)前寄生對(duì)象不是對(duì)象堆中的第一個(gè)寄生對(duì)象時(shí),將當(dāng)前寄生對(duì)象的前一個(gè)寄生對(duì)象的地址字節(jié)的取值,更新為當(dāng)前寄生對(duì)象的地址字節(jié)的取值;從當(dāng)前寄生對(duì)象的地址開始,為待創(chuàng)建對(duì)象申請(qǐng)空間,獲取申請(qǐng)空間后的剩余空間;
[0202]第二判斷子模塊513,用于判斷第一處理子模塊512獲取的剩余空間是否大于寄生對(duì)象所占用的空間;
[0203]第一創(chuàng)建子模塊514,用于在第二判斷子模塊513判斷第一處理子模塊512獲取的剩余空間大于寄生對(duì)象所占用的空間時(shí),從剩余空間的首地址開始,創(chuàng)建第二寄生對(duì)象,將第二寄生對(duì)象的前一個(gè)寄生對(duì)象的地址字節(jié)的取值更新為第二寄生對(duì)象的地址。
[0204]進(jìn)一步地,上述裝置,還包括:
[0205]獲取模塊520,用于從系統(tǒng)信息中獲取對(duì)象堆中的第一個(gè)寄生對(duì)象的地址;
[0206]第五判斷模塊530,用于判斷獲取模塊520獲取到的地址是否為空,如果是,則觸發(fā)合并模塊450 ;否則,觸發(fā)第一讀取模塊410。
[0207]刪除模塊540,用于將待刪除對(duì)象從對(duì)象表中刪除;
[0208]第二更新模塊550,用于根據(jù)待刪除對(duì)象的地址和待刪除對(duì)象所占用的空間的大小,對(duì)待刪除對(duì)象的前一個(gè)寄生對(duì)象和/或后一個(gè)寄生對(duì)象進(jìn)行更新。[0209]其中,上述第二更新模塊550如圖14所示包括:
[0210]第三判斷子模塊551,用于判斷對(duì)象堆中是否存在位于待刪除對(duì)象之前的寄生對(duì)象;
[0211]具體地,上述第三判斷子模塊551,具體用于從系統(tǒng)信息中獲取對(duì)象堆中的第一個(gè)寄生對(duì)象的地址,判斷對(duì)象堆中的第一個(gè)寄生對(duì)象的地址是否為空,如果為空,則確定對(duì)象堆中不存在位于待刪除對(duì)象之前的寄生對(duì)象;如果不為空,則判斷待刪除對(duì)象的地址是否小于對(duì)象堆中的第一個(gè)寄生對(duì)象的地址,如果是,則確定對(duì)象堆中不存在位于待刪除對(duì)象之iu的寄生對(duì)象;否則,確定對(duì)象堆中存在位于待刪除對(duì)象之如的寄生對(duì)象;
[0212]第二創(chuàng)建子模塊552,用于在第三判斷子模塊551判斷出對(duì)象堆中不存在位于待刪除對(duì)象之前的寄生對(duì)象時(shí),從待刪除對(duì)象的地址開始,創(chuàng)建第三寄生對(duì)象,并觸發(fā)第四判斷子模塊553 ;
[0213]第四判斷子模塊553,用于判斷對(duì)象堆中是否存在位于第三寄生對(duì)象之后的寄生對(duì)象;
[0214]具體地,上述第四判斷子模塊553,具體用于從系統(tǒng)信息中獲取對(duì)象堆中的第一個(gè)寄生對(duì)象的地址,判斷對(duì)象堆中的第一個(gè)寄生對(duì)象的地址是否為空,如果為空,則確定對(duì)象堆中不存在位于第三寄生對(duì)象之后的寄生對(duì)象;如果不為空,則確定對(duì)象堆中存在位于第二寄生對(duì)象之后的寄生對(duì)象;
[0215]第二處理子模塊554,用于在第四判斷子模塊553判斷出對(duì)象堆中存在位于第三寄生對(duì)象之后的寄生對(duì)象時(shí),根據(jù)第三寄生對(duì)象的后一個(gè)寄生對(duì)象,對(duì)第三寄生對(duì)象進(jìn)行更新,并將第三寄生對(duì)象的地址作為對(duì)象堆中的第一個(gè)寄生對(duì)象的地址存儲(chǔ)到系統(tǒng)信息中;
[0216]具體地,上述第二創(chuàng)建子模塊552,具體用于在第三判斷子模塊551判斷出對(duì)象堆中不存在位于待刪除對(duì)象之前的寄生對(duì)象時(shí),將待刪除對(duì)象的地址作為第三寄生對(duì)象的地址,將第三寄生對(duì)象的容量字節(jié)的取值設(shè)置為待刪除對(duì)象所占用的空間的大小,將第三寄生對(duì)象的地址字節(jié)的取值設(shè)置為空,并觸發(fā)第四判斷子模塊553 ;
[0217]相應(yīng)地,上述第二處理子模塊554,具體用于在第四判斷子模塊553判斷出對(duì)象堆中存在位于第三寄生對(duì)象之后的寄生對(duì)象時(shí),判斷第三寄生對(duì)象所標(biāo)記的空閑空間是否與第三寄生對(duì)象的后一個(gè)寄生對(duì)象物理地址相鄰;
[0218]如果是,則將第三寄生對(duì)象的地址字節(jié)的取值,更新為第三寄生對(duì)象的后一個(gè)寄生對(duì)象的地址字節(jié)的取值;將第三寄生對(duì)象的后一個(gè)寄生對(duì)象的容量字節(jié)的取值與第三寄生對(duì)象的容量字節(jié)的取值相加,將得到的結(jié)果作為更新后的第三寄生對(duì)象的容量字節(jié)的取值,并將第三寄生對(duì)象的地址作為對(duì)象堆中的第一個(gè)寄生對(duì)象的地址存儲(chǔ)到系統(tǒng)信息中;
[0219]否則,將第三寄生對(duì)象的地址字節(jié)的取值,更新為第三寄生對(duì)象的后一個(gè)寄生對(duì)象的地址,將第三寄生對(duì)象的地址作為對(duì)象堆中的第一個(gè)寄生對(duì)象的地址存儲(chǔ)到系統(tǒng)信息中。
[0220]具體地,上述第二處理子模塊554,具體用于在第四判斷子模塊553判斷出對(duì)象堆中存在位于第三寄生對(duì)象之后的寄生對(duì)象時(shí),獲取第三寄生對(duì)象的地址與第三寄生對(duì)象的容量字節(jié)的取值相加得到的結(jié)果,判斷結(jié)果是否與第三寄生對(duì)象的后一個(gè)寄生對(duì)象的地址相同;[0221]如果是,則確定第三寄生對(duì)象所標(biāo)記的空閑空間與第三寄生對(duì)象的后一個(gè)寄生對(duì)象物理地址相鄰,將第三寄生對(duì)象的地址字節(jié)的取值,更新為第三寄生對(duì)象的后一個(gè)寄生對(duì)象的地址字節(jié)的取值;將第三寄生對(duì)象的后一個(gè)寄生對(duì)象的容量字節(jié)的取值與第三寄生對(duì)象的容量字節(jié)的取值相加,將得到的結(jié)果作為更新后的第三寄生對(duì)象的容量字節(jié)的取值,并將第三寄生對(duì)象的地址作為對(duì)象堆中的第一個(gè)寄生對(duì)象的地址存儲(chǔ)到系統(tǒng)信息中;
[0222]否則,確定第三寄生對(duì)象所標(biāo)記的空閑空間與第三寄生對(duì)象的后一個(gè)寄生對(duì)象物理地址不相鄰,將第三寄生對(duì)象的地址字節(jié)的取值,更新為第三寄生對(duì)象的后一個(gè)寄生對(duì)象的地址,將第三寄生對(duì)象的地址作為對(duì)象堆中的第一個(gè)寄生對(duì)象的地址存儲(chǔ)到系統(tǒng)信息中。
[0223]保存子模塊555,用于在第四判斷子模塊553判斷出對(duì)象堆中存在位于第三寄生對(duì)象之后的寄生對(duì)象時(shí),將第三寄生對(duì)象的地址作為對(duì)象堆中的第一個(gè)寄生對(duì)象的地址存儲(chǔ)到系統(tǒng)信息中;
[0224]第五判斷子模塊556,用于在第三判斷子模塊551判斷出對(duì)象堆中存在位于待刪除對(duì)象之前的寄生對(duì)象時(shí),判斷待刪除對(duì)象的前一個(gè)寄生對(duì)象所標(biāo)記的空閑空間是否與待刪除對(duì)象物理地址相鄰;
[0225]具體地,上述第五判斷子模塊556,具體用于在第三判斷子模塊551判斷出對(duì)象堆中存在位于待刪除對(duì)象之前的寄生對(duì)象時(shí),將待刪除對(duì)象的前一個(gè)寄生對(duì)象的容量字節(jié)的取值與前一個(gè)寄生對(duì)象的地址相加,判斷得到的結(jié)果是否與待刪除對(duì)象的地址相同,如果相同,則確定待刪除對(duì)象的前一個(gè)寄生對(duì)象所標(biāo)記的空閑空間與待刪除對(duì)象物理地址相鄰;否則,確定待刪除對(duì)象的前一個(gè)寄生對(duì)象所標(biāo)記的空閑空間與待刪除對(duì)象物理地址不相鄰。
[0226]第一更新子模塊557,用于在第五判斷子模塊556判斷出待刪除對(duì)象的前一個(gè)寄生對(duì)象所標(biāo)記的空閑空間與待刪除對(duì)象物理地址相鄰時(shí),根據(jù)待刪除對(duì)象更新待刪除對(duì)象的iu —個(gè)寄生對(duì)象;
[0227]具體地,上述第一更新子模塊557,具體用于在第五判斷子模塊判斷出待刪除對(duì)象的前一個(gè)寄生對(duì)象所標(biāo)記的空閑空間與待刪除對(duì)象物理地址相鄰時(shí),執(zhí)行以下操作:
[0228]Cl、判斷對(duì)象堆中是否存在位于待刪除對(duì)象之后的寄生對(duì)象,如果是,則執(zhí)行步驟C2 ;否則,執(zhí)行步驟C5 ;
[0229]C2、判斷待刪除對(duì)象的后一個(gè)寄生對(duì)象所標(biāo)記的空閑空間是否與待刪除對(duì)象物理地址相鄰,如果是,則執(zhí)行步驟C3 ;否則,執(zhí)行步驟C4 ;
[0230]C3、將待刪除對(duì)象的后一個(gè)寄生對(duì)象的容量字節(jié)的取值、待刪除對(duì)象的前一個(gè)寄生對(duì)象的容量字節(jié)的取值以及待刪除對(duì)象所占用的空間的大小相加,將待刪除對(duì)象的前一個(gè)寄生對(duì)象的容量字節(jié)的取值更新為上述相加得到的結(jié)果,將待刪除對(duì)象的前一個(gè)寄生對(duì)象的地址字節(jié)的取值,更新為待刪除對(duì)象的后一個(gè)寄生對(duì)象的地址字節(jié)的取值;
[0231]C4、將待刪除對(duì)象的前一個(gè)寄生對(duì)象的容量字節(jié)的取值和待刪除對(duì)象所占用的空間的大小相加,將待刪除對(duì)象的前一個(gè)寄生對(duì)象的容量字節(jié)的取值更新為上述相加得到的結(jié)果,將待刪除對(duì)象的前一個(gè)寄生對(duì)象的地址字節(jié)的取值,更新為待刪除對(duì)象的后一個(gè)寄生對(duì)象的地址;
[0232]C4、將待刪除對(duì)象的前一個(gè)寄生對(duì)象的容量字節(jié)的取值和待刪除對(duì)象所占用的空間的大小相加,將待刪除對(duì)象的前一個(gè)寄生對(duì)象的容量字節(jié)的取值更新為上述相加得到的結(jié)果。
[0233]其中,上述第一更新子模塊557判斷對(duì)象堆中是否存在位于待刪除對(duì)象之后的寄生對(duì)象,具體為:
[0234]第一更新子模塊577判斷待刪除對(duì)象的前一個(gè)寄生對(duì)象的地址字節(jié)的取值是否為空,如果是,則確定對(duì)象堆中不存在位于待刪除對(duì)象之后的寄生對(duì)象;否則,確定對(duì)象堆中存在位于待刪除對(duì)象之后的寄生對(duì)象。
[0235]上述第一更新子模塊557判斷待刪除對(duì)象的后一個(gè)寄生對(duì)象所標(biāo)記的空閑空間是否與待刪除對(duì)象物理地址相鄰,具體為:
[0236]第一更新子模塊557將待刪除對(duì)象的地址與待刪除對(duì)象所占用的空間的大小相力口,判斷得到的結(jié)果是否與待刪除對(duì)象的地址的后一個(gè)寄生對(duì)象相同,如果相同,則確定待刪除對(duì)象的后一個(gè)寄生對(duì)象所標(biāo)記的空閑空間與待刪除對(duì)象物理地址相鄰;否則,確定待刪除對(duì)象的后一個(gè)寄生對(duì)象所標(biāo)記的空閑空間與待刪除對(duì)象物理地址不相鄰。
[0237]第三創(chuàng)建子模塊558,用于在第五判斷子模塊556判斷出待刪除對(duì)象的前一個(gè)寄生對(duì)象所標(biāo)記的空閑空間與待刪除對(duì)象物理地址不相鄰時(shí),從待刪除對(duì)象的地址開始,創(chuàng)建第四寄生對(duì)象,將第四寄生對(duì)象的前一個(gè)寄生對(duì)象的地址字節(jié)的取值,更新為第四寄生對(duì)象的地址;
[0238]具體地,上述第三創(chuàng)建子模塊558,具體用于在第五判斷子模塊556判斷出待刪除對(duì)象的前一個(gè)寄生對(duì)象所標(biāo)記的空閑空間與待刪除對(duì)象物理地址不相鄰時(shí),將待刪除對(duì)象的地址作為第四寄生對(duì)象的地址,將第四寄生對(duì)象的容量字節(jié)的取值設(shè)置為待刪除對(duì)象所占用的空間的大小,將第四寄生對(duì)象的地址字節(jié)設(shè)置為空,將第四寄生對(duì)象的前一個(gè)寄生對(duì)象的地址字節(jié)的取值,更新為第四寄生對(duì)象的地址;
[0239]第六判斷子模塊559,用于判斷對(duì)象堆中是否存在位于第三創(chuàng)建子模塊558創(chuàng)建的第四寄生對(duì)象之后的寄生對(duì)象;
[0240]具體地,上述第六判斷子模塊559,具體用于判斷待刪除對(duì)象的前一個(gè)寄生對(duì)象的地址字節(jié)的取值是否為空,如果是,則確定對(duì)象堆中不存在位于第四寄生對(duì)象之后的寄生對(duì)象;否則,確定對(duì)象堆中存在位于第四寄生對(duì)象之后的寄生對(duì)象;
[0241]第二更新子模塊560,用于在第六判斷子模塊559判斷出對(duì)象堆中存在位于第三創(chuàng)建子模塊創(chuàng)建的第四寄生對(duì)象之后的寄生對(duì)象時(shí),根據(jù)第四寄生對(duì)象的后一個(gè)寄生對(duì)象,更新第四寄生對(duì)象。
[0242]具體地,上述第二更新子模塊560,具體用于在第六判斷子模塊559判斷出對(duì)象堆中存在位于第三創(chuàng)建子模塊558創(chuàng)建的第四寄生對(duì)象之后的寄生對(duì)象時(shí),判斷第四寄生對(duì)象所標(biāo)記的空閑空間是否與第四寄生對(duì)象的后一個(gè)寄生對(duì)象物理地址相鄰;
[0243]如果是,則將第四寄生對(duì)象的后一個(gè)寄生對(duì)象的容量字節(jié)的取值與第四寄生對(duì)象的容量字節(jié)的取值相加,將第四寄生對(duì)象的容量字節(jié)的取值更新為上述相加得到的結(jié)果,將第四寄生對(duì)象的地址字節(jié)的取值更新為第四寄生對(duì)象的后一個(gè)寄生對(duì)象的地址字節(jié)的取值;
[0244]否則,將第四寄生對(duì)象的地址字節(jié)的取值更新為第四寄生對(duì)象的后一個(gè)寄生對(duì)象的地址字節(jié)的取值。[0245]本實(shí)施例中,上述第二更新子模塊560,具體用于在第六判斷子模塊559判斷出對(duì)象堆中存在位于第三創(chuàng)建子模塊558創(chuàng)建的第四寄生對(duì)象之后的寄生對(duì)象時(shí),獲取第四寄生對(duì)象的地址與第四寄生對(duì)象的容量字節(jié)的取值相加得到的結(jié)果,判斷結(jié)果是否與第四寄生對(duì)象的后一個(gè)寄生對(duì)象的地址相同;
[0246]如果是,則確定第四寄生對(duì)象所標(biāo)記的空閑空間與第四寄生對(duì)象的后一個(gè)寄生對(duì)象物理地址相鄰,將第四寄生對(duì)象的后一個(gè)寄生對(duì)象的容量字節(jié)的取值與第四寄生對(duì)象的容量字節(jié)的取值相加,將第四寄生對(duì)象的容量字節(jié)的取值更新為上述相加得到的結(jié)果,將第四寄生對(duì)象的地址字節(jié)的取值更新為第四寄生對(duì)象的后一個(gè)寄生對(duì)象的地址字節(jié)的取值;
[0247]否則,確定第四寄生對(duì)象所標(biāo)記的空閑空間與第四寄生對(duì)象的后一個(gè)寄生對(duì)象物理地址不相鄰,將第四寄生對(duì)象的地址字節(jié)的取值更新為第四寄生對(duì)象的后一個(gè)寄生對(duì)象的地址字節(jié)的取值。
[0248]本發(fā)明實(shí)施例通過(guò)使用寄生對(duì)象標(biāo)記對(duì)象堆中的空閑空間,并根據(jù)寄生對(duì)象在對(duì)象堆中為待創(chuàng)建對(duì)象申請(qǐng)空間,能夠有效地管理對(duì)象堆中的空閑空間,提高對(duì)象堆的空間利用率;在執(zhí)行完刪包或刪應(yīng)用操作后,以及在檢測(cè)到j(luò)ava卡應(yīng)用程序調(diào)用與垃圾回收對(duì)應(yīng)的預(yù)設(shè)API后,僅需要執(zhí)行一個(gè)空操作,而不再需要通過(guò)移動(dòng)對(duì)象堆中的已創(chuàng)建對(duì)象進(jìn)行垃圾回收,減少了對(duì)已創(chuàng)建對(duì)象的移動(dòng)次數(shù)以及移動(dòng)對(duì)象帶來(lái)的時(shí)間消耗,提高了 Java卡虛擬機(jī)的工作效率,并在一定程度上達(dá)到磨損平衡。
[0249]結(jié)合本文中所公開的實(shí)施例描述的方法中的步驟可以直接用硬件、處理器執(zhí)行的軟件模塊,或者二者的結(jié)合來(lái)實(shí)施。軟件模塊可以置于隨機(jī)存儲(chǔ)器(RAM)、內(nèi)存、只讀存儲(chǔ)器(ROM)、電可編程ROM、電可擦除可編程ROM、寄存器、硬盤、可移動(dòng)磁盤、CD-ROM、或【技術(shù)領(lǐng)域】?jī)?nèi)所公知的任意其它形式的存儲(chǔ)介質(zhì)中。
[0250]以上所述,僅為本發(fā)明的【具體實(shí)施方式】,但本發(fā)明的保護(hù)范圍并不局限于此,任何熟悉本【技術(shù)領(lǐng)域】的技術(shù)人員在本發(fā)明揭露的技術(shù)范圍內(nèi),可輕易想到變化或替換,都應(yīng)涵蓋在本發(fā)明的保護(hù)范圍之內(nèi)。因此,本發(fā)明的保護(hù)范圍應(yīng)所述以權(quán)利要求的保護(hù)范圍為準(zhǔn)。
【權(quán)利要求】
1.一種使用寄生對(duì)象管理對(duì)象堆的方法,其特征在于,所述寄生對(duì)象用于標(biāo)記所述對(duì)象堆中的空閑空間,包括地址字節(jié)和容量字節(jié),所述地址字節(jié)用于表示所述寄生對(duì)象的后一個(gè)寄生對(duì)象的地址,所述容量字節(jié)用于表示所述寄生對(duì)象所標(biāo)記的空閑空間的大小,Java卡虛擬機(jī)的系統(tǒng)信息中存儲(chǔ)有所述對(duì)象堆中的第一個(gè)寄生對(duì)象的地址; 所述Java卡虛擬機(jī)需要在所述對(duì)象堆中創(chuàng)建非寄生對(duì)象時(shí),執(zhí)行以下操作: 51、所述Java卡虛擬機(jī)讀取所述對(duì)象堆中的第一個(gè)寄生對(duì)象,將所述第一個(gè)寄生對(duì)象作為當(dāng)前寄生對(duì)象; 52、所述Java卡虛擬機(jī)判斷當(dāng)前寄生對(duì)象所標(biāo)記的空閑空間是否小于待創(chuàng)建對(duì)象所占用的空間,如果是,則執(zhí)行步驟S3 ;否則,執(zhí)行步驟SlO ; 53、所述Java卡虛擬機(jī)判斷所述對(duì)象堆中是否存在當(dāng)前寄生對(duì)象的后一個(gè)寄生對(duì)象,如果是,則執(zhí)行步驟S4 ;否則,執(zhí)行步驟S5 ; 54、所述Java卡虛擬機(jī)將當(dāng)前寄生對(duì)象的后一個(gè)寄生對(duì)象,作為更新后的當(dāng)前寄生對(duì)象,并返回步驟S2 ; 55、所述Java卡虛擬機(jī)將所述對(duì)象堆中的所有空閑空間進(jìn)行合并,根據(jù)合并后的空閑空間創(chuàng)建對(duì)應(yīng)的寄生對(duì)象,判斷所述合并后的空閑空間是否小于所述待創(chuàng)建對(duì)象所占用的空間,如果是,則將創(chuàng)建的寄生對(duì)象的地址作為所述對(duì)象堆中的第一個(gè)寄生對(duì)象的地址保存到所述系統(tǒng)信息中,結(jié)束流程;否則,執(zhí)行步驟S6 ; 56、所述Java卡虛擬機(jī)讀取當(dāng)前寄生對(duì)象的地址字節(jié),將讀取到的結(jié)果作為所述對(duì)象堆中的第一個(gè)寄生對(duì)象的地址保存到所述系統(tǒng)信息中; 57、所述Java卡虛擬機(jī)從當(dāng)前寄生對(duì)象的地址開始,為所述待創(chuàng)建對(duì)象申請(qǐng)空間,獲取申請(qǐng)空間后的剩余空間; 58、所述Java卡虛擬機(jī)判斷所述剩余空間是否大于寄生對(duì)象所占用的空間,如果是,則執(zhí)行步驟S9 ;否則,結(jié)束流程; 59、所述Java卡虛擬機(jī)從所述剩余空間的首地址開始,創(chuàng)建第一寄生對(duì)象,將所述第一寄生對(duì)象的地址作為所述對(duì)象堆中的第一個(gè)寄生對(duì)象的地址保存到所述系統(tǒng)信息中,結(jié)束流程; S10、所述Java卡虛擬機(jī)從當(dāng)前寄生對(duì)象的地址開始,為所述待創(chuàng)建對(duì)象申請(qǐng)空間,并對(duì)當(dāng)前寄生對(duì)象的前一個(gè)寄生對(duì)象,和/或所述系統(tǒng)信息中存儲(chǔ)的所述對(duì)象堆中的第一個(gè)寄生對(duì)象的地址進(jìn)行更新。
2.如權(quán)利要求1所述的方法,其特征在于,所述步驟S10,具體包括: Al、所述Java卡虛擬機(jī)判斷當(dāng)前寄生對(duì)象是否為所述對(duì)象堆中的第一個(gè)寄生對(duì)象,如果是,則返回步驟S6 ;否則,執(zhí)行步驟A2 ; A2、所述Java卡虛擬機(jī)將當(dāng)前寄生對(duì)象的前一個(gè)寄生對(duì)象的地址字節(jié)的取值,更新為當(dāng)前寄生對(duì)象的地址字節(jié)的取值; A3、所述Java卡虛擬機(jī)從當(dāng)前寄生對(duì)象的地址開始,為所述待創(chuàng)建對(duì)象申請(qǐng)空間,獲取申請(qǐng)空間后的剩余空間; A4、所述Java卡虛擬機(jī)判斷所述剩余空間是否大于寄生對(duì)象所占用的空間,如果是,則執(zhí)行步驟A5 ;否則,結(jié)束流程; A5、所述Java卡虛擬機(jī)從所述剩余空間的首地址開始,創(chuàng)建第二寄生對(duì)象,將所述第二寄生對(duì)象的前一個(gè)寄生對(duì)象的地址字節(jié)的取值更新為所述第二寄生對(duì)象的地址,結(jié)束流程。
3.如權(quán)利要求1所述的方法,其特征在于,所述Java卡虛擬機(jī)需要從所述對(duì)象堆中刪除非寄生對(duì)象時(shí),執(zhí)行以下操作: 所述Java卡虛擬機(jī)將待刪除對(duì)象從對(duì)象表中刪除,根據(jù)所述待刪除對(duì)象的地址和所述待刪除對(duì)象所占用的空間的大小,對(duì)所述待刪除對(duì)象的前一個(gè)寄生對(duì)象和/或后一個(gè)寄生對(duì)象進(jìn)行更新。
4.如權(quán)利要求3所述的方法,其特征在于,所述Java卡虛擬機(jī)根據(jù)所述待刪除對(duì)象的地址和所述待刪除對(duì)象所占用的空間的大小,對(duì)所述待刪除對(duì)象的前一個(gè)寄生對(duì)象和/或后一個(gè)寄生對(duì)象進(jìn)行更新,具體包括: B1、所述Java卡虛擬機(jī)判斷所述對(duì)象堆中是否存在位于所述待刪除對(duì)象之前的寄生對(duì)象,如果是,則執(zhí)行步驟B6 ;否則,執(zhí)行步驟B2 ; B2、所述Java卡虛擬機(jī)從所述待刪除對(duì)象的地址開始,創(chuàng)建第三寄生對(duì)象; B3、所述Java卡虛擬機(jī)判 斷所述對(duì)象堆中是否存在位于所述第三寄生對(duì)象之后的寄生對(duì)象,如果是,則執(zhí)行步驟B4 ;否則,執(zhí)行步驟B5 ; B4、所述Java卡虛擬機(jī)根據(jù)所述第三寄生對(duì)象的后一個(gè)寄生對(duì)象,對(duì)所述第三寄生對(duì)象進(jìn)行更新,并將所述第三寄生對(duì)象的地址作為所述對(duì)象堆中的第一個(gè)寄生對(duì)象的地址存儲(chǔ)到所述系統(tǒng)信息中,結(jié)束流程; B5、所述Java卡虛擬機(jī)將所述第三寄生對(duì)象的地址作為所述對(duì)象堆中的第一個(gè)寄生對(duì)象的地址存儲(chǔ)到所述系統(tǒng)信息中,結(jié)束流程; B6、所述Java卡虛擬機(jī)判斷所述待刪除對(duì)象的前一個(gè)寄生對(duì)象所標(biāo)記的空閑空間是否與所述待刪除對(duì)象物理地址相鄰,如果是,則執(zhí)行步驟B7 ;否則,執(zhí)行步驟B8 ; B7、所述Java卡虛擬機(jī)根據(jù)所述待刪除對(duì)象更新所述待刪除對(duì)象的前一個(gè)寄生對(duì)象,結(jié)束流程; B8、所述Java卡虛擬機(jī)從所述待刪除對(duì)象的地址開始,創(chuàng)建第四寄生對(duì)象,將所述第四寄生對(duì)象的前一個(gè)寄生對(duì)象的地址字節(jié)的取值,更新為所述第四寄生對(duì)象的地址,并判斷所述對(duì)象堆中是否存在位于所述第四寄生對(duì)象之后的寄生對(duì)象,如果是,則執(zhí)行步驟B9 ;否則,結(jié)束流程; B9、所述Java卡虛擬機(jī)根據(jù)所述第四寄生對(duì)象的后一個(gè)寄生對(duì)象,更新所述第四寄生對(duì)象,結(jié)束流程。
5.如權(quán)利要求4所述的方法,其特征在于,所述Java卡虛擬機(jī)判斷所述待刪除對(duì)象的前一個(gè)寄生對(duì)象所標(biāo)記的空閑空間是否與所述待刪除對(duì)象物理地址相鄰,具體為: 所述Java卡虛擬機(jī)將所述待刪除對(duì)象的前一個(gè)寄生對(duì)象的容量字節(jié)的取值與所述前一個(gè)寄生對(duì)象的地址相加,判斷得到的結(jié)果是否與所述待刪除對(duì)象的地址相同,如果相同,則確定所述待刪除對(duì)象的前一個(gè)寄生對(duì)象所標(biāo)記的空閑空間與所述待刪除對(duì)象物理地址相鄰;否則,確定所述待刪除對(duì)象的前一個(gè)寄生對(duì)象所標(biāo)記的空閑空間與所述待刪除對(duì)象物理地址不相鄰。
6.如權(quán)利要求4所述的方法,其特征在于,所述步驟B2,具體為: 所述Java卡虛擬機(jī)將所述待刪除對(duì)象的地址作為所述第三寄生對(duì)象的地址,將所述第三寄生對(duì)象的容量字節(jié)的取值設(shè)置為所述待刪除對(duì)象所占用的空間的大小,將所述第三寄生對(duì)象的地址字節(jié)的取值設(shè) 置為空; 所述步驟B4中,所述Java卡虛擬機(jī)根據(jù)所述第三寄生對(duì)象的后一個(gè)寄生對(duì)象,對(duì)所述第三寄生對(duì)象進(jìn)行更新,具體包括: 所述Java卡虛擬機(jī)判斷所述第三寄生對(duì)象所標(biāo)記的空閑空間是否與所述第三寄生對(duì)象的后一個(gè)寄生對(duì)象物理地址相鄰; 如果是,所述Java卡虛擬機(jī)將所述第三寄生對(duì)象的地址字節(jié)的取值,更新為所述第三寄生對(duì)象的后一個(gè)寄生對(duì)象的地址字節(jié)的取值;將所述第三寄生對(duì)象的后一個(gè)寄生對(duì)象的容量字節(jié)的取值與所述第三寄生對(duì)象的容量字節(jié)的取值相加,將得到的結(jié)果作為更新后的第三寄生對(duì)象的容量字節(jié)的取值; 否則,所述Java卡虛擬機(jī)將所述第三寄生對(duì)象的地址字節(jié)的取值,更新為所述第三寄生對(duì)象的后一個(gè)寄生對(duì)象的地址。
7.如權(quán)利要求6所述的方法,其特征在于,所述Java卡虛擬機(jī)判斷所述第三寄生對(duì)象所標(biāo)記的空閑空間是否與所述第三寄生對(duì)象的后一個(gè)寄生對(duì)象物理地址相鄰,具體為: 所述Java卡虛擬機(jī)獲取所述第三寄生對(duì)象的地址與所述第三寄生對(duì)象的容量字節(jié)的取值相加得到的結(jié)果,判斷所述結(jié)果是否與所述第三寄生對(duì)象的后一個(gè)寄生對(duì)象的地址相同,如果是,則確定所述第三寄生對(duì)象所標(biāo)記的空閑空間與所述第三寄生對(duì)象的后一個(gè)寄生對(duì)象物理地址相鄰;否則,確定所述第三寄生對(duì)象所標(biāo)記的空閑空間與所述第三寄生對(duì)象的后一個(gè)寄生對(duì)象物理地址不相鄰。
8.如權(quán)利要求4所述的方法,其特征在于,所述步驟B7中,所述Java卡虛擬機(jī)根據(jù)所述待刪除對(duì)象更新所述待刪除對(duì)象的前一個(gè)寄生對(duì)象,具體包括: Cl、所述Java卡虛擬機(jī)判斷所述對(duì)象堆中是否存在位于所述待刪除對(duì)象之后的寄生對(duì)象,如果是,則執(zhí)行步驟C2 ;否則,執(zhí)行步驟C5 ; C2、所述Java卡虛擬機(jī)判斷所述待刪除對(duì)象的后一個(gè)寄生對(duì)象所標(biāo)記的空閑空間是否與所述待刪除對(duì)象物理地址相鄰,如果是,則執(zhí)行步驟C3 ;否則,執(zhí)行步驟C4 ; C3、所述Java卡虛擬機(jī)將所述待刪除對(duì)象的后一個(gè)寄生對(duì)象的容量字節(jié)的取值、所述待刪除對(duì)象的前一個(gè)寄生對(duì)象的容量字節(jié)的取值以及所述待刪除對(duì)象所占用的空間的大小相加,得到第一相加結(jié)果,將所述待刪除對(duì)象的前一個(gè)寄生對(duì)象的容量字節(jié)的取值更新為所述第一相加結(jié)果,將所述待刪除對(duì)象的前一個(gè)寄生對(duì)象的地址字節(jié)的取值,更新為所述待刪除對(duì)象的后一個(gè)寄生對(duì)象的地址字節(jié)的取值; C4、所述Java卡虛擬機(jī)將所述待刪除對(duì)象的前一個(gè)寄生對(duì)象的容量字節(jié)的取值和所述待刪除對(duì)象所占用的空間的大小相加,得到第二相加結(jié)果,將所述待刪除對(duì)象的前一個(gè)寄生對(duì)象的容量字節(jié)的取值更新為所述第二相加結(jié)果,將所述待刪除對(duì)象的前一個(gè)寄生對(duì)象的地址字節(jié)的取值,更新為所述待刪除對(duì)象的后一個(gè)寄生對(duì)象的地址; C5、所述Java卡虛擬機(jī)將所述待刪除對(duì)象的前一個(gè)寄生對(duì)象的容量字節(jié)的取值和所述待刪除對(duì)象所占用的空間的大小相加,得到第三相加結(jié)果,將所述待刪除對(duì)象的前一個(gè)寄生對(duì)象的容量字節(jié)的取值更新為所述第三相加結(jié)果。
9.如權(quán)利要求8所述的方法,其特征在于,所述步驟BI中,所述Java卡虛擬機(jī)判斷所述對(duì)象堆中是否存在位于所述待刪除對(duì)象之前的寄生對(duì)象,具體為:所述Java卡虛擬機(jī)從所述系統(tǒng)信息中獲取所述對(duì)象堆中的第一個(gè)寄生對(duì)象的地址,判斷所述對(duì)象堆中的第一個(gè)寄生對(duì)象的地址是否為空,如果為空,則確定所述對(duì)象堆中不存在位于所述待刪除對(duì)象之前的寄生對(duì)象;如果不為空,則判斷所述待刪除對(duì)象的地址是否小于所述對(duì)象堆中的第一個(gè)寄生對(duì)象的地址,如果是,則確定所述對(duì)象堆中不存在位于所述待刪除對(duì)象之前的寄生對(duì)象;否則,確定所述對(duì)象堆中存在位于所述待刪除對(duì)象之前的寄生對(duì)象; 所述步驟B3中,所述Java卡虛擬機(jī)判斷所述對(duì)象堆中是否存在位于所述第三寄生對(duì)象之后的寄生對(duì)象,具體為: 所述Java卡虛擬機(jī)從所述系統(tǒng)信息中獲取所述對(duì)象堆中的第一個(gè)寄生對(duì)象的地址,判斷所述對(duì)象堆中的第一個(gè)寄生對(duì)象的地址是否為空,如果為空,則確定所述對(duì)象堆中不存在位于所述第三寄生對(duì)象之后的寄生對(duì)象;如果不為空,則確定所述對(duì)象堆中存在位于所述第三寄生對(duì)象之后的寄生對(duì)象; 所述步驟B8中,所述Java卡虛擬機(jī)判斷所述對(duì)象堆中是否存在位于所述第四寄生對(duì)象之后的寄生對(duì)象,具體為: 所述Java卡虛擬機(jī)判斷所述待刪除對(duì)象的前一個(gè)寄生對(duì)象的地址字節(jié)的取值是否為空,如果是,則確定所述對(duì)象堆中不存在位于所述第四寄生對(duì)象之后的寄生對(duì)象;否則,確定所述對(duì)象堆中存在位于所述第四寄生對(duì)象之后的寄生對(duì)象; 所述步驟Cl中,所述Java卡虛擬機(jī)判斷所述對(duì)象堆中是否存在位于所述待刪除對(duì)象之后的寄生對(duì)象,具體為: 所述Java卡虛擬機(jī)判斷所述待刪除對(duì)象的前一個(gè)寄生對(duì)象的地址字節(jié)的取值是否為空,如果是,則確定所述對(duì)象堆中不存在位于所述待刪除對(duì)象之后的寄生對(duì)象;否則,確定所述對(duì)象堆中存在位于所述待刪除對(duì)象之后的寄生對(duì)象。
10.如權(quán)利要求8所述的方法`,其特征在于,所述步驟C2中,所述Java卡虛擬機(jī)判斷所述待刪除對(duì)象的后一個(gè)寄生對(duì)象所標(biāo)記的空閑空間是否與所述待刪除對(duì)象物理地址相鄰,具體為: 所述Java卡虛擬機(jī)將所述待刪除對(duì)象的地址與所述待刪除對(duì)象所占用的空間的大小相加,判斷得到的結(jié)果是否與所述待刪除對(duì)象的地址的后一個(gè)寄生對(duì)象相同,如果相同,則確定所述待刪除對(duì)象的后一個(gè)寄生對(duì)象所標(biāo)記的空閑空間與所述待刪除對(duì)象物理地址相鄰;否則,確定所述待刪除對(duì)象的后一個(gè)寄生對(duì)象所標(biāo)記的空閑空間與所述待刪除對(duì)象物理地址不相鄰。
11.如權(quán)利要求4所述的方法,其特征在于,所述步驟B8中,所述Java卡虛擬機(jī)從所述待刪除對(duì)象的地址開始,創(chuàng)建第四寄生對(duì)象,具體為: 所述Java卡虛擬機(jī)將所述待刪除對(duì)象的地址作為所述第四寄生對(duì)象的地址,將所述第四寄生對(duì)象的容量字節(jié)的取值設(shè)置為所述待刪除對(duì)象所占用的空間的大小,將所述第四寄生對(duì)象的地址字節(jié)設(shè)置為空; 所述步驟B9中,所述Java卡虛擬機(jī)根據(jù)所述第四寄生對(duì)象的后一個(gè)寄生對(duì)象,更新所述第四寄生對(duì)象,具體包括: 所述Java卡虛擬機(jī)判斷所述第四寄生對(duì)象所標(biāo)記的空閑空間是否與所述第四寄生對(duì)象的后一個(gè)寄生對(duì)象物理地址相鄰;如果是,所述Java卡虛擬機(jī)將所述第四寄生對(duì)象的后一個(gè)寄生對(duì)象的容量字節(jié)的取值與所述第四寄生對(duì)象的容量字節(jié)的取值相加,將所述第四寄生對(duì)象的容量字節(jié)的取值更新為上述相加得到的結(jié)果,將所述第四寄生對(duì)象的地址字節(jié)的取值更新為所述第四寄生對(duì)象的后一個(gè)寄生對(duì)象的地址字節(jié)的取值; 否則,所述Java卡虛擬機(jī)將所述第四寄生對(duì)象的地址字節(jié)的取值更新為所述第四寄生對(duì)象的后一個(gè)寄生對(duì)象的地址字節(jié)的取值。
12.如權(quán)利要求11所述的方法,其特征在于,所述Java卡虛擬機(jī)判斷所述第四寄生對(duì)象所標(biāo)記的空閑空間是否與所述第四寄生對(duì)象的后一個(gè)寄生對(duì)象物理地址相鄰,具體為: 所述Java卡虛擬機(jī)獲取所述第四寄生對(duì)象的地址與所述第四寄生對(duì)象的容量字節(jié)的取值相加得到的結(jié)果,判斷所述結(jié)果是否與所述第四寄生對(duì)象的后一個(gè)寄生對(duì)象的地址相同,如果是,則確定所述第四寄生對(duì)象所標(biāo)記的空閑空間與所述第四寄生對(duì)象的后一個(gè)寄生對(duì)象物理地址相鄰;否則,確定所述第四寄生對(duì)象所標(biāo)記的空閑空間與所述第四寄生對(duì)象的后一個(gè)寄生對(duì)象物理地址不相鄰。
13.如權(quán)利要求1所述的方法,其特征在于,所述步驟SI之前,還包括: 所述Java卡虛擬機(jī)從所述系統(tǒng)信息中獲取所述對(duì)象堆中的第一個(gè)寄生對(duì)象的地址,判斷所述地址是否為空,如果是,則執(zhí)行步驟S5 ;否則,執(zhí)行步驟SI。
14.如權(quán)利要求1所述的方法,其特征在于,所述步驟S5中,所述Java卡虛擬機(jī)將所述對(duì)象堆中的所有空閑空間進(jìn)行合并,根據(jù)合并后的空閑空間創(chuàng)建對(duì)應(yīng)的寄生對(duì)象,具體為: D1、所述Java卡虛擬機(jī)將所述對(duì)象堆中的第一個(gè)非寄生對(duì)象作為當(dāng)前對(duì)象,獲取當(dāng)前對(duì)象的地址減去對(duì)象堆的首地 址得到的差值,將空閑空間變量初始化為所述差值; D2、所述Java卡虛擬機(jī)判斷當(dāng)前對(duì)象的地址是否小于所述對(duì)象堆中最后一個(gè)非寄生對(duì)象的地址,如果是,則執(zhí)行步驟D3 ;否則,執(zhí)行步驟D6 ; D3、所述Java卡虛擬機(jī)判斷所述空閑空間變量的取值是否為零,如果是,則執(zhí)行步驟D5;否則,執(zhí)行步驟D4; D4、所述Java卡虛擬機(jī)根據(jù)所述空閑空間變量的取值,將當(dāng)前對(duì)象前移,更新當(dāng)前對(duì)象在對(duì)象表中的引用值,并執(zhí)行步驟D5 ; D5、所述Java卡虛擬機(jī)獲取當(dāng)前對(duì)象的后一個(gè)非寄生對(duì)象的地址減去當(dāng)前對(duì)象的地址和當(dāng)前對(duì)象占用的空間的大小得到的差值,將所述空閑空間變量更新為所述差值,將當(dāng)前對(duì)象的后一個(gè)非寄生對(duì)象作為更新后的當(dāng)前對(duì)象,并返回步驟D2 ; D6、所述Java卡虛擬機(jī)根據(jù)所述空閑空間變量的取值,將當(dāng)前對(duì)象前移,更新當(dāng)前對(duì)象在對(duì)象表中的引用值; D7、所述Java卡虛擬機(jī)將當(dāng)前對(duì)象的地址與當(dāng)前對(duì)象占用的空間的大小相加,將得到的結(jié)果作為地址,創(chuàng)建對(duì)應(yīng)的寄生對(duì)象。
15.一種使用寄生對(duì)象管理對(duì)象堆的裝置,其特征在于,所述寄生對(duì)象用于標(biāo)記所述對(duì)象堆中的空閑空間,包括地址字節(jié)和容量字節(jié),所述地址字節(jié)用于表示所述寄生對(duì)象的后一個(gè)寄生對(duì)象的地址,所述容量字節(jié)用于表示所述寄生對(duì)象所標(biāo)記的空閑空間的大小,系統(tǒng)信息中存儲(chǔ)有所述對(duì)象堆中的第一個(gè)寄生對(duì)象的地址; 所述裝置,包括:第一讀取模塊,用于在需要在所述對(duì)象堆中創(chuàng)建非寄生對(duì)象時(shí),讀取所述對(duì)象堆中的第一個(gè)寄生對(duì)象,將所述第一個(gè)寄生對(duì)象作為當(dāng)前寄生對(duì)象,并觸發(fā)第一判斷模塊; 第一判斷模塊,用于判斷當(dāng)前寄生對(duì)象所標(biāo)記的空閑空間是否小于待創(chuàng)建對(duì)象所占用的空間,并在判斷出當(dāng)前寄生對(duì)象所標(biāo)記的空閑空間小于待創(chuàng)建對(duì)象所占用的空間時(shí),觸發(fā)第二判斷模塊; 第二判斷模塊,用于在所述第一判斷模塊判斷出當(dāng)前寄生對(duì)象所標(biāo)記的空閑空間小于待創(chuàng)建對(duì)象所占用的空間時(shí),判斷所述對(duì)象堆中是否存在當(dāng)前寄生對(duì)象的后一個(gè)寄生對(duì)象,并在判斷出所述對(duì)象堆中不存在當(dāng)前寄生對(duì)象的后一個(gè)寄生對(duì)象時(shí),觸發(fā)合并模塊; 第一更新模塊,用于在所述第二判斷模塊判斷出所述對(duì)象堆中存在當(dāng)前寄生對(duì)象的后一個(gè)寄生對(duì)象時(shí),將當(dāng)如寄生對(duì)象的后一個(gè)寄生對(duì)象,作為更新后的當(dāng)如寄生對(duì)象,并觸發(fā)所述第二判斷模塊; 合并模塊,用于將所述對(duì)象堆中的所有空閑空間進(jìn)行合并,根據(jù)合并后的空閑空間創(chuàng)建對(duì)應(yīng)的寄生對(duì)象; 第三判斷模塊,用于判斷所述合并模塊合并后的空閑空間是否小于所述待創(chuàng)建對(duì)象所占用的空間,并在判斷出所述合并后的空閑空間小于所述待創(chuàng)建對(duì)象所占用的空間時(shí),觸發(fā)第一處理模塊; 保存模塊,用于在所述第三判斷模塊判斷出所述合并后的空閑空間小于所述待創(chuàng)建對(duì)象所占用的空間時(shí),將創(chuàng)建的寄生對(duì)象的地址作為所述對(duì)象堆中的第一個(gè)寄生對(duì)象的地址保存到所述系統(tǒng)信息中; 第一處理模塊,用于讀取當(dāng)前寄生對(duì)象的地址字節(jié),將讀取到的結(jié)果作為所述對(duì)象堆中的第一個(gè)寄生對(duì)象的地址保存到所述系統(tǒng)信息中;從當(dāng)前寄生對(duì)象的地址開始,為所述待創(chuàng)建對(duì)象申請(qǐng)空間,獲取申請(qǐng)空間后的剩余空間; 第四判斷模塊,用于判斷所述第一處理模塊獲取的所述剩余空間是否大于寄生對(duì)象所占用的空間; 第一創(chuàng)建模塊,用于在所述第四判斷模塊判斷出所述剩余空間大于寄生對(duì)象所占用的空間時(shí),從所述剩余空間的首地址開始,創(chuàng)建第一寄生對(duì)象,將所述第一寄生對(duì)象的地址作為所述對(duì)象堆中的第一個(gè)寄生對(duì)象的地址保存到所述系統(tǒng)信息中; 第二處理模塊,用于在所述第一判斷模塊判斷出當(dāng)前寄生對(duì)象所標(biāo)記的空閑空間不小于待創(chuàng)建對(duì)象所占用的空間時(shí),從當(dāng)前寄生對(duì)象的地址開始,為所述待創(chuàng)建對(duì)象申請(qǐng)空間,并對(duì)當(dāng)前寄生對(duì)象的前一個(gè)寄生對(duì)象,和/或所述系統(tǒng)信息中存儲(chǔ)的所述對(duì)象堆中的第一個(gè)寄生對(duì)象的地址進(jìn)行更新。
16.如權(quán)利要求15所述的裝置,其特征在于,所述第二處理模塊,包括: 第一判斷子模塊,用于在所述第一判斷模塊判斷出當(dāng)前寄生對(duì)象所標(biāo)記的空閑空間不小于待創(chuàng)建對(duì)象所占用的空間時(shí),判斷當(dāng)前寄生對(duì)象是否為所述對(duì)象堆中的第一個(gè)寄生對(duì)象,并在判斷出當(dāng)前寄生對(duì)象為所述對(duì)象堆中的第一個(gè)寄生對(duì)象時(shí),觸發(fā)所述第一處理模塊; 第一處理子模塊,用于在所述第一判斷子模塊判斷出當(dāng)前寄生對(duì)象不是所述對(duì)象堆中的第一個(gè)寄生對(duì)象時(shí),將當(dāng)前寄生對(duì)象的前一個(gè)寄生對(duì)象的地址字節(jié)的取值,更新為當(dāng)前寄生對(duì)象的地址字節(jié)的取值;從當(dāng)前寄生對(duì)象的地址開始,為所述待創(chuàng)建對(duì)象申請(qǐng)空間,獲取申請(qǐng)空間后的剩余空間; 第二判斷子模塊,用于判斷所述第一處理子模塊獲取的所述剩余空間是否大于寄生對(duì)象所占用的空間; 第一創(chuàng)建子模塊,用于在所述第二判斷子模塊判斷所述第一處理子模塊獲取的所述剩余空間大于寄生對(duì)象所占用的空間時(shí),從所述剩余空間的首地址開始,創(chuàng)建第二寄生對(duì)象,將所述第二寄生對(duì)象的前一個(gè)寄生對(duì)象的地址字節(jié)的取值更新為所述第二寄生對(duì)象的地址。
17.如權(quán)利要求15所述的裝置,其特征在于,還包括: 刪除模塊,用于將待刪除對(duì)象從對(duì)象表中刪除; 第二更新模塊,用于根據(jù)所述待刪除對(duì)象的地址和所述待刪除對(duì)象所占用的空間的大小,對(duì)所述待刪除對(duì)象的前一個(gè)寄生對(duì)象和/或后一個(gè)寄生對(duì)象進(jìn)行更新。
18.如權(quán)利要求17所述的裝置,其特征在于,所述第二更新模塊包括: 第三判斷子模塊,用于判斷所述對(duì)象堆中是否存在位于所述待刪除對(duì)象之前的寄生對(duì)象; 第二創(chuàng)建子模塊,用于在所述第三判斷子模塊判斷出所述對(duì)象堆中不存在位于所述待刪除對(duì)象之前的寄生對(duì)象時(shí),從所述待刪除對(duì)象的地址開始,創(chuàng)建第三寄生對(duì)象,并觸發(fā)第四判斷子模塊; 第四判斷子模塊,用于判斷所述對(duì)象堆中是否存在位于所述第三寄生對(duì)象之后的寄生對(duì)象; 第二處理子模塊,用于在所述第四判斷子模塊判斷出所述對(duì)象堆中存在位于所述第三寄生對(duì)象之后的寄生對(duì)象時(shí),根據(jù)所述第三寄生對(duì)象的后一個(gè)寄生對(duì)象,對(duì)所述第三寄生對(duì)象進(jìn)行更新,并將所述第三寄生對(duì)象的地址作為所述對(duì)象堆中的第一個(gè)寄生對(duì)象的地址存儲(chǔ)到所述系統(tǒng)信息中; 保存子模塊,用于在所述第四判斷子模塊判斷出所述對(duì)象堆中存在位于所述第三寄生對(duì)象之后的寄生對(duì)象時(shí),將所述第三寄生對(duì)象的地址作為所述對(duì)象堆中的第一個(gè)寄生對(duì)象的地址存儲(chǔ)到所述系統(tǒng)信息中; 第五判斷子模塊,用于在所述第三判斷子模塊判斷出所述對(duì)象堆中存在位于所述待刪除對(duì)象之前的寄生對(duì)象時(shí),判斷所述待刪除對(duì)象的前一個(gè)寄生對(duì)象所標(biāo)記的空閑空間是否與所述待刪除對(duì)象物理地址相鄰; 第一更新子模塊,用于在所述第五判斷子模塊判斷出所述待刪除對(duì)象的前一個(gè)寄生對(duì)象所標(biāo)記的空閑空間與所述待刪除對(duì)象物理地址相鄰時(shí),根據(jù)所述待刪除對(duì)象更新所述待刪除對(duì)象的如一個(gè)寄生對(duì)象; 第三創(chuàng)建子模塊,用于在所述第五判斷子模塊判斷出所述待刪除對(duì)象的前一個(gè)寄生對(duì)象所標(biāo)記的空閑空間與所述待刪除對(duì)象物理地址不相鄰時(shí),從所述待刪除對(duì)象的地址開始,創(chuàng)建第四寄生對(duì)象,將所述第四寄生對(duì)象的前一個(gè)寄生對(duì)象的地址字節(jié)的取值,更新為所述第四寄生對(duì)象的地址; 第六判斷子模塊,用于判斷所述對(duì)象堆中是否存在位于所述第三創(chuàng)建子模塊創(chuàng)建的所述第四寄生對(duì)象之后的寄生對(duì)象; 第二更新子模塊,用于在所述第六判斷子模塊判斷出所述對(duì)象堆中存在位于所述第三創(chuàng)建子模塊創(chuàng)建的所述第四寄生對(duì)象之后的寄生對(duì)象時(shí),根據(jù)所述第四寄生對(duì)象的后一個(gè)寄生對(duì)象,更新所述第四寄生對(duì)象。
19.如權(quán)利要求18所述的裝置,其特征在于, 所述第五判斷子模塊,具體用于在所述第三判斷子模塊判斷出所述對(duì)象堆中存在位于所述待刪除對(duì)象之前的寄生對(duì)象時(shí),將所述待刪除對(duì)象的前一個(gè)寄生對(duì)象的容量字節(jié)的取值與所述前一個(gè)寄生對(duì)象的地址相加,判斷得到的結(jié)果是否與所述待刪除對(duì)象的地址相同,如果相同,則確定所述待刪除對(duì)象的前一個(gè)寄生對(duì)象所標(biāo)記的空閑空間與所述待刪除對(duì)象物理地址相鄰;否則,確定所述待刪除對(duì)象的前一個(gè)寄生對(duì)象所標(biāo)記的空閑空間與所述待刪除對(duì)象物理地址不相鄰。
20.如權(quán)利要求18所述的裝置,其特征在于, 所述第二創(chuàng)建子模塊,具體用于在所述第三判斷子模塊判斷出所述對(duì)象堆中不存在位于所述待刪除對(duì)象之前的寄生對(duì)象時(shí),將所述待刪除對(duì)象的地址作為所述第三寄生對(duì)象的地址,將所述第三寄生對(duì)象的容量字節(jié)的取值設(shè)置為所述待刪除對(duì)象所占用的空間的大小,將所述第三寄生對(duì)象的地址字節(jié)的取值設(shè)置為空,并觸發(fā)第四判斷子模塊; 所述第二處理子模塊,具體用于在所述第四判斷子模塊判斷出所述對(duì)象堆中存在位于所述第三寄生對(duì)象之后的寄生對(duì)象時(shí),判斷所述第三寄生對(duì)象所標(biāo)記的空閑空間是否與所述第三寄生對(duì)象的后一個(gè)寄生對(duì)象物理地址相鄰; 如果是,則將所述第三寄生對(duì)象的地址字節(jié)的取值,更新為所述第三寄生對(duì)象的后一個(gè)寄生對(duì)象的地址字節(jié)的取值;將所述第三寄生對(duì)象的后一個(gè)寄生對(duì)象的容量字節(jié)的取值與所述第三寄生對(duì)象的容量字節(jié)的取值相加,將得到的結(jié)果作為更新后的第三寄生對(duì)象的容量字節(jié)的取值,并將所述第三寄`生對(duì)象的地址作為所述對(duì)象堆中的第一個(gè)寄生對(duì)象的地址存儲(chǔ)到所述系統(tǒng)信息中; 否則,將所述第三寄生對(duì)象的地址字節(jié)的取值,更新為所述第三寄生對(duì)象的后一個(gè)寄生對(duì)象的地址,將所述第三寄生對(duì)象的地址作為所述對(duì)象堆中的第一個(gè)寄生對(duì)象的地址存儲(chǔ)到所述系統(tǒng)信息中。
21.如權(quán)利要求20所述的裝置,其特征在于, 所述第二處理子模塊,具體用于在所述第四判斷子模塊判斷出所述對(duì)象堆中存在位于所述第三寄生對(duì)象之后的寄生對(duì)象時(shí),獲取所述第三寄生對(duì)象的地址與所述第三寄生對(duì)象的容量字節(jié)的取值相加得到的結(jié)果,判斷所述結(jié)果是否與所述第三寄生對(duì)象的后一個(gè)寄生對(duì)象的地址相同; 如果是,則確定所述第三寄生對(duì)象所標(biāo)記的空閑空間與所述第三寄生對(duì)象的后一個(gè)寄生對(duì)象物理地址相鄰,將所述第三寄生對(duì)象的地址字節(jié)的取值,更新為所述第三寄生對(duì)象的后一個(gè)寄生對(duì)象的地址字節(jié)的取值;將所述第三寄生對(duì)象的后一個(gè)寄生對(duì)象的容量字節(jié)的取值與所述第三寄生對(duì)象的容量字節(jié)的取值相加,將得到的結(jié)果作為更新后的第三寄生對(duì)象的容量字節(jié)的取值,并將所述第三寄生對(duì)象的地址作為所述對(duì)象堆中的第一個(gè)寄生對(duì)象的地址存儲(chǔ)到所述系統(tǒng)信息中; 否則,確定所述第三寄生對(duì)象所標(biāo)記的空閑空間與所述第三寄生對(duì)象的后一個(gè)寄生對(duì)象物理地址不相鄰,將所述第三寄生對(duì)象的地址字節(jié)的取值,更新為所述第三寄生對(duì)象的后一個(gè)寄生對(duì)象的地址,將所述第三寄生對(duì)象的地址作為所述對(duì)象堆中的第一個(gè)寄生對(duì)象的地址存儲(chǔ)到所述系統(tǒng)信息中。
22.如權(quán)利要求18所述的裝置,其特征在于, 所述第一更新子模塊,具體用于在所述第五判斷子模塊判斷出所述待刪除對(duì)象的前一個(gè)寄生對(duì)象所標(biāo)記的空閑空間與所述待刪除對(duì)象物理地址相鄰時(shí),執(zhí)行以下操作: Cl、判斷所述對(duì)象堆中是否存在位于所述待刪除對(duì)象之后的寄生對(duì)象,如果是,則執(zhí)行步驟C2 ;否則,執(zhí)行步驟C5 ; C2、判斷所述待刪除對(duì)象的后一個(gè)寄生對(duì)象所標(biāo)記的空閑空間是否與所述待刪除對(duì)象物理地址相鄰,如果是,則執(zhí)行步驟C3 ;否則,執(zhí)行步驟C4 ; C3、將所述待刪除對(duì)象的后一個(gè)寄生對(duì)象的容量字節(jié)的取值、所述待刪除對(duì)象的前一個(gè)寄生對(duì)象的容量字節(jié)的取值以及所述待刪除對(duì)象所占用的空間的大小相加,得到第一相加結(jié)果,將所述待刪除對(duì)象的前一個(gè)寄生對(duì)象的容量字節(jié)的取值更新為所述第一相加結(jié)果,將所述待刪除對(duì)象的前一個(gè)寄生對(duì)象的地址字節(jié)的取值,更新為所述待刪除對(duì)象的后一個(gè)寄生對(duì)象的地址字節(jié)的取值; C4、將所述待刪除對(duì)象的前一個(gè)寄生對(duì)象的容量字節(jié)的取值和所述待刪除對(duì)象所占用的空間的大小相加,得到第二相加結(jié)果,將所述待刪除對(duì)象的前一個(gè)寄生對(duì)象的容量字節(jié)的取值更新為所述第二相加結(jié)果,將所述待刪除對(duì)象的前一個(gè)寄生對(duì)象的地址字節(jié)的取值,更新為所述待刪除對(duì)象的后一個(gè)寄生對(duì)象的地址; C4、將所述待刪除對(duì)象的前一個(gè)寄生對(duì)象的容量字節(jié)的取值和所述待刪除對(duì)象所占用的空間的大小相加,得到第三相加結(jié)果,將所述待刪除對(duì)象的前一個(gè)寄生對(duì)象的容量字節(jié)的取值更新為所述第三相加結(jié)果。
23.如權(quán)利要求22所述的裝置,其特征在于, 所述第三判斷子模塊,具體用于從所述系統(tǒng)信息中獲取所述對(duì)象堆中的第一個(gè)寄生對(duì)象的地址,判斷所述對(duì)象堆中的第一個(gè)寄生對(duì)象的地址是否為空,如果為空,則確定所述對(duì)象堆中不存在位于所述待刪除對(duì)象之前的寄生對(duì)象;如果不為空,則判斷所述待刪除對(duì)象的地址是否小于所述對(duì)象堆中的第一個(gè)寄生對(duì)象的地址,如果是,則確定所述對(duì)象堆中不存在位于所述待刪除對(duì)象之前的寄生對(duì)象;否則,確定所述對(duì)象堆中存在位于所述待刪除對(duì)象之前的寄生對(duì)象; 所述第四判斷子模塊,具體用于從所述系統(tǒng)信息中獲取所述對(duì)象堆中的第一個(gè)寄生對(duì)象的地址,判斷所述對(duì)象堆中的第一個(gè)寄生對(duì)象的地址是否為空,如果為空,則確定所述對(duì)象堆中不存在位于所述第三寄生對(duì)象之后的寄生對(duì)象;如果不為空,則確定所述對(duì)象堆中存在位于所述第三寄生對(duì)象之后的寄生對(duì)象; 所述第六判斷子模塊,具體用于判斷所述待刪除對(duì)象的前一個(gè)寄生對(duì)象的地址字節(jié)的取值是否為空,如果是,則確定所述對(duì)象堆中不存在位于所述第四寄生對(duì)象之后的寄生對(duì)象;否則,確定所述對(duì)象堆中存在位于所述第四寄生對(duì)象之后的寄生對(duì)象; 所述第一更新子模塊判斷所述對(duì)象堆中是否存在位于所述待刪除對(duì)象之后的寄生對(duì)象,具體為: 所述第一更新子模塊判斷所述待刪除對(duì)象的前一個(gè)寄生對(duì)象的地址字節(jié)的取值是否為空,如果是,則確定所述對(duì)象堆中不存在位于所述待刪除對(duì)象之后的寄生對(duì)象;否則,確定所述對(duì)象堆中存在位于所述待刪除對(duì)象之后的寄生對(duì)象。
24.如權(quán)利要求22所述的裝置,其特征在于, 所述第一更新子模塊判斷所述待刪除對(duì)象的后一個(gè)寄生對(duì)象所標(biāo)記的空閑空間是否與所述待刪除對(duì)象物理地址相鄰,具體為: 所述第一更新子模塊將所述待刪除對(duì)象的地址與所述待刪除對(duì)象所占用的空間的大小相加,判斷得到的結(jié)果是否與所述待刪除對(duì)象的地址的后一個(gè)寄生對(duì)象相同,如果相同,則確定所述待刪除對(duì)象的后一個(gè)寄生對(duì)象所標(biāo)記的空閑空間與所述待刪除對(duì)象物理地址相鄰;否則,確定所述待刪除對(duì)象的后一個(gè)寄生對(duì)象所標(biāo)記的空閑空間與所述待刪除對(duì)象物理地址不相鄰。
25.如權(quán)利要求18所述的裝置,其特征在于, 所述第三創(chuàng)建子模塊,具體用于在所述第五判斷子模塊判斷出所述待刪除對(duì)象的前一個(gè)寄生對(duì)象所標(biāo)記的空閑空間與所述待刪除對(duì)象物理地址不相鄰時(shí),將所述待刪除對(duì)象的地址作為所述第四寄生對(duì)象的地址,將所述第四寄生對(duì)象的容量字節(jié)的取值設(shè)置為所述待刪除對(duì)象所占用的空間的大小,將所述第四寄生對(duì)象的地址字節(jié)設(shè)置為空,將所述第四寄生對(duì)象的前一個(gè)寄生對(duì)象的地址字節(jié)的取值,更新為所述第四寄生對(duì)象的地址; 所述第二更新子模塊,具體用于在所述第六判斷子模塊判斷出所述對(duì)象堆中存在位于所述第三創(chuàng)建子模塊創(chuàng)建的所述第四寄生對(duì)象之后的寄生對(duì)象時(shí),判斷所述第四寄生對(duì)象所標(biāo)記的空閑空間是否與所述第四寄生對(duì)象的后一個(gè)寄生對(duì)象物理地址相鄰; 如果是,則將所述第四寄生對(duì)象的后一個(gè)寄生對(duì)象的容量字節(jié)的取值與所述第四寄生對(duì)象的容量字節(jié)的取值相加,將所述第四寄生對(duì)象的容量字節(jié)的取值更新為上述相加得到的結(jié)果,將所述第四寄生對(duì)象的地址字節(jié)的取值更新為所述第四寄生對(duì)象的后一個(gè)寄生對(duì)象的地址字節(jié)的取值; 否則,將所述第四寄生對(duì)象的地址字節(jié)的取值更新為所述第四寄生對(duì)象的后一個(gè)寄生對(duì)象的地址字節(jié)的取值。
26.如權(quán)利要求25所述的裝置,其特征在于, 所述第二更新子模塊,具體用于在所述第六判斷子模塊判斷出所述對(duì)象堆中存在位于所述第三創(chuàng)建子模塊創(chuàng)建的所述第四寄生對(duì)象之后的寄生對(duì)象時(shí),獲取所述第四寄生對(duì)象的地址與所述第四寄生對(duì)象的容量字節(jié)的取值相加得到的結(jié)果,判斷所述結(jié)果是否與所述第四寄生對(duì)象的后一個(gè)寄生對(duì)象的地址相同; 如果是,則確定所述第四寄生對(duì)象所標(biāo)記的空閑空間與所述第四寄生對(duì)象的后一個(gè)寄生對(duì)象物理地址相鄰,將所述第四寄生對(duì)象的后一個(gè)寄生對(duì)象的容量字節(jié)的取值與所述第四寄生對(duì)象的容量字節(jié)的取值相加,將所述第四寄生對(duì)象的容量字節(jié)的取值更新為上述相加得到的結(jié)果,將所述第四寄生對(duì)象的地址字節(jié)的取值更新為所述第四寄生對(duì)象的后一個(gè)寄生對(duì)象的地址字節(jié)的取值; 否則,確定所述第四寄生對(duì)象所標(biāo)記的空閑空間與所述第四寄生對(duì)象的后一個(gè)寄生對(duì)象物理地址不相鄰,將所述第四寄生對(duì)象的地址字節(jié)的取值更新為所述第四寄生對(duì)象的后一個(gè)寄生對(duì)象的地址字節(jié)的取值。
27.如權(quán)利要求15所述的裝置,其特征在于,還包括: 獲取模塊,用于從所述系統(tǒng)信息中獲取所述對(duì)象堆中的第一個(gè)寄生對(duì)象的地址; 第五判斷模塊,用于判斷所述獲取模塊獲取到的所述地址是否為空,如果是,則觸發(fā)所述合并模塊;否則,觸發(fā)所述第一讀取模塊。
28.如權(quán)利要求15所述的裝置,其特征在于,所述合并模塊,包括: 第一獲取子模塊,用于將所述對(duì)象堆中的第一個(gè)非寄生對(duì)象作為當(dāng)前對(duì)象,獲取當(dāng)前對(duì)象的地址減去對(duì)象堆的首地址得到的差值,將空閑空間變量初始化為所述差值,并觸發(fā)第七判斷子模塊; 第七判斷子模塊,用于判斷當(dāng)前對(duì)象的地址是否小于所述對(duì)象堆中最后一個(gè)非寄生對(duì)象的地址; 第八判斷子模塊,用于在所述第七判斷子模塊判斷出當(dāng)前對(duì)象的地址小于所述對(duì)象堆中最后一個(gè)非寄生對(duì)象的地址時(shí),判斷所述空閑空間變量的取值是否為零,并在判斷出所述空閑空間變量的取值為零時(shí),觸發(fā)第二獲取子模塊; 第三更新子模塊,用于在所述第八判斷子模塊判斷出所述空閑空間變量的取值不為零時(shí),根據(jù)所述空閑空間變量的取值,將當(dāng)前對(duì)象前移,更新當(dāng)前對(duì)象在對(duì)象表中的引用值,并觸發(fā)第二獲取子模塊; 第二獲取子模塊,用于獲取當(dāng)前對(duì)象的后一個(gè)非寄生對(duì)象的地址減去當(dāng)前對(duì)象的地址和當(dāng)前對(duì)象占用的空間的大小得到的差值,將所述空閑空間變量更新為所述差值,將當(dāng)前對(duì)象的后一個(gè)非寄生對(duì)象作為更新后的當(dāng)前對(duì)象,并觸發(fā)所述第七判斷子模塊; 第三處理子模塊,用于在所述第七判斷子模塊判斷出當(dāng)前對(duì)象的地址不小于所述對(duì)象堆中最后一個(gè)非寄生對(duì)象的地址時(shí),根據(jù)所述空閑空間變量的取值,將當(dāng)前對(duì)象前移,更新當(dāng)前對(duì)象在對(duì)象表中的引用值;將當(dāng)前對(duì)象的地址與當(dāng)前對(duì)象占用的空間的大小相加,將得到的結(jié)果作為地址,創(chuàng)建對(duì)應(yīng)的`寄生對(duì)象。
【文檔編號(hào)】G06F9/455GK103559076SQ201310537587
【公開日】2014年2月5日 申請(qǐng)日期:2013年11月4日 優(yōu)先權(quán)日:2013年11月4日
【發(fā)明者】陸舟, 于華章 申請(qǐng)人:飛天誠(chéng)信科技股份有限公司
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1