本申請(qǐng)涉及計(jì)算機(jī)技術(shù)領(lǐng)域,尤其涉及一種用于垃圾回收的并行標(biāo)記處理方法及裝置。
背景技術(shù):
垃圾回收(即garbagecollection簡(jiǎn)稱gc)技術(shù)被廣泛使用在當(dāng)今流行的許多高級(jí)語(yǔ)言虛擬機(jī)中。gc技術(shù)根據(jù)垃圾收集器(簡(jiǎn)稱collector)和宿主(簡(jiǎn)稱mutator)的關(guān)系可以分為兩種:collector工作時(shí)mutator暫停(簡(jiǎn)稱stop-the-world-gc即stw-gc),collector工作時(shí)mutator不暫停(簡(jiǎn)稱并發(fā)gc即concurrent-gc)。目前完全并發(fā)gc還沒(méi)有哪一款虛擬機(jī)真正實(shí)現(xiàn),流行的高級(jí)語(yǔ)言虛擬機(jī)比如jvm,v8等都是stw-gc或者部分concurrent-gc。非引用計(jì)數(shù)的stw-gc方案可以分為3種,即標(biāo)記-拷貝(簡(jiǎn)稱marking-copy),標(biāo)記-清理(簡(jiǎn)稱marking-sweep),和標(biāo)記-壓縮(簡(jiǎn)稱marking-compact)。
目前流行的高級(jí)語(yǔ)言虛擬機(jī)產(chǎn)品比如jvm,v8等的內(nèi)存都是通過(guò)堆(heap)來(lái)進(jìn)行統(tǒng)一管理,堆以指定大小的內(nèi)存塊(簡(jiǎn)稱為一個(gè)page,一般為操作系統(tǒng)的內(nèi)存頁(yè)大小的整數(shù)倍)為基本單位進(jìn)行組織。比如v8虛擬機(jī)的page大小為1mbyte。而且在每一個(gè)內(nèi)存塊(即page)的起始部分劃分出一塊位圖區(qū)域(稱為bitmap)用來(lái)標(biāo)記所在的page中每一個(gè)對(duì)象是否是活躍對(duì)象。比如某個(gè)page中的某個(gè)對(duì)象對(duì)應(yīng)在該page頭部的bitmap位被置為1,則說(shuō)明該對(duì)象是活躍對(duì)象,進(jìn)行g(shù)c時(shí)候不應(yīng)該進(jìn)行回收。
當(dāng)前用于垃圾回收的標(biāo)記方法為單線程的標(biāo)記方式,根據(jù)標(biāo)記對(duì)象的不斷增加,所占用的內(nèi)存空間會(huì)不斷增大,由此可見(jiàn),目前的單線程標(biāo)記方式浪費(fèi)了大量的內(nèi)存空間,降低了處理性能和效率。
技術(shù)實(shí)現(xiàn)要素:
本申請(qǐng)旨在至少在一定程度上解決相關(guān)技術(shù)中的技術(shù)問(wèn)題之一。
為此,本申請(qǐng)的第一個(gè)目的在于提出一種用于垃圾回收的并行標(biāo)記處理方法,該方法利用有限的內(nèi)存實(shí)現(xiàn)多線程的并行標(biāo)記處理,提高整個(gè)垃圾回收的性能。
本申請(qǐng)的第二個(gè)目的在于提出一種用于垃圾回收的并行標(biāo)記處理方法。
本申請(qǐng)的第三個(gè)目的在于提出一種用于垃圾回收的并行標(biāo)記處理裝置。
本申請(qǐng)的第四個(gè)目的在于提出一種用于垃圾回收的并行標(biāo)記處理裝置。
為達(dá)上述目的,本申請(qǐng)第一方面實(shí)施例提出了一種用于垃圾回收的并行標(biāo)記處理方法,包括:根據(jù)虛擬機(jī)堆中的內(nèi)存塊與n個(gè)標(biāo)記線程的對(duì)應(yīng)關(guān)系,遍歷所述虛擬機(jī)堆中的第一對(duì)象,其中,n為大于1的整數(shù),n個(gè)標(biāo)記線程占用的內(nèi)存容量是預(yù)先設(shè)置的,每個(gè)標(biāo)記線程至少包括:1個(gè)私有棧;將當(dāng)前處理的第一對(duì)象的第一指針壓入與該第一對(duì)象所在的內(nèi)存塊對(duì)應(yīng)的標(biāo)記線程的私有棧,根據(jù)所述第一指針的壓入情況對(duì)所述第一對(duì)象進(jìn)行第一標(biāo)記處理;對(duì)所述第一對(duì)象遍歷完成后,向所述n個(gè)標(biāo)記線程發(fā)送線程啟動(dòng)指令,以使所述n個(gè)標(biāo)記線程根據(jù)各自私有棧中所述第一指針的壓入情況,同步進(jìn)行用于垃圾回收的標(biāo)記處理。
本申請(qǐng)實(shí)施例的用于垃圾回收的并行標(biāo)記處理方法,通過(guò)根據(jù)虛擬機(jī)堆中的內(nèi)存塊與n個(gè)標(biāo)記線程的對(duì)應(yīng)關(guān)系,遍歷所述虛擬機(jī)堆中的第一對(duì)象,其中,n個(gè)標(biāo)記線程占用的內(nèi)存容量是預(yù)先設(shè)置的,將當(dāng)前處理的第一對(duì)象的第一指針壓入與該第一對(duì)象所在的內(nèi)存塊對(duì)應(yīng)的標(biāo)記線程的私有棧,根據(jù)所述第一指針的壓入情況對(duì)所述第一對(duì)象進(jìn)行第一標(biāo)記處理,對(duì)所述第一對(duì)象遍歷完成后,向所述n個(gè)標(biāo)記線程發(fā)送線程啟動(dòng)指令,以使所述n個(gè)標(biāo)記線程根據(jù)各自私有棧中所述第一指針的壓入情況,同步進(jìn)行用于垃圾回收的標(biāo)記處理。由此,利用有限的內(nèi)存實(shí)現(xiàn)多線程的并行標(biāo)記處理,提高整個(gè)垃圾回收的性能。
為達(dá)上述目的,本申請(qǐng)第二方面實(shí)施例提出了一種用于垃圾回收的并行標(biāo)記處理方法,包括:預(yù)設(shè)的n個(gè)標(biāo)記線程中的每個(gè)標(biāo)記線程至少包括:1個(gè)私有棧,所述方法應(yīng)用在每個(gè)標(biāo)記線程中,其中,應(yīng)用在第一標(biāo)記線程中的所述方法包括以下步驟:第一標(biāo)記線程根據(jù)線程啟動(dòng)指令,從第一私有棧中取出預(yù)先壓入的第一對(duì)象的第一指針;所述第一標(biāo)記線程遍歷所述第一指針指示的所述第一對(duì)象引用的第二對(duì)象,并根據(jù)預(yù)設(shè)的n個(gè)標(biāo)記線程與虛擬機(jī)堆中內(nèi)存塊的對(duì)應(yīng)關(guān)系對(duì)所述第二對(duì)象進(jìn)行第二標(biāo)記處理。
本申請(qǐng)實(shí)施例的用于垃圾回收的并行標(biāo)記處理方法,通過(guò)第一標(biāo)記線程根據(jù)線程啟動(dòng)指令,從第一私有棧中取出預(yù)先壓入的第一對(duì)象的第一指針,遍歷所述第一指針指示的所述第一對(duì)象引用的第二對(duì)象,并根據(jù)預(yù)設(shè)的n個(gè)標(biāo)記線程與虛擬機(jī)堆中內(nèi)存塊的對(duì)應(yīng)關(guān)系對(duì)所述第二對(duì)象進(jìn)行第二標(biāo)記處理。由此,參照第一標(biāo)記線程的標(biāo)記處理過(guò)程,通過(guò)n個(gè)標(biāo)記線程的并行標(biāo)記處理,實(shí)現(xiàn)了利用有限的內(nèi)存進(jìn)行并行標(biāo)記處理,提高整個(gè)垃圾回收的性能。
為達(dá)上述目的,本申請(qǐng)第三方面實(shí)施例提出了一種用于垃圾回收的并行標(biāo)記處理裝置,包括:遍歷模塊,用于根據(jù)虛擬機(jī)堆中的內(nèi)存塊與n個(gè)標(biāo)記線程的對(duì)應(yīng)關(guān)系,遍歷所述虛 擬機(jī)堆中的第一對(duì)象,其中,n為大于1的整數(shù),n個(gè)標(biāo)記線程占用的內(nèi)存容量是預(yù)先設(shè)置的,每個(gè)標(biāo)記線程至少包括:1個(gè)私有棧;第一標(biāo)記模塊,用于將當(dāng)前處理的第一對(duì)象的第一指針壓入與該第一對(duì)象所在的內(nèi)存塊對(duì)應(yīng)的標(biāo)記線程的私有棧,根據(jù)所述第一指針的壓入情況對(duì)所述第一對(duì)象進(jìn)行第一標(biāo)記處理;啟動(dòng)模塊,用于對(duì)所述第一對(duì)象遍歷完成后,向所述n個(gè)標(biāo)記線程發(fā)送線程啟動(dòng)指令,以使所述n個(gè)標(biāo)記線程根據(jù)各自私有棧中所述第一指針的壓入情況,同步進(jìn)行用于垃圾回收的標(biāo)記處理。
本申請(qǐng)實(shí)施例的用于垃圾回收的并行標(biāo)記處理裝置,通過(guò)根據(jù)虛擬機(jī)堆中的內(nèi)存塊與n個(gè)標(biāo)記線程的對(duì)應(yīng)關(guān)系,遍歷所述虛擬機(jī)堆中的第一對(duì)象,其中,n個(gè)標(biāo)記線程占用的內(nèi)存容量是預(yù)先設(shè)置的,將當(dāng)前處理的第一對(duì)象的第一指針壓入與該第一對(duì)象所在的內(nèi)存塊對(duì)應(yīng)的標(biāo)記線程的私有棧,根據(jù)所述第一指針的壓入情況對(duì)所述第一對(duì)象進(jìn)行第一標(biāo)記處理,對(duì)所述第一對(duì)象遍歷完成后,向所述n個(gè)標(biāo)記線程發(fā)送線程啟動(dòng)指令,以使所述n個(gè)標(biāo)記線程根據(jù)各自私有棧中所述第一指針的壓入情況,同步進(jìn)行用于垃圾回收的標(biāo)記處理。由此,利用有限的內(nèi)存實(shí)現(xiàn)多線程的并行標(biāo)記處理,提高整個(gè)垃圾回收的性能。
為達(dá)上述目的,本申請(qǐng)第四方面實(shí)施例提出了一種用于垃圾回收的并行標(biāo)記處理裝置,包括:預(yù)設(shè)的n個(gè)標(biāo)記線程中的每個(gè)標(biāo)記線程至少包括:1個(gè)私有棧,所述裝置應(yīng)用在每個(gè)標(biāo)記線程中,其中,應(yīng)用在第一標(biāo)記線程中的所述裝置包括:獲取模塊,用于根據(jù)線程啟動(dòng)指令,從第一私有棧中取出預(yù)先壓入的第一對(duì)象的第一指針;第二標(biāo)記模塊,用于遍歷所述第一指針指示的所述第一對(duì)象引用的第二對(duì)象,并根據(jù)預(yù)設(shè)的n個(gè)標(biāo)記線程與虛擬機(jī)堆中內(nèi)存塊的對(duì)應(yīng)關(guān)系對(duì)所述第二對(duì)象進(jìn)行第二標(biāo)記處理。
本申請(qǐng)實(shí)施例的用于垃圾回收的并行標(biāo)記處理裝置,通過(guò)第一標(biāo)記線程根據(jù)線程啟動(dòng)指令,從第一私有棧中取出預(yù)先壓入的第一對(duì)象的第一指針,遍歷所述第一指針指示的所述第一對(duì)象引用的第二對(duì)象,并根據(jù)預(yù)設(shè)的n個(gè)標(biāo)記線程與虛擬機(jī)堆中內(nèi)存塊的對(duì)應(yīng)關(guān)系對(duì)所述第二對(duì)象進(jìn)行第二標(biāo)記處理。由此,參照第一標(biāo)記線程的標(biāo)記處理過(guò)程,通過(guò)n個(gè)標(biāo)記線程的并行標(biāo)記處理,實(shí)現(xiàn)了利用有限的內(nèi)存進(jìn)行并行標(biāo)記處理,提高整個(gè)垃圾回收的性能。
附圖說(shuō)明
本發(fā)明上述的和/或附加的方面和優(yōu)點(diǎn)從下面結(jié)合附圖對(duì)實(shí)施例的描述中將變得明顯和容易理解,其中:
圖1是本申請(qǐng)一個(gè)實(shí)施例的用于垃圾回收的并行標(biāo)記處理方法的流程圖;
圖2是本申請(qǐng)另一個(gè)實(shí)施例的用于垃圾回收的并行標(biāo)記處理方法的流程圖;
圖3為用于垃圾回收的第一標(biāo)記處理流程示意圖;
圖4為預(yù)先申請(qǐng)的n個(gè)標(biāo)記線程的示意圖;
圖5是應(yīng)用圖4所示的標(biāo)記線程并行標(biāo)記處理的流程圖一;
圖6是應(yīng)用圖4所示的標(biāo)記線程并行標(biāo)記處理的流程圖二;
圖7是應(yīng)用圖4所示的標(biāo)記線程并行標(biāo)記處理的流程圖三;
圖8是應(yīng)用圖4所示的標(biāo)記線程并行標(biāo)記處理的流程圖四;
圖9是應(yīng)用圖4所示的標(biāo)記線程并行標(biāo)記處理的流程圖五;
圖10是應(yīng)用圖4所示的標(biāo)記線程并行標(biāo)記處理的流程圖六;
圖11是本申請(qǐng)一個(gè)實(shí)施例的用于垃圾回收的并行標(biāo)記處理裝置的結(jié)構(gòu)示意圖;
圖12是本申請(qǐng)另一個(gè)實(shí)施例的用于垃圾回收的并行標(biāo)記處理裝置的結(jié)構(gòu)示意圖;
圖13是本申請(qǐng)另一個(gè)實(shí)施例的用于垃圾回收的并行標(biāo)記處理裝置的結(jié)構(gòu)示意圖;
圖14是本申請(qǐng)另一個(gè)實(shí)施例的用于垃圾回收的并行標(biāo)記處理裝置的結(jié)構(gòu)示意圖;
圖15是本申請(qǐng)另一個(gè)實(shí)施例的用于垃圾回收的并行標(biāo)記處理裝置的結(jié)構(gòu)示意圖;
圖16是本申請(qǐng)另一個(gè)實(shí)施例的用于垃圾回收的并行標(biāo)記處理裝置的結(jié)構(gòu)示意圖;
圖17是本申請(qǐng)另一個(gè)實(shí)施例的用于垃圾回收的并行標(biāo)記處理裝置的結(jié)構(gòu)示意圖。
具體實(shí)施方式
下面詳細(xì)描述本申請(qǐng)的實(shí)施例,所述實(shí)施例的示例在附圖中示出,其中自始至終相同或類似的標(biāo)號(hào)表示相同或類似的元件或具有相同或類似功能的元件。下面通過(guò)參考附圖描述的實(shí)施例是示例性的,旨在用于解釋本申請(qǐng),而不能理解為對(duì)本申請(qǐng)的限制。
下面參考附圖描述本申請(qǐng)實(shí)施例的用于垃圾回收的并行標(biāo)記處理方法及裝置。
圖1是本申請(qǐng)一個(gè)實(shí)施例的用于垃圾回收的并行標(biāo)記處理方法的流程圖。
如圖1所示,該用于垃圾回收的并行標(biāo)記處理方法包括:
步驟101,根據(jù)虛擬機(jī)堆中的內(nèi)存塊與n個(gè)標(biāo)記線程的對(duì)應(yīng)關(guān)系,遍歷所述虛擬機(jī)堆中的第一對(duì)象,其中,n為大于1的整數(shù),n個(gè)標(biāo)記線程占用的內(nèi)存容量是預(yù)先設(shè)置的,每個(gè)標(biāo)記線程至少包括:1個(gè)私有棧。
具體地,為了提高用于垃圾回收的標(biāo)記處理效率,本發(fā)明各實(shí)施例提供的處理方法利用了多核cpu的并行處理能力,預(yù)先申請(qǐng)n個(gè)標(biāo)記線程,其中,每個(gè)標(biāo)記線程至少包括:1個(gè)私有棧,私有棧用于存儲(chǔ)本線程負(fù)責(zé)標(biāo)記的對(duì)象的指針。
需要說(shuō)明的是,n為大于1的整數(shù),根據(jù)實(shí)際應(yīng)用的cpu的并行處理能力而定。例如:
如果cpu的并行處理能力為雙核,可以申請(qǐng)2個(gè)容量限定的標(biāo)記線程;或,
如果cpu的并行處理能力為四核,可以申請(qǐng)4個(gè)容量限定的標(biāo)記線程;或,
如果cpu的并行處理能力為八核,可以申請(qǐng)8個(gè)容量限定的標(biāo)記線程。
需要注意的是,以上僅為舉例說(shuō)明,可以根據(jù)實(shí)際應(yīng)用需要進(jìn)行設(shè)置和調(diào)整。
需要強(qiáng)調(diào)的是,隨著標(biāo)記對(duì)象的增加,現(xiàn)有的標(biāo)記處理技術(shù)需要不斷的增加標(biāo)記線程的內(nèi)存占用量,降低了標(biāo)記處理的性能和效率。因此,本發(fā)明提供的并行標(biāo)記處理方法,預(yù)先對(duì)n個(gè)標(biāo)記線程占用的內(nèi)存容量進(jìn)行設(shè)置,也就是會(huì)所,n個(gè)標(biāo)記線程占用的內(nèi)存容量不會(huì)隨著標(biāo)記對(duì)象的溢出而增加,以便保證標(biāo)記處理的性能和效率。
需要說(shuō)明的是,可以根據(jù)應(yīng)用需要采用多種方式對(duì)n個(gè)標(biāo)記線程占用的內(nèi)存容量進(jìn)行設(shè)置,例如:
示例一,對(duì)每個(gè)標(biāo)記線程的容量進(jìn)行設(shè)置;
示例二,對(duì)n個(gè)標(biāo)記線程占用的內(nèi)存總?cè)萘窟M(jìn)行設(shè)置,每個(gè)標(biāo)記線程可以不限定,或者,比如限定最大的一個(gè)等。
為了提高標(biāo)記效率,實(shí)現(xiàn)多線程并行標(biāo)記的負(fù)載均衡,預(yù)先建立虛擬機(jī)堆中的內(nèi)存塊與n標(biāo)記線程的對(duì)應(yīng)關(guān)系。也就是說(shuō),預(yù)先為每個(gè)標(biāo)記線程配置好對(duì)應(yīng)負(fù)責(zé)標(biāo)記的虛擬機(jī)堆中的內(nèi)存塊。
需要注意的是,可以根據(jù)實(shí)際應(yīng)用需要建立虛擬機(jī)堆中內(nèi)存塊與n個(gè)標(biāo)記線程的對(duì)應(yīng)關(guān)系,例如包括:
示例一:為每個(gè)內(nèi)存塊指定對(duì)應(yīng)的標(biāo)記線程;或者,
示例二:為每個(gè)標(biāo)記線程指定負(fù)責(zé)標(biāo)記的內(nèi)存塊。
進(jìn)而,從虛擬機(jī)系統(tǒng)中獲取預(yù)先存儲(chǔ)的虛擬機(jī)堆中所有的第一對(duì)象,根據(jù)上述設(shè)置的虛擬機(jī)堆中的內(nèi)存塊與n個(gè)標(biāo)記線程的對(duì)應(yīng)關(guān)系,遍歷虛擬機(jī)堆中的第一對(duì)象。
步驟102,將當(dāng)前處理的第一對(duì)象的第一指針壓入與該第一對(duì)象所在的內(nèi)存塊對(duì)應(yīng)的標(biāo)記線程的私有棧,根據(jù)所述第一指針的壓入情況對(duì)所述第一對(duì)象進(jìn)行第一標(biāo)記處理。
步驟103,對(duì)所述第一對(duì)象遍歷完成后,向所述n個(gè)標(biāo)記線程發(fā)送線程啟動(dòng)指令,以使所述n個(gè)標(biāo)記線程根據(jù)各自私有棧中所述第一指針的壓入情況,同步進(jìn)行用于垃圾回收的標(biāo)記處理。
具體地,首先確定當(dāng)前處理的第一對(duì)象所在的內(nèi)存塊,然后根據(jù)上述的對(duì)應(yīng)關(guān)系獲取與該第一對(duì)象所在的內(nèi)存塊對(duì)應(yīng)的標(biāo)記線程。將該第一對(duì)象的第一指針壓入到與該第一對(duì)象所在的內(nèi)存塊對(duì)應(yīng)的標(biāo)記線程的私有棧中。
進(jìn)而,根據(jù)該第一對(duì)象的第一指針的壓入情況,對(duì)當(dāng)前處理的第一對(duì)象進(jìn)行第一標(biāo)記處理。也就是說(shuō),如果將當(dāng)前第一對(duì)象的第一指針成功壓入到對(duì)應(yīng)標(biāo)記線程的私有棧中, 則確定該私有棧沒(méi)有溢出,將當(dāng)前處理的第一對(duì)象標(biāo)記為壓入狀態(tài);如果沒(méi)有將當(dāng)前第一對(duì)象的第一指針成功壓入到對(duì)應(yīng)標(biāo)記線程的私有棧中,則確定該私有棧溢出,將當(dāng)前處理的第一對(duì)象標(biāo)記為溢出狀態(tài)。
需要說(shuō)明的是,對(duì)第一對(duì)象是否溢出的標(biāo)記方式有很多,可以根據(jù)需要進(jìn)行選擇,例如:
示例一,可以通過(guò)列表的方式記錄與每個(gè)標(biāo)記線程的私有棧對(duì)應(yīng)的第一對(duì)象的壓入情況;或者,
示例二,可以通過(guò)第一對(duì)象所在內(nèi)存塊位圖中的相應(yīng)位置標(biāo)記第一對(duì)象的壓入情況。
需要說(shuō)明的是,以上僅為舉例說(shuō)明,可以根據(jù)實(shí)際應(yīng)用需要進(jìn)行選擇標(biāo)記方式。
對(duì)虛擬機(jī)堆中的第一對(duì)象遍歷完成后,各個(gè)標(biāo)記線程的私有棧中都存放了本線程負(fù)責(zé)標(biāo)記的內(nèi)存塊中第一對(duì)象的第一指針。如果標(biāo)記線程的私有棧中溢出,說(shuō)明私有棧的空間已滿,無(wú)法繼續(xù)存放本線程負(fù)責(zé)標(biāo)記的內(nèi)存塊中第一對(duì)象的第一指針,則將這些第一對(duì)象標(biāo)記為溢出狀態(tài)。當(dāng)標(biāo)記線程的私有棧中有新的處理空間時(shí),繼續(xù)存放本線程負(fù)責(zé)標(biāo)記的內(nèi)存塊中第一對(duì)象的第一指針。
進(jìn)而,向n個(gè)標(biāo)記線程發(fā)送線程啟動(dòng)指令,從而n個(gè)標(biāo)記線程根據(jù)各自私有棧中第一指針的壓入情況,同步進(jìn)行用于垃圾回收的標(biāo)記處理。
本申請(qǐng)實(shí)施例的用于垃圾回收的并行標(biāo)記處理方法,通過(guò)根據(jù)虛擬機(jī)堆中的內(nèi)存塊與n個(gè)標(biāo)記線程的對(duì)應(yīng)關(guān)系,遍歷所述虛擬機(jī)堆中的第一對(duì)象,其中,n個(gè)標(biāo)記線程占用的內(nèi)存容量是預(yù)先設(shè)置的,將當(dāng)前處理的第一對(duì)象的第一指針壓入與該第一對(duì)象所在的內(nèi)存塊對(duì)應(yīng)的標(biāo)記線程的私有棧,根據(jù)所述第一指針的壓入情況對(duì)所述第一對(duì)象進(jìn)行第一標(biāo)記處理,對(duì)所述第一對(duì)象遍歷完成后,向所述n個(gè)標(biāo)記線程發(fā)送線程啟動(dòng)指令,以使所述n個(gè)標(biāo)記線程根據(jù)各自私有棧中所述第一指針的壓入情況,同步進(jìn)行用于垃圾回收的標(biāo)記處理。由此,利用有限的內(nèi)存實(shí)現(xiàn)多線程的并行標(biāo)記處理,提高整個(gè)垃圾回收的性能。
為了更加清楚的說(shuō)明上述實(shí)施例中虛擬機(jī)堆中所有內(nèi)存塊與n個(gè)標(biāo)記線程的對(duì)應(yīng)關(guān)系的建立過(guò)程,以及第一標(biāo)記過(guò)程,通過(guò)圖2所示實(shí)施例進(jìn)行說(shuō)明。
圖2是本申請(qǐng)另一個(gè)實(shí)施例的用于垃圾回收的并行標(biāo)記處理方法的流程圖。
如圖2所示,該用于垃圾回收的并行標(biāo)記處理方法可以包括以下步驟:
步驟201,申請(qǐng)n個(gè)標(biāo)記線程,其中,n為大于1的整數(shù),n個(gè)標(biāo)記線程占用的內(nèi)存容量是預(yù)先設(shè)置的,每個(gè)標(biāo)記線程至少包括:1個(gè)私有棧。
具體地,根據(jù)實(shí)際應(yīng)用需要和cpu的多核處理能力,設(shè)置標(biāo)記線程的數(shù)量n,以及設(shè)置n個(gè)標(biāo)記線程所占的內(nèi)存容量。其中,每個(gè)標(biāo)記線程包括一個(gè)私有棧,私有棧用于存儲(chǔ) 本線程負(fù)責(zé)標(biāo)記的對(duì)象的指針。
步驟202,遍歷虛擬機(jī)堆的所有內(nèi)存塊,為每個(gè)內(nèi)存塊分配編號(hào);
步驟203,根據(jù)內(nèi)存塊編號(hào)和標(biāo)記線程總數(shù)n,確定與每個(gè)內(nèi)存塊編號(hào)對(duì)應(yīng)的標(biāo)記線程編號(hào)。
具體地,為了向虛擬機(jī)堆的每個(gè)內(nèi)存塊分配負(fù)責(zé)標(biāo)記內(nèi)存塊對(duì)象的標(biāo)記線程,遍歷虛擬機(jī)堆的內(nèi)存塊,為每個(gè)內(nèi)存塊分配編號(hào)。
進(jìn)而,根據(jù)內(nèi)存塊編號(hào)和標(biāo)記線程總數(shù)n,確定與每個(gè)內(nèi)存塊編號(hào)對(duì)應(yīng)的標(biāo)記線程編號(hào)。
需要說(shuō)明的是,根據(jù)內(nèi)存塊編號(hào)和標(biāo)記線程總數(shù)n,確定與每個(gè)內(nèi)存塊編號(hào)對(duì)應(yīng)的標(biāo)記線程編號(hào)的方式有很多,例如:可以通過(guò)獲取標(biāo)記線程總數(shù)n被內(nèi)存塊編號(hào)整除后的余數(shù),確定與每個(gè)內(nèi)存塊編號(hào)對(duì)應(yīng)的標(biāo)記線程編號(hào),公式表達(dá)如下所示:
id=id%n,其中,
n為標(biāo)記線程總數(shù);id為內(nèi)存塊編號(hào);id為標(biāo)記線程編號(hào);“%”表示n被id整除后的取余處理。
例如:假設(shè)當(dāng)前申請(qǐng)的標(biāo)記線程總數(shù)n=4,編號(hào)分別為0-3,內(nèi)存塊為十個(gè),編號(hào)分別為1-10,通過(guò)上述公式處理后獲知:
內(nèi)存塊編號(hào)1對(duì)應(yīng)的標(biāo)記線程編號(hào)為0;
內(nèi)存塊編號(hào)2對(duì)應(yīng)的標(biāo)記線程編號(hào)為1;
內(nèi)存塊編號(hào)3對(duì)應(yīng)的標(biāo)記線程編號(hào)為2;
內(nèi)存塊編號(hào)4對(duì)應(yīng)的標(biāo)記線程編號(hào)為3;
內(nèi)存塊編號(hào)5對(duì)應(yīng)的標(biāo)記線程編號(hào)為0;
內(nèi)存塊編號(hào)6對(duì)應(yīng)的標(biāo)記線程編號(hào)為1;
內(nèi)存塊編號(hào)7對(duì)應(yīng)的標(biāo)記線程編號(hào)為2;
內(nèi)存塊編號(hào)8對(duì)應(yīng)的標(biāo)記線程編號(hào)為3;
內(nèi)存塊編號(hào)9對(duì)應(yīng)的標(biāo)記線程編號(hào)為1;
內(nèi)存塊編號(hào)10對(duì)應(yīng)的標(biāo)記線程編號(hào)為2。
步驟204,根據(jù)虛擬機(jī)堆中的內(nèi)存塊與n個(gè)標(biāo)記線程的對(duì)應(yīng)關(guān)系,遍歷所述虛擬機(jī)堆中的第一對(duì)象,將當(dāng)前處理的第一對(duì)象的第一指針壓入與該第一對(duì)象所在的內(nèi)存塊對(duì)應(yīng)的標(biāo)記線程的私有棧;
步驟205,判斷是否將當(dāng)前第一對(duì)象的第一指針成功壓入對(duì)應(yīng)標(biāo)記線程的私有棧中;
步驟206,如果將所述第一指針成功壓入對(duì)應(yīng)標(biāo)記線程的私有棧,則將當(dāng)前第一對(duì)象 所在內(nèi)存塊的位圖中、與該第一對(duì)象對(duì)應(yīng)的狀態(tài)標(biāo)記為壓入狀態(tài);
步驟207,如果未能將所述第一指針成功壓入對(duì)應(yīng)標(biāo)記線程的私有棧,則將當(dāng)前第一對(duì)象所在內(nèi)存塊的位圖中、與該第一對(duì)象對(duì)應(yīng)的狀態(tài)標(biāo)記為溢出狀態(tài)。
步驟208,對(duì)所述第一對(duì)象遍歷完成后,向所述n個(gè)標(biāo)記線程發(fā)送線程啟動(dòng)指令,以使所述n個(gè)標(biāo)記線程根據(jù)各自私有棧中所述第一指針的壓入情況,同步進(jìn)行用于垃圾回收的標(biāo)記處理。
具體地,確定當(dāng)前處理的第一對(duì)象所在的內(nèi)存塊,然后根據(jù)上述的對(duì)應(yīng)關(guān)系獲取與該第一對(duì)象所在的內(nèi)存塊對(duì)應(yīng)的標(biāo)記線程。將該第一對(duì)象的第一指針壓入到與該第一對(duì)象所在的內(nèi)存塊對(duì)應(yīng)的標(biāo)記線程的私有棧中。
進(jìn)而,根據(jù)該第一對(duì)象的第一指針的壓入情況,對(duì)當(dāng)前處理的第一對(duì)象進(jìn)行第一標(biāo)記處理。也就是說(shuō),如果將當(dāng)前第一對(duì)象的第一指針成功壓入到對(duì)應(yīng)標(biāo)記線程的私有棧中,則確定該私有棧沒(méi)有溢出,將當(dāng)前處理的第一對(duì)象標(biāo)記為壓入狀態(tài);如果沒(méi)有將當(dāng)前第一對(duì)象的第一指針成功壓入到對(duì)應(yīng)標(biāo)記線程的私有棧中,則確定該私有棧溢出,將當(dāng)前處理的第一對(duì)象標(biāo)記為溢出狀態(tài)。
對(duì)所述第一對(duì)象遍歷完成后,各個(gè)標(biāo)記線程的私有棧中都存放了本線程負(fù)責(zé)標(biāo)記的內(nèi)存塊中第一對(duì)象的第一指針。如果標(biāo)記線程的私有棧中溢出,說(shuō)明私有棧的空間已滿,無(wú)法繼續(xù)存放本線程負(fù)責(zé)標(biāo)記的內(nèi)存塊中第一對(duì)象的第一指針,則將這些第一對(duì)象標(biāo)記為溢出狀態(tài)。當(dāng)標(biāo)記線程的私有棧中有新的處理空間時(shí),繼續(xù)存放本線程負(fù)責(zé)標(biāo)記的內(nèi)存塊中第一對(duì)象的第一指針。
進(jìn)而,向n個(gè)標(biāo)記線程發(fā)送線程啟動(dòng)指令,從而n個(gè)標(biāo)記線程根據(jù)各自私有棧中第一指針的壓入情況,同步進(jìn)行用于垃圾回收的標(biāo)記處理。
為了更加清楚的說(shuō)明上述實(shí)施例中涉及的對(duì)第一對(duì)象進(jìn)行第一標(biāo)記處理的處理過(guò)程,通過(guò)圖3所示實(shí)施例說(shuō)明如下。
圖3為用于垃圾回收的第一標(biāo)記處理流程示意圖。
參見(jiàn)圖3,本實(shí)施例中采用在內(nèi)存塊位圖中進(jìn)行著色標(biāo)記的方式對(duì)第一對(duì)象的壓入情況進(jìn)行第一標(biāo)記處理,具體標(biāo)記如下:
如果將當(dāng)前處理的第一對(duì)象的第一指針成功壓入對(duì)應(yīng)標(biāo)記線程的私有棧中,則將與該第一對(duì)象所在內(nèi)存塊位圖中的對(duì)應(yīng)位置進(jìn)行標(biāo)黑處理;
如果沒(méi)有將當(dāng)前處理的第一對(duì)象的第一指針成功壓入對(duì)應(yīng)標(biāo)記線程的私有棧中,則將與該第一對(duì)象所在內(nèi)存塊位圖中的對(duì)應(yīng)位置進(jìn)行標(biāo)灰處理。
需要說(shuō)明的是,以上根據(jù)第一對(duì)象的第一指針向?qū)?yīng)標(biāo)記線程的私有棧的不同壓入情 況,在內(nèi)存塊位圖中與第一對(duì)象的對(duì)應(yīng)位置進(jìn)行的著色處理僅僅是示例性說(shuō)明,可以根據(jù)具體的應(yīng)用需要進(jìn)行調(diào)整。
基于上述標(biāo)記方式,具體以處理虛擬堆中的根對(duì)象a(本示例中虛擬堆中的根對(duì)象相當(dāng)于上述實(shí)施例中涉及的第一對(duì)象)為例說(shuō)明如下:
步驟10:申請(qǐng)n個(gè)標(biāo)記線程,其中,n為大于1的整數(shù),n個(gè)標(biāo)記線程占用的內(nèi)存容量是預(yù)先設(shè)置的,每個(gè)標(biāo)記線程至少包括:1個(gè)私有棧。
步驟20:建立虛擬機(jī)堆中的內(nèi)存塊與n個(gè)標(biāo)記線程的對(duì)應(yīng)關(guān)系。
步驟30:遍歷虛擬機(jī)堆中的根對(duì)象,如果遍歷完畢,則退出,否則執(zhí)行步驟40。
步驟40:將當(dāng)前處理的根對(duì)象a的第一指針壓入與a所在的內(nèi)存塊10對(duì)應(yīng)的標(biāo)記線程1的私有棧1中。
步驟50:判斷是否將a的第一指針成功壓入標(biāo)記線程1的私有棧1中;
步驟60:如果將a的第一指針成功壓入標(biāo)記線程1的私有棧1中,則將內(nèi)存塊10的位圖中、與a對(duì)應(yīng)的位置標(biāo)黑,即a為壓入狀態(tài)。
步驟70:如果沒(méi)有將a的第一指針成功壓入標(biāo)記線程1的私有棧1中,則將內(nèi)存塊10的位圖中、與a對(duì)應(yīng)的位置標(biāo)灰,即a為溢出狀態(tài)。
本申請(qǐng)實(shí)施例的用于垃圾回收的并行標(biāo)記處理方法,通過(guò)申請(qǐng)n個(gè)標(biāo)記線程,遍歷虛擬機(jī)堆的所有內(nèi)存塊,為每個(gè)內(nèi)存塊分配編號(hào);根據(jù)內(nèi)存塊編號(hào)和標(biāo)記線程總數(shù)n,確定與每個(gè)內(nèi)存塊編號(hào)對(duì)應(yīng)的標(biāo)記線程編號(hào),進(jìn)而將當(dāng)前處理的第一對(duì)象的第一指針壓入與該第一對(duì)象所在的內(nèi)存塊對(duì)應(yīng)的標(biāo)記線程的私有棧,根據(jù)所述第一指針的壓入情況對(duì)所述第一對(duì)象進(jìn)行第一標(biāo)記處理,對(duì)所述第一對(duì)象遍歷完成后,向所述n個(gè)標(biāo)記線程發(fā)送線程啟動(dòng)指令,以使所述n個(gè)標(biāo)記線程根據(jù)各自私有棧中所述第一指針的壓入情況,同步進(jìn)行用于垃圾回收的標(biāo)記處理。由此,利用有限的內(nèi)存實(shí)現(xiàn)高效的并行標(biāo)記,同時(shí)實(shí)現(xiàn)標(biāo)記線程負(fù)載均衡,提高整個(gè)垃圾回收的性能。
基于上述實(shí)施例,對(duì)所述第一對(duì)象遍歷完成后,各個(gè)標(biāo)記線程的私有棧中都存放了本線程負(fù)責(zé)標(biāo)記的內(nèi)存塊中第一對(duì)象的第一指針。如果標(biāo)記線程的私有棧中溢出,說(shuō)明私有棧的空間已滿,無(wú)法繼續(xù)存放本線程負(fù)責(zé)標(biāo)記的內(nèi)存塊中第一對(duì)象的第一指針,則將這些第一對(duì)象標(biāo)記為溢出狀態(tài)。當(dāng)標(biāo)記線程的私有棧中有新的處理空間時(shí),繼續(xù)存放本線程負(fù)責(zé)標(biāo)記的內(nèi)存塊中第一對(duì)象的第一指針。
進(jìn)而,向n個(gè)標(biāo)記線程發(fā)送線程啟動(dòng)指令,從而n個(gè)標(biāo)記線程根據(jù)各自私有棧中第一指針的壓入情況,同步進(jìn)行用于垃圾回收的標(biāo)記處理。
需要說(shuō)明的是,預(yù)先申請(qǐng)的n個(gè)標(biāo)記線程的處理過(guò)程是同步并行的,為了更加清楚的 說(shuō)明n個(gè)標(biāo)記線程的標(biāo)記處理過(guò)程,以第一標(biāo)記線程的標(biāo)記處理過(guò)程為例,通過(guò)下述實(shí)施例說(shuō)明如下,其他(n-1)個(gè)標(biāo)記線程的標(biāo)記處理過(guò)程參見(jiàn)第一標(biāo)記線程,不再一一贅述。
圖4為預(yù)先申請(qǐng)的n個(gè)標(biāo)記線程的示意圖。
參見(jiàn)圖4,預(yù)先申請(qǐng)的n個(gè)標(biāo)記線程,以及n個(gè)標(biāo)記線程所占用的內(nèi)存容量。n個(gè)標(biāo)記線程包括:thread-1、thread-2,…thread-n。其中,每個(gè)標(biāo)記線程至少包括:1個(gè)私有棧(stack),經(jīng)過(guò)上述處理,各個(gè)私有棧中存儲(chǔ)有本線程負(fù)責(zé)標(biāo)記的第一對(duì)象(rootobjects)的第一指針。
圖5是應(yīng)用圖4所示的標(biāo)記線程并行標(biāo)記處理的流程圖一。
參見(jiàn)圖5,本實(shí)施例中以第一標(biāo)記線程(thread-1)的標(biāo)記處理過(guò)程為例,該用于垃圾回收的并行標(biāo)記處理方法包括:
步驟301,第一標(biāo)記線程根據(jù)線程啟動(dòng)指令,從第一私有棧中取出預(yù)先壓入的第一對(duì)象的第一指針。
步驟302,所述第一標(biāo)記線程遍歷所述第一指針指示的所述第一對(duì)象引用的第二對(duì)象,并根據(jù)預(yù)設(shè)的n個(gè)標(biāo)記線程與虛擬機(jī)堆中內(nèi)存塊的對(duì)應(yīng)關(guān)系對(duì)所述第二對(duì)象進(jìn)行第二標(biāo)記處理。
具體地,第一標(biāo)記線程接收到線程啟動(dòng)指令之后,根據(jù)該線程啟動(dòng)指令,從第一私有棧中取出預(yù)先壓入的第一對(duì)象的第一指針。
進(jìn)而,第一標(biāo)記線程查詢預(yù)存的對(duì)象關(guān)系表,獲取當(dāng)前處理的第一指針指示的第二對(duì)象,需要解釋的是,第二對(duì)象為第一對(duì)象的引用對(duì)象。
第一標(biāo)記線程遍歷當(dāng)前處理的第一指針指示的第二對(duì)象,根據(jù)預(yù)設(shè)的n個(gè)標(biāo)記線程與虛擬機(jī)堆中內(nèi)存塊的對(duì)應(yīng)關(guān)系,判斷負(fù)責(zé)處理當(dāng)前第二對(duì)象所在的內(nèi)存塊的標(biāo)記線程是否為本線程,從而對(duì)第二對(duì)象進(jìn)行第二標(biāo)記處理。
本申請(qǐng)實(shí)施例,通過(guò)第一標(biāo)記線程根據(jù)線程啟動(dòng)指令,從第一私有棧中取出預(yù)先壓入的第一對(duì)象的第一指針,遍歷所述第一指針指示的所述第一對(duì)象引用的第二對(duì)象,并根據(jù)預(yù)設(shè)的n個(gè)標(biāo)記線程與虛擬機(jī)堆中內(nèi)存塊的對(duì)應(yīng)關(guān)系對(duì)所述第二對(duì)象進(jìn)行第二標(biāo)記處理。由此,參照第一標(biāo)記線程的標(biāo)記處理過(guò)程,通過(guò)n個(gè)標(biāo)記線程的并行標(biāo)記處理,實(shí)現(xiàn)了利用有限的內(nèi)存進(jìn)行并行標(biāo)記處理,提高整個(gè)垃圾回收的性能。
圖6是應(yīng)用圖4所示的標(biāo)記線程并行標(biāo)記處理的流程圖二。
繼續(xù)參見(jiàn)圖4,基于圖5所示實(shí)施例,每個(gè)標(biāo)記線程還包括:(n-1)個(gè)公用輸出隊(duì)列(queue-1、queue-2…queue-n-1),以及1個(gè)緩存隊(duì)列(buf-queue)。其中,(n-1)個(gè)公用輸出隊(duì)列用于存儲(chǔ)其他(n-1)個(gè)標(biāo)記線程負(fù)責(zé)標(biāo)記的對(duì)象的指針;當(dāng)與其他(n-1)個(gè)標(biāo) 記線程對(duì)應(yīng)的公用輸出隊(duì)列溢出時(shí),1個(gè)緩存隊(duì)列用于緩存其他(n-1)個(gè)標(biāo)記線程負(fù)責(zé)標(biāo)記的對(duì)象的指針。
參見(jiàn)圖6,繼續(xù)以第一標(biāo)記線程(thread-1)的標(biāo)記處理過(guò)程為例,圖5所示實(shí)施例中的步驟302具體包括:
步驟401,第一標(biāo)記線程根據(jù)所述對(duì)應(yīng)關(guān)系,判斷是否負(fù)責(zé)對(duì)當(dāng)前處理的第二對(duì)象所在的內(nèi)存塊p1進(jìn)行標(biāo)記處理;
具體地,第一標(biāo)記線程根據(jù)預(yù)設(shè)的n個(gè)標(biāo)記線程與虛擬機(jī)堆中內(nèi)存塊的對(duì)應(yīng)關(guān)系,判斷本線程是否負(fù)責(zé)對(duì)當(dāng)前處理的第二對(duì)象所在的內(nèi)存塊p1進(jìn)行標(biāo)記處理。
如果第一標(biāo)記線程獲知負(fù)責(zé)對(duì)該內(nèi)存塊p1進(jìn)行標(biāo)記處理的標(biāo)記線程為第一標(biāo)記線程,即本線程負(fù)責(zé)對(duì)該內(nèi)存塊p1進(jìn)行標(biāo)記處理,進(jìn)而執(zhí)行步驟402-步驟406;
如果第一標(biāo)記線程獲知負(fù)責(zé)對(duì)該內(nèi)存塊p1進(jìn)行標(biāo)記處理的標(biāo)記線程為標(biāo)記線程m,標(biāo)記線程m不是第一標(biāo)記線程,即本線程不負(fù)責(zé)對(duì)該內(nèi)存塊p1進(jìn)行標(biāo)記處理,進(jìn)而執(zhí)行步驟407-步驟415。
步驟402,將當(dāng)前處理的第二對(duì)象的第二指針壓入到所述第一私有棧中。
具體地,針對(duì)步驟401中第一標(biāo)記線程負(fù)責(zé)對(duì)所述內(nèi)存塊p1進(jìn)行標(biāo)記處理的判斷分支,第一標(biāo)記線程將負(fù)責(zé)處理對(duì)象的指針壓入到本線程的私有棧中進(jìn)行處理。即將當(dāng)前處理的第二對(duì)象的第二指針壓入到所述第一私有棧中進(jìn)行第二標(biāo)記處理。
步驟403,所述第一標(biāo)記線程判斷是否成功將所述第二指針壓入到所述第一私有棧中。
具體地,第一標(biāo)記線程判斷是否成功將當(dāng)前處理的第二對(duì)象的第二指針壓入到本線程的第一私有棧中。
如果第一標(biāo)記線程未能成功將當(dāng)前處理的第二對(duì)象的第二指針壓入到本線程的第一私有棧中,則執(zhí)行步驟404和步驟405對(duì)第二對(duì)象進(jìn)行溢出狀態(tài)的標(biāo)記處理;
如果第一標(biāo)記線程成功將當(dāng)前處理的第二對(duì)象的第二指針壓入到本線程的第一私有棧中,則執(zhí)行步驟406繼續(xù)對(duì)下一個(gè)第二對(duì)象進(jìn)行第二標(biāo)記處理。
步驟404,將所述內(nèi)存塊p1的位圖中、與該第二對(duì)象對(duì)應(yīng)的狀態(tài)標(biāo)記為溢出狀態(tài)。
步驟405,設(shè)置與所述內(nèi)存塊p1對(duì)應(yīng)的溢出標(biāo)志。
具體地,針對(duì)步驟403中第一標(biāo)記線程未能成功將當(dāng)前處理的第二對(duì)象的第二指針壓入到本線程的第一私有棧中的判斷分支,將第二對(duì)象設(shè)置為溢出狀態(tài)。例如:將上述內(nèi)存塊p1的位圖中、與該第二對(duì)象對(duì)應(yīng)的狀態(tài)標(biāo)記為溢出狀態(tài)。并且進(jìn)一步地設(shè)置與該內(nèi)存塊p1對(duì)應(yīng)的溢出標(biāo)志。
步驟406,如果所述第一標(biāo)記線程成功將所述第二指針壓入到所述第一私有棧中,則 繼續(xù)對(duì)所述第一指針對(duì)應(yīng)的下一個(gè)第二對(duì)象進(jìn)行處理。
具體地,針對(duì)步驟403中第一標(biāo)記線程成功將所述第二指針壓入到所述第一私有棧中的判斷分支,繼續(xù)對(duì)從第一私有棧中取出的第一指針對(duì)應(yīng)的下一個(gè)第二對(duì)象進(jìn)行處理。
步驟407,確定標(biāo)記線程m負(fù)責(zé)對(duì)所述內(nèi)存塊p1進(jìn)行標(biāo)記處理;
步驟408,將所述第二指針壓入到所述第一標(biāo)記線程中與所述標(biāo)記線程m對(duì)應(yīng)的公用輸出隊(duì)列m中;
具體地,針對(duì)步驟401中第一標(biāo)記線程不負(fù)責(zé)對(duì)所述內(nèi)存塊p1進(jìn)行標(biāo)記處理的判斷分支,根據(jù)n個(gè)標(biāo)記線程與虛擬機(jī)堆中內(nèi)存塊的對(duì)應(yīng)關(guān)系,確定標(biāo)記線程m負(fù)責(zé)對(duì)所述內(nèi)存塊p1進(jìn)行標(biāo)記處理。
進(jìn)而,第一標(biāo)記線程將當(dāng)前處理的第二對(duì)象的第二指針壓入到第一標(biāo)記線程中與標(biāo)記線程m對(duì)應(yīng)的公用輸出隊(duì)列m中,以使標(biāo)記線程m后續(xù)從第一標(biāo)記線程中的公用輸出隊(duì)列m中獲取待處理的第二對(duì)象的第二指針。
步驟409,所述第一標(biāo)記線程判斷是否成功將所述第二指針壓入到所述公用輸出隊(duì)列m中;
第一標(biāo)記線程判斷是否成功將當(dāng)前處理的第二對(duì)象的第二指針壓入到公用輸出隊(duì)列m中。
如果第一標(biāo)記線程成功將當(dāng)前處理的第二對(duì)象的第二指針壓入到第一標(biāo)記線程中的公用輸出隊(duì)列m中,則執(zhí)行步驟410,繼續(xù)對(duì)當(dāng)前從第一私有棧中中獲取的第一指針對(duì)應(yīng)的下一個(gè)第二對(duì)象進(jìn)行處理。
如果第一標(biāo)記線程未能成功將當(dāng)前處理的第二對(duì)象的第二指針壓入到第一標(biāo)記線程中的公用輸出隊(duì)列m中,則執(zhí)行步驟411,通過(guò)第一標(biāo)記線程的第一緩存隊(duì)列緩存該第二指針。
步驟410,繼續(xù)對(duì)所述第一指針對(duì)應(yīng)的下一個(gè)第二對(duì)象進(jìn)行處理。
具體地,針對(duì)步驟409中第一標(biāo)記線程成功將當(dāng)前第二指針壓入到第一標(biāo)記線程中的公用輸出隊(duì)列m中的判斷分支,繼續(xù)對(duì)上述第一指針對(duì)應(yīng)的下一個(gè)第二對(duì)象進(jìn)行處理。
步驟411,將所述第二指針壓入到所述第一標(biāo)記線程中的第一緩存隊(duì)列中;
具體地,針對(duì)步驟409中第一標(biāo)記線程未能成功將當(dāng)前第二指針壓入到第一標(biāo)記線程中的公用輸出隊(duì)列m中的判斷分支,將該第二指針壓入到第一標(biāo)記線程中的第一緩存隊(duì)列中。
步驟412,所述第一標(biāo)記線程判斷是否成功將所述第二指針壓入到所述第一緩存隊(duì)列中;
具體地,第一標(biāo)記線程判斷是否成功將該第二指針壓入到第一標(biāo)記線程的第一緩存隊(duì)列中;
如果第一標(biāo)記線程未能成功將所述第二指針壓入到所述第一緩存隊(duì)列中,則執(zhí)行步驟413和步驟414,對(duì)當(dāng)前處理的第二對(duì)象標(biāo)記溢出狀態(tài);
如果第一標(biāo)記線程成功將所述第二指針壓入到所述第一緩存隊(duì)列中,則執(zhí)行步驟415,對(duì)下一個(gè)第二對(duì)象繼續(xù)進(jìn)行標(biāo)記處理。
步驟413,將所述內(nèi)存塊p1的位圖中、與當(dāng)前處理的第二對(duì)象對(duì)應(yīng)的狀態(tài)標(biāo)記為溢出狀態(tài)。
步驟414,設(shè)置與所述內(nèi)存塊p1對(duì)應(yīng)的溢出標(biāo)志。
具體地,針對(duì)步驟412中第一標(biāo)記線程未能成功將所述第二指針壓入到所述第一緩存隊(duì)列中的判斷分支,將商戶內(nèi)存塊p1的位圖中、與當(dāng)前處理的第二對(duì)象對(duì)應(yīng)的狀態(tài)標(biāo)記為溢出狀態(tài),并進(jìn)一步地設(shè)置與該內(nèi)存塊p1對(duì)應(yīng)的溢出標(biāo)志。
步驟415,繼續(xù)對(duì)所述第一指針對(duì)應(yīng)的下一個(gè)第二對(duì)象進(jìn)行處理。
具體地,針對(duì)步驟412中第一標(biāo)記線程成功將所述第二指針壓入到所述第一緩存隊(duì)列中的判斷分支,繼續(xù)對(duì)當(dāng)前第一指針對(duì)應(yīng)的下一個(gè)第二對(duì)象進(jìn)行處理。
基于圖6所示實(shí)施例,進(jìn)一步地,在步驟401之前,還包括:
查詢當(dāng)前處理的第二對(duì)象所在內(nèi)存塊p1的位圖中與該第二對(duì)象對(duì)應(yīng)的狀態(tài)標(biāo)記。如果與該第二對(duì)象對(duì)應(yīng)的狀態(tài)標(biāo)記為未標(biāo)記狀態(tài),則將與該第二對(duì)象對(duì)應(yīng)的狀態(tài)修改為壓入狀態(tài)。
需要說(shuō)明的是,對(duì)第二對(duì)象是否溢出的標(biāo)記方式有很多,可以根據(jù)需要進(jìn)行選擇,例如:
示例一,可以通過(guò)列表的方式記錄與每個(gè)第二對(duì)象的壓入情況;或者,
示例二,可以通過(guò)第二對(duì)象所在內(nèi)存塊位圖中的相應(yīng)位置標(biāo)記第二對(duì)象的壓入情況。
需要說(shuō)明的是,以上僅為舉例說(shuō)明,可以根據(jù)實(shí)際應(yīng)用需要進(jìn)行選擇標(biāo)記方式。
本申請(qǐng)實(shí)施例,通過(guò)第一標(biāo)記線程根據(jù)線程啟動(dòng)指令,從第一私有棧中取出預(yù)先壓入的第一對(duì)象的第一指針,遍歷所述第一指針指示的所述第一對(duì)象引用的第二對(duì)象,并根據(jù)預(yù)設(shè)的n個(gè)標(biāo)記線程與虛擬機(jī)堆中內(nèi)存塊的對(duì)應(yīng)關(guān)系對(duì)所述第二對(duì)象進(jìn)行第二標(biāo)記處理。由此,參照第一標(biāo)記線程的標(biāo)記處理過(guò)程,通過(guò)n個(gè)標(biāo)記線程的并行標(biāo)記處理,利用有限的內(nèi)存實(shí)現(xiàn)高效的并行標(biāo)記,同時(shí)實(shí)現(xiàn)標(biāo)記線程負(fù)載均衡,從而減少cpu緩存一致性沖突,提高整個(gè)垃圾回收的性能。
圖7是應(yīng)用圖4所示的標(biāo)記線程并行標(biāo)記處理的流程圖三。
繼續(xù)參見(jiàn)圖4,每個(gè)標(biāo)記線程包括:1個(gè)私有棧(stack)、(n-1)個(gè)公用輸出隊(duì)列(queue-1、queue-2…queue-n-1),以及1個(gè)緩存隊(duì)列(buf-queue)。其中,1個(gè)私有棧(stack)用于存儲(chǔ)本線程負(fù)責(zé)標(biāo)記的對(duì)象的指針;(n-1)個(gè)公用輸出隊(duì)列用于存儲(chǔ)其他(n-1)個(gè)標(biāo)記線程負(fù)責(zé)標(biāo)記的對(duì)象的指針;當(dāng)與其他(n-1)個(gè)標(biāo)記線程對(duì)應(yīng)的公用輸出隊(duì)列溢出時(shí),1個(gè)緩存隊(duì)列用于緩存其他(n-1)個(gè)標(biāo)記線程負(fù)責(zé)標(biāo)記的對(duì)象的指針。
參見(jiàn)圖7,基于圖5所示實(shí)施例,所述方法還包括:
步驟501,第一標(biāo)記線程接到線程啟動(dòng)指令后,判斷本線程的第一私有棧是否為空;
具體地,第一標(biāo)記線程判斷本線程的第一私有棧是否為空;
如果第一標(biāo)記線程的第一私有棧不為空,則按照?qǐng)D5中所示實(shí)施例中的步驟302從第一私有棧中取出預(yù)先壓入的第一對(duì)象的第一指針,并按照?qǐng)D5或圖6所示的實(shí)施過(guò)程進(jìn)行處理,此處不再贅述。
如果第一標(biāo)記線程的第一私有棧為空,則執(zhí)行步驟502繼續(xù)判斷第一標(biāo)記線程中的第一緩存隊(duì)列是否為空。
步驟502,所述第一標(biāo)記線程判斷本線程的第一緩存隊(duì)列是否為空;
具體地,第一標(biāo)記線程判斷本線程的第一緩存隊(duì)列是否為空;
如果第一標(biāo)記線程中的第一緩存隊(duì)列不為空,執(zhí)行步驟503,從而對(duì)第一標(biāo)記線程不負(fù)責(zé)處理的第三對(duì)象向本線程中與該第三對(duì)象對(duì)應(yīng)的公用輸出隊(duì)列進(jìn)行分配處理;
如果第一標(biāo)記線程中的第一緩存隊(duì)列為空,則通過(guò)圖8所示實(shí)施例描述如何進(jìn)一步地對(duì)其他(n-1)個(gè)標(biāo)記線程中與第一標(biāo)記線程對(duì)應(yīng)的公用輸出隊(duì)列中的第四對(duì)象進(jìn)行標(biāo)記處理,后續(xù)實(shí)施例詳細(xì)說(shuō)明。
步驟503,所述第一標(biāo)記線程從所述第一緩存隊(duì)列中取出預(yù)先壓入的第三對(duì)象的第三指針,其中,所述第一標(biāo)記線程不負(fù)責(zé)對(duì)當(dāng)前處理的第三對(duì)象所在的內(nèi)存塊p2進(jìn)行標(biāo)記處理;
步驟504,所述第一標(biāo)記線程根據(jù)所述對(duì)應(yīng)關(guān)系,確定標(biāo)記線程w負(fù)責(zé)對(duì)當(dāng)前處理的第三對(duì)象所在的內(nèi)存塊p2進(jìn)行標(biāo)記處理;
步驟505,所述第一標(biāo)記線程將所述第三指針壓入到所述第一標(biāo)記線程中與所述標(biāo)記線程w對(duì)應(yīng)的公用輸出隊(duì)列w中;
具體地,第一標(biāo)記線程從本線程的第一緩存隊(duì)列中取出預(yù)先壓入的第三對(duì)象的第三指針,由于第一緩存隊(duì)列中存放的對(duì)象是需要放入第一標(biāo)記線程中的公用輸出隊(duì)列中,以供對(duì)應(yīng)的其他標(biāo)記線程進(jìn)行處理的。當(dāng)?shù)谝粯?biāo)記線程中的公用輸出隊(duì)列中出現(xiàn)溢出時(shí),將溢出的第三對(duì)象放入第一標(biāo)記線程中的第一緩存隊(duì)列中緩存。
由此可見(jiàn),第一標(biāo)記線程不負(fù)責(zé)對(duì)當(dāng)前處理的第三對(duì)象所在的內(nèi)存塊p2進(jìn)行標(biāo)記處理。第一標(biāo)記線程根據(jù)虛擬機(jī)堆的內(nèi)存塊與標(biāo)記線程的對(duì)應(yīng)關(guān)系,確定標(biāo)記線程w負(fù)責(zé)對(duì)當(dāng)前處理的第三對(duì)象所在的內(nèi)存塊p2進(jìn)行標(biāo)記處理。
進(jìn)而,第一標(biāo)記線程將該第三指針壓入到第一標(biāo)記線程中與標(biāo)記線程w對(duì)應(yīng)的公用輸出隊(duì)列w中,以供標(biāo)記線程w從第一標(biāo)記線程的公用輸出隊(duì)列w中獲取該第三指針進(jìn)行標(biāo)記處理。
步驟506,所述第一標(biāo)記線程判斷是否成功將當(dāng)前處理的第三指針壓入到所述公用輸出隊(duì)列w中;
步驟507,繼續(xù)對(duì)所述第一緩存隊(duì)列中的下一個(gè)第三對(duì)象向?qū)?yīng)的公用輸出隊(duì)列進(jìn)行壓入處理。
步驟508,將所述第三指針重新壓入所述第一緩存隊(duì)列中。
具體地,第一標(biāo)記線程判斷是否成功將當(dāng)前處理的第三指針壓入到本線程的公用輸出隊(duì)列w中。
如果第一標(biāo)記線程成功將該第三指針壓入到本線程的公用輸出隊(duì)列w中,則執(zhí)行步驟507,繼續(xù)對(duì)所第一緩存隊(duì)列中的下一個(gè)第三對(duì)象向?qū)?yīng)的公用輸出隊(duì)列進(jìn)行壓入處理。
如果第一標(biāo)記線程未能成功將該第三指針壓入到本線程的公用輸出隊(duì)列w中,則將該第三指針重新壓入本線程的第一緩存隊(duì)列中。此時(shí),不存在溢出的問(wèn)題,因?yàn)樵摰谌羔樉褪菑谋揪€程的第一緩存隊(duì)列中取出來(lái)的。
基于上述實(shí)施例,本申請(qǐng)?jiān)诘谝粯?biāo)記線程的第一私有棧為空時(shí),且第一緩存隊(duì)列不為空,從第一緩存隊(duì)列中取出預(yù)先壓入的第三對(duì)象的第三指針,向本線程中與對(duì)應(yīng)標(biāo)記線程的公用輸出隊(duì)列中進(jìn)行壓入處理,以供與第三對(duì)象對(duì)應(yīng)的標(biāo)記線程對(duì)其進(jìn)行標(biāo)記處理。由此,參照第一標(biāo)記線程的標(biāo)記處理過(guò)程,通過(guò)n個(gè)標(biāo)記線程的進(jìn)行協(xié)同并行的標(biāo)記處理,利用有限的內(nèi)存實(shí)現(xiàn)高效的并行標(biāo)記,同時(shí)實(shí)現(xiàn)標(biāo)記線程負(fù)載均衡,從而減少cpu緩存一致性沖突,提高整個(gè)垃圾回收的性能。
圖8是應(yīng)用圖4所示的標(biāo)記線程并行標(biāo)記處理的流程圖四。
參見(jiàn)圖8,基于圖7所示實(shí)施例,本實(shí)施例是基于圖7中的步驟502,針對(duì)如果第一標(biāo)記線程中的第一緩存隊(duì)列為空的判斷分支,通過(guò)圖8所示實(shí)施例描述如何進(jìn)一步地對(duì)其他(n-1)個(gè)標(biāo)記線程中與第一標(biāo)記線程對(duì)應(yīng)的公用輸出隊(duì)列中的第四對(duì)象進(jìn)行標(biāo)記處理,具體包括:
步驟601,第一標(biāo)記線程判斷其他(n-1)個(gè)標(biāo)記線程中與所述第一標(biāo)記線程對(duì)應(yīng)的公用輸出隊(duì)列是否為空;
具體地,第一標(biāo)記線程判斷其他(n-1)個(gè)標(biāo)記線程中與所述第一標(biāo)記線程對(duì)應(yīng)的公用輸出隊(duì)列是否為空;
如果其他(n-1)個(gè)標(biāo)記線程中與第一標(biāo)記線程對(duì)應(yīng)的公用輸出隊(duì)列不為空,則執(zhí)行步驟602,從而第一標(biāo)記線程從其他標(biāo)記線程中獲取本線程負(fù)責(zé)處理的第四對(duì)象,向本線程的第一私有棧進(jìn)行壓入處理。
如果其他(n-1)個(gè)標(biāo)記線程中與第一標(biāo)記線程對(duì)應(yīng)的公用輸出隊(duì)列為空,則通過(guò)圖9所示實(shí)施例描述如何進(jìn)一步地對(duì)第一標(biāo)記線程負(fù)責(zé)標(biāo)記的、且具有溢出狀態(tài)的第五對(duì)象進(jìn)行標(biāo)記處理,后續(xù)實(shí)施例詳細(xì)說(shuō)明。
步驟602,第一標(biāo)記線程從當(dāng)前處理的公用輸出隊(duì)列中取出預(yù)先壓入的第四對(duì)象的第四指針,其中,所述第四對(duì)象為所述標(biāo)記線程t預(yù)先壓入的、由所述第一標(biāo)記線程負(fù)責(zé)對(duì)所述第四對(duì)象所在的內(nèi)存塊p3進(jìn)行標(biāo)記處理;
步驟603,所述第一標(biāo)記線程將所述第四指針壓入到所述第一私有棧中;
具體地,針對(duì)步驟601中如果其他(n-1)個(gè)標(biāo)記線程中與第一標(biāo)記線程對(duì)應(yīng)的公用輸出隊(duì)列不為空的判斷分支,說(shuō)明其他的標(biāo)記線程中還具有需要由第一標(biāo)記線程標(biāo)記處理的第四對(duì)象。
進(jìn)而,第一標(biāo)記線程從當(dāng)前處理的公用輸出隊(duì)列中取出預(yù)先壓入的第四對(duì)象的第四指針,其中,該第四對(duì)象為標(biāo)記線程t預(yù)先壓入的、并且由第一標(biāo)記線程負(fù)責(zé)對(duì)該第四對(duì)象所在的內(nèi)存塊p3進(jìn)行標(biāo)記處理。從而第一標(biāo)記線程將該第四指針壓入到所述第一私有棧中。
步驟604,所述第一標(biāo)記線程判斷是否成功將所述第四指針壓入到所述第一私有棧中;
步驟605,將所述內(nèi)存塊p3的位圖中、與該第四對(duì)象對(duì)應(yīng)的狀態(tài)標(biāo)記為溢出狀態(tài)。
步驟606,設(shè)置與所述內(nèi)存塊p3對(duì)應(yīng)的溢出標(biāo)志。
步驟607,繼續(xù)對(duì)下一個(gè)第四對(duì)象向所述第一私有棧中進(jìn)行壓入處理。
具體地,第一標(biāo)記線程判斷是否成功將該第四指針壓入到本線程的第一私有棧中。
如果第一標(biāo)記線程未能成功將該第四指針壓入到本線程的第一私有棧中,則執(zhí)行步驟605和步驟606,將該第四對(duì)象所在的內(nèi)存塊p3的位圖中、與該第四對(duì)象對(duì)應(yīng)的狀態(tài)標(biāo)記為溢出狀態(tài),并且設(shè)置與所述內(nèi)存塊p3對(duì)應(yīng)的溢出標(biāo)志。
如果第一標(biāo)記線程成功將該第四指針壓入到本線程的第一私有棧中,則則執(zhí)行步驟607,繼續(xù)對(duì)下一個(gè)第四對(duì)象向本線程的第一私有棧中進(jìn)行壓入處理。
基于上述實(shí)施例,本申請(qǐng)的第一標(biāo)記線程在第一私有棧和第一緩存隊(duì)列為空,且其他標(biāo)記線程中與第一標(biāo)記線程對(duì)應(yīng)的公用輸出隊(duì)列不為空時(shí),取出預(yù)先壓入的第四對(duì)象的第 四指針,向本線程中的第一私有棧壓入處理。由此,參照第一標(biāo)記線程的標(biāo)記處理過(guò)程,通過(guò)n個(gè)標(biāo)記線程的進(jìn)行協(xié)同并行的標(biāo)記處理,利用有限的內(nèi)存實(shí)現(xiàn)高效的并行標(biāo)記,同時(shí)實(shí)現(xiàn)標(biāo)記線程負(fù)載均衡,從而減少cpu緩存一致性沖突,提高整個(gè)垃圾回收的性能。
圖9是應(yīng)用圖4所示的標(biāo)記線程并行標(biāo)記處理的流程圖五。
參見(jiàn)圖9,基于圖8所示實(shí)施例,本實(shí)施例是基于圖9中的步驟601,針對(duì)如果其他(n-1)個(gè)標(biāo)記線程中與第一標(biāo)記線程對(duì)應(yīng)的公用輸出隊(duì)列為空的判斷分支,則通過(guò)圖9所示實(shí)施例描述如何進(jìn)一步地對(duì)第一標(biāo)記線程負(fù)責(zé)標(biāo)記的、且具有溢出狀態(tài)的第五對(duì)象進(jìn)行標(biāo)記處理,具體包括:
步驟701,第一標(biāo)記線程判斷本線程負(fù)責(zé)標(biāo)記的內(nèi)存塊中是否有溢出狀態(tài)的第五對(duì)象;
步驟702,如果所述第一標(biāo)記線程負(fù)責(zé)標(biāo)記的內(nèi)存塊中不具有溢出狀態(tài)的第五對(duì)象,則標(biāo)記結(jié)束,退出線程。
步驟703,如果所述第一標(biāo)記線程負(fù)責(zé)標(biāo)記的內(nèi)存塊中具有溢出狀態(tài)的第五對(duì)象,所述第一標(biāo)記線程將當(dāng)前處理的內(nèi)存塊p4中標(biāo)記溢出狀態(tài)的第五對(duì)象修改為壓入狀態(tài),將當(dāng)前第五對(duì)象的第五指針壓入到所述第一私有棧中;
具體地,第一標(biāo)記線程判斷本線程負(fù)責(zé)標(biāo)記的內(nèi)存塊中是否有溢出狀態(tài)的第五對(duì)象。
如果第一標(biāo)記線程負(fù)責(zé)標(biāo)記的內(nèi)存塊中不具有溢出狀態(tài)的第五對(duì)象,則說(shuō)明本線程負(fù)責(zé)標(biāo)記的對(duì)象遍歷完成,標(biāo)記結(jié)束,執(zhí)行步驟702退出線程。
如果第一標(biāo)記線程負(fù)責(zé)標(biāo)記的內(nèi)存塊中具有溢出狀態(tài)的第五對(duì)象,則說(shuō)明本線程負(fù)責(zé)標(biāo)記的對(duì)象還沒(méi)有遍歷完成。進(jìn)而,第一標(biāo)記線程執(zhí)行步驟703,將當(dāng)前處理的內(nèi)存塊p4中標(biāo)記溢出狀態(tài)的第五對(duì)象修改為壓入狀態(tài),將當(dāng)前第五對(duì)象的第五指針壓入到所述第一私有棧中。
步驟704,所述第一標(biāo)記線程判斷是否成功將所述第五指針壓入到所述第一私有棧中;
步驟705,如果所述第一標(biāo)記線程未能成功將所述第五指針壓入到所述第一私有棧中,則將所述內(nèi)存塊p4的位圖中、與該第五對(duì)象對(duì)應(yīng)的狀態(tài)標(biāo)記為溢出狀態(tài)。
步驟706,設(shè)置與所述內(nèi)存塊p5對(duì)應(yīng)的溢出標(biāo)志。
步驟707,如果所述第一標(biāo)記線程成功將所述第五指針壓入到所述第一私有棧中,則繼續(xù)對(duì)下一個(gè)第五對(duì)象進(jìn)行處理。
具體地,第一標(biāo)記線程判斷是否成功將當(dāng)前的第五指針壓入到本線程的第一私有棧中。
如果第一標(biāo)記線程未能成功將該第五指針壓入到本線程的第一私有棧中,則說(shuō)明第一私有??臻g不足有溢出,則執(zhí)行步驟705和步驟706,將該第五對(duì)象所在的內(nèi)存塊p4的位圖中、與該第五對(duì)象對(duì)應(yīng)的狀態(tài)標(biāo)記為溢出狀態(tài),并且進(jìn)一步地設(shè)置與所述內(nèi)存塊p5對(duì)應(yīng) 的溢出標(biāo)志。
如果第一標(biāo)記線程成功將該第五指針壓入到本線程的第一私有棧中,則執(zhí)行步驟707,繼續(xù)對(duì)下一個(gè)第五對(duì)象進(jìn)行處理。
基于上述實(shí)施例,本申請(qǐng)的第一標(biāo)記線程在第一私有棧、第一緩存隊(duì)列、以及其他標(biāo)記線程中與第一標(biāo)記線程對(duì)應(yīng)的公用輸出隊(duì)列都為空時(shí),根據(jù)本線程負(fù)責(zé)標(biāo)記的具有溢出狀態(tài)的第五對(duì)象進(jìn)行壓入處理。由此,參照第一標(biāo)記線程的標(biāo)記處理過(guò)程,通過(guò)n個(gè)標(biāo)記線程的并行的標(biāo)記處理,利用有限的內(nèi)存實(shí)現(xiàn)高效的并行標(biāo)記,提高整個(gè)垃圾回收的性能。
為了更加清楚的說(shuō)明圖4-圖9所示實(shí)施例中涉及的對(duì)第二對(duì)象至第五對(duì)象進(jìn)行處理的處理過(guò)程,通過(guò)圖10所示實(shí)施例說(shuō)明如下。
圖10是應(yīng)用圖4所示的標(biāo)記線程并行標(biāo)記處理的流程圖六。
參見(jiàn)圖10,本實(shí)施例中采用在內(nèi)存塊位圖中進(jìn)行著色標(biāo)記的方式對(duì)第二對(duì)象至第五對(duì)象的壓入情況進(jìn)行標(biāo)記處理,具體標(biāo)記如下:
如果將當(dāng)前處理的對(duì)象的指針成功壓入對(duì)應(yīng)的目標(biāo)空間中,則將與當(dāng)前對(duì)象所在內(nèi)存塊位圖中的對(duì)應(yīng)位置進(jìn)行標(biāo)黑處理;
如果沒(méi)有將當(dāng)前處理的對(duì)象的指針成功壓入對(duì)應(yīng)的目標(biāo)空間中,則將與當(dāng)前對(duì)象所在內(nèi)存塊位圖中的對(duì)應(yīng)位置進(jìn)行標(biāo)灰處理;
如果當(dāng)前處理對(duì)象所在內(nèi)存塊位圖中的對(duì)應(yīng)位置為標(biāo)白狀態(tài),說(shuō)明該對(duì)象為未處理狀態(tài)。
需要說(shuō)明的是,以上根據(jù)處理對(duì)象的指針向?qū)?yīng)目標(biāo)空間的不同壓入情況,在內(nèi)存塊位圖中與當(dāng)前處理對(duì)象的對(duì)應(yīng)位置進(jìn)行的著色處理僅僅是示例性說(shuō)明,可以根據(jù)具體的應(yīng)用需要進(jìn)行調(diào)整。
基于上述標(biāo)記方式,具體以對(duì)象a等同于上述實(shí)施例中涉及的第一對(duì)象,對(duì)象a1等同于上述實(shí)施例中涉及的第二對(duì)象,對(duì)象b等同于上述實(shí)施例中涉及的第三對(duì)象,對(duì)象d等同于上述實(shí)施例中涉及的第四對(duì)象,對(duì)象c等同于上述實(shí)施例中涉及的第五對(duì)象,舉例說(shuō)明如下:
如圖10所示,該并行標(biāo)記處理方法包括:
步驟1:線程啟動(dòng)。
步驟2:如果私有stack已經(jīng)空了,則跳轉(zhuǎn)到步驟3。否則彈出一個(gè)對(duì)象比如a,跳轉(zhuǎn)到步驟4。
步驟3:如果buf-queue為空,跳轉(zhuǎn)到步驟7,否則遍歷buf-queue,彈出對(duì)象比如b,跳轉(zhuǎn)到步驟5。如果已經(jīng)遍歷完成,則跳轉(zhuǎn)到步驟7。
步驟4:依次遍歷對(duì)象a所引用的所有對(duì)象,遍歷完成則跳轉(zhuǎn)到步驟2。否則,比如遍歷到對(duì)象a1,并跳轉(zhuǎn)到步驟9。
步驟5:嘗試把步驟3中彈出來(lái)的對(duì)象b壓入本線中t(b)號(hào)queue中,壓入成功則跳轉(zhuǎn)到步驟3,反之標(biāo)記對(duì)象b所在的page(內(nèi)存塊)溢出,然后跳轉(zhuǎn)到步驟6。
步驟6:對(duì)象b重新壓回到buf-queue中,這時(shí)候不會(huì)失敗,因?yàn)閷?duì)象b是從buf-queue中彈出來(lái)的。
步驟7:遍歷另外n-1個(gè)線程中的本線程對(duì)應(yīng)的queue,取出標(biāo)記對(duì)象。只要有一個(gè)queue非空,則pop出(彈出)標(biāo)記對(duì)象,比如對(duì)象d,然后跳轉(zhuǎn)到步驟16。如果所有n-1個(gè)線程中和本線程對(duì)應(yīng)的queue都為空,則跳轉(zhuǎn)到步驟8。
步驟8:遍歷本線程負(fù)責(zé)的page時(shí)如發(fā)現(xiàn)有溢出,則遍歷有溢出的page的bitmap(位圖),找到灰色的對(duì)象比如c,如果找到則跳轉(zhuǎn)到步驟14。遍歷完畢,清理page的溢出標(biāo)志,然后跳轉(zhuǎn)到步驟15。
步驟9:判斷步驟4中遍歷到的對(duì)象a1所在的page的對(duì)應(yīng)的bitmap是否為白色,如果已經(jīng)是黑色則跳轉(zhuǎn)到步驟4。如果是白色,則跳轉(zhuǎn)到步驟10。
步驟10:標(biāo)記對(duì)象a1所在的page的對(duì)應(yīng)的bitmap值為黑色。如果t(a1)為本線程,則跳轉(zhuǎn)到步驟17。否則跳轉(zhuǎn)到步驟11。
步驟11:嘗試把對(duì)象a1壓入本線程的t(a1)號(hào)queue中,如果壓入失敗,則設(shè)置a1所在的page的溢出。并跳轉(zhuǎn)到步驟12,如果成功,則跳轉(zhuǎn)到步驟4。
步驟12:嘗試把對(duì)象a1壓入buf-queue,如果成功則跳轉(zhuǎn)到步驟4。反之跳轉(zhuǎn)到步驟13。
步驟13:設(shè)置對(duì)象a1所在的page對(duì)應(yīng)的bitmap的值為灰色,并設(shè)置page的溢出標(biāo)志。
步驟14:把步驟8遍歷到的灰色對(duì)象c標(biāo)記對(duì)應(yīng)的bitmap為黑色并壓入私有棧stack中,如果成功則跳轉(zhuǎn)到步驟8。如果失敗,則設(shè)置c所在的page的溢出標(biāo)志,并跳轉(zhuǎn)到步驟19。
步驟15:如果標(biāo)記結(jié)束,則線程退出,否則跳轉(zhuǎn)到步驟2,繼續(xù)并行標(biāo)記。
步驟16:標(biāo)記對(duì)象d對(duì)應(yīng)的bitmap為黑色,嘗試把對(duì)象d壓入本線程的stack中,如壓入成功,跳轉(zhuǎn)到步驟7。溢出跳轉(zhuǎn)到步驟19。
步驟17:嘗試把對(duì)象a1壓入本線程的私有stack中,如果壓入成功即沒(méi)有溢出,則跳轉(zhuǎn)到步驟4,否則跳轉(zhuǎn)到步驟18。
步驟18:標(biāo)記對(duì)象a1對(duì)應(yīng)的bitmap為灰色,并設(shè)置a1所在的page的溢出標(biāo)志。 然后跳轉(zhuǎn)到步驟4。
步驟19:標(biāo)記對(duì)象(d或者c,即可能來(lái)自步驟14或者16)對(duì)應(yīng)的bitmap為灰色,并設(shè)置標(biāo)記對(duì)象所在的page的溢出標(biāo)志。然后跳轉(zhuǎn)到步驟2。
具體地,結(jié)合本示例中的19個(gè)步驟和附圖,具體通過(guò)下述的處理步驟示意圖6至圖9的處理過(guò)程,其詳細(xì)的描述過(guò)程參見(jiàn)圖6至圖9所示實(shí)施例,此處不再贅述。
針對(duì)圖6所示實(shí)施例的處理過(guò)程如下示意的步驟流程(1),其具體實(shí)施過(guò)程參見(jiàn)上述實(shí)施例,此處不再贅述。
步驟流程(1):
針對(duì)圖7所示實(shí)施例的處理過(guò)程如下示意的步驟流程(2),其具體實(shí)施過(guò)程參見(jiàn)上述實(shí)施例,此處不再贅述。
步驟流程(2):
針對(duì)圖8所示實(shí)施例的處理過(guò)程如下示意的步驟流程(3),其具體實(shí)施過(guò)程參見(jiàn)上述實(shí)施例,此處不再贅述。
步驟流程(3):
針對(duì)圖9所示實(shí)施例的處理過(guò)程如下示意的步驟流程(4),其具體實(shí)施過(guò)程參見(jiàn)上述 實(shí)施例,此處不再贅述。
步驟流程(4):
為了實(shí)現(xiàn)上述實(shí)施例,本申請(qǐng)還提出一種用于垃圾回收的并行標(biāo)記處理裝置。
圖11是本申請(qǐng)一個(gè)實(shí)施例的用于垃圾回收的并行標(biāo)記處理裝置的結(jié)構(gòu)示意圖。
參見(jiàn)圖11,該用于垃圾回收的并行標(biāo)記處理裝置包括:
遍歷模塊11,用于根據(jù)虛擬機(jī)堆中的內(nèi)存塊與n個(gè)標(biāo)記線程的對(duì)應(yīng)關(guān)系,遍歷所述虛擬機(jī)堆中的第一對(duì)象,其中,n為大于1的整數(shù),n個(gè)標(biāo)記線程占用的內(nèi)存容量是預(yù)先設(shè)置的,每個(gè)標(biāo)記線程至少包括:1個(gè)私有棧;
第一標(biāo)記模塊12,用于將當(dāng)前處理的第一對(duì)象的第一指針壓入與該第一對(duì)象所在的內(nèi)存塊對(duì)應(yīng)的標(biāo)記線程的私有棧,根據(jù)所述第一指針的壓入情況對(duì)所述第一對(duì)象進(jìn)行第一標(biāo)記處理;
啟動(dòng)模塊13,用于對(duì)所述第一對(duì)象遍歷完成后,向所述n個(gè)標(biāo)記線程發(fā)送線程啟動(dòng)指令,以使所述n個(gè)標(biāo)記線程根據(jù)各自私有棧中所述第一指針的壓入情況,同步進(jìn)行用于垃圾回收的標(biāo)記處理。
需要說(shuō)明的是,前述對(duì)用于垃圾回收的并行標(biāo)記處理方法實(shí)施例的解釋說(shuō)明也適用于該實(shí)施例的用于垃圾回收的并行標(biāo)記處理裝置,此處不再贅述。
本實(shí)施例提供的用于垃圾回收的并行標(biāo)記處理裝置,通過(guò)根據(jù)虛擬機(jī)堆中的內(nèi)存塊與n個(gè)標(biāo)記線程的對(duì)應(yīng)關(guān)系,遍歷所述虛擬機(jī)堆中的第一對(duì)象,其中,n個(gè)標(biāo)記線程占用的內(nèi)存容量是預(yù)先設(shè)置的,將當(dāng)前處理的第一對(duì)象的第一指針壓入與該第一對(duì)象所在的內(nèi)存塊對(duì)應(yīng)的標(biāo)記線程的私有棧,根據(jù)所述第一指針的壓入情況對(duì)所述第一對(duì)象進(jìn)行第一標(biāo)記處理,對(duì)所述第一對(duì)象遍歷完成后,向所述n個(gè)標(biāo)記線程發(fā)送線程啟動(dòng)指令,以使所述n個(gè)標(biāo)記線程根據(jù)各自私有棧中所述第一指針的壓入情況,同步進(jìn)行用于垃圾回收的標(biāo)記處理。由此,利用有限的內(nèi)存實(shí)現(xiàn)多線程的并行標(biāo)記處理,提高整個(gè)垃圾回收的性能。
圖12是本申請(qǐng)另一個(gè)實(shí)施例的用于垃圾回收的并行標(biāo)記處理裝置的結(jié)構(gòu)示意圖。
參見(jiàn)圖12,基于圖11,該用于垃圾回收的并行標(biāo)記處理裝置還包括:
申請(qǐng)模塊14,用于申請(qǐng)所述n個(gè)標(biāo)記線程;
建立模塊15,用于遍歷所述虛擬機(jī)堆中的內(nèi)存塊,建立內(nèi)存塊與n個(gè)標(biāo)記線程的對(duì)應(yīng)關(guān)系。
具體地,所述建立模塊15用于:
為每個(gè)內(nèi)存塊指定對(duì)應(yīng)的標(biāo)記線程;或者,
為每個(gè)標(biāo)記線程指定負(fù)責(zé)標(biāo)記的內(nèi)存塊。
其中,在一個(gè)具體的示例中,所述建立模塊15包括:
分配單元151,用于遍歷虛擬機(jī)堆中的內(nèi)存塊,為每個(gè)內(nèi)存塊分配編號(hào);
確定單元152,用于根據(jù)內(nèi)存塊的編號(hào)和標(biāo)記線程總數(shù)n,確定與每個(gè)內(nèi)存塊編號(hào)對(duì)應(yīng)的標(biāo)記線程編號(hào)。
具體地,所述確定單元152用于:
獲取標(biāo)記線程總數(shù)n被內(nèi)存塊編號(hào)整除后的余數(shù),確定與每個(gè)內(nèi)存塊編號(hào)對(duì)應(yīng)的標(biāo)記線程編號(hào)。
具體地,所述第一標(biāo)記模塊12用于:
如果將所述第一指針成功壓入與當(dāng)前第一對(duì)象所在的內(nèi)存塊對(duì)應(yīng)的標(biāo)記線程的私有棧,則將當(dāng)前第一對(duì)象所在內(nèi)存塊的位圖中、與該第一對(duì)象對(duì)應(yīng)的狀態(tài)標(biāo)記為壓入狀態(tài);
如果未能將所述第一指針成功壓入與當(dāng)前第一對(duì)象所在的內(nèi)存塊對(duì)應(yīng)的標(biāo)記線程的私有棧,則將當(dāng)前第一對(duì)象所在內(nèi)存塊的位圖中、與該第一對(duì)象對(duì)應(yīng)的狀態(tài)標(biāo)記為溢出狀態(tài)。
需要說(shuō)明的是,前述對(duì)用于垃圾回收的并行標(biāo)記處理方法實(shí)施例的解釋說(shuō)明也適用于該實(shí)施例的用于垃圾回收的并行標(biāo)記處理裝置,此處不再贅述。
本實(shí)施例提供的用于垃圾回收的并行標(biāo)記處理裝置,通過(guò)申請(qǐng)n個(gè)標(biāo)記線程,遍歷虛擬機(jī)堆的所有內(nèi)存塊,為每個(gè)內(nèi)存塊分配編號(hào);根據(jù)內(nèi)存塊編號(hào)和標(biāo)記線程總數(shù)n,確定與每個(gè)內(nèi)存塊編號(hào)對(duì)應(yīng)的標(biāo)記線程編號(hào),進(jìn)而將當(dāng)前處理的第一對(duì)象的第一指針壓入與該第一對(duì)象所在的內(nèi)存塊對(duì)應(yīng)的標(biāo)記線程的私有棧,根據(jù)所述第一指針的壓入情況對(duì)所述第一對(duì)象進(jìn)行第一標(biāo)記處理,對(duì)所述第一對(duì)象遍歷完成后,向所述n個(gè)標(biāo)記線程發(fā)送線程啟動(dòng)指令,以使所述n個(gè)標(biāo)記線程根據(jù)各自私有棧中所述第一指針的壓入情況,同步進(jìn)行用于垃圾回收的標(biāo)記處理。由此,利用有限的內(nèi)存實(shí)現(xiàn)高效的并行標(biāo)記,同時(shí)實(shí)現(xiàn)標(biāo)記線程負(fù)載均衡,提高整個(gè)垃圾回收的性能。
圖13是本申請(qǐng)另一個(gè)實(shí)施例的用于垃圾回收的并行標(biāo)記處理裝置的結(jié)構(gòu)示意圖。
參見(jiàn)圖13,本實(shí)施例中預(yù)先申請(qǐng)的n個(gè)標(biāo)記線程,以及n個(gè)標(biāo)記線程所占用的內(nèi)存容量。n個(gè)標(biāo)記線程包括:thread-1、thread-2,…thread-n。其中,每個(gè)標(biāo)記線程至少包 括:1個(gè)私有棧(stack),經(jīng)過(guò)上述處理,各個(gè)私有棧中存儲(chǔ)有本線程負(fù)責(zé)標(biāo)記的第一對(duì)象(rootobjects)的第一指針。本實(shí)施例中用于垃圾回收的并行標(biāo)記處理裝置包括:
獲取模塊21,用于根據(jù)線程啟動(dòng)指令,從第一私有棧中取出預(yù)先壓入的第一對(duì)象的第一指針;
第二標(biāo)記模塊22,用于遍歷所述第一指針指示的所述第一對(duì)象引用的第二對(duì)象,并根據(jù)預(yù)設(shè)的n個(gè)標(biāo)記線程與虛擬機(jī)堆中內(nèi)存塊的對(duì)應(yīng)關(guān)系對(duì)所述第二對(duì)象進(jìn)行第二標(biāo)記處理。
需要說(shuō)明的是,前述對(duì)用于垃圾回收的并行標(biāo)記處理方法實(shí)施例的解釋說(shuō)明也適用于該實(shí)施例的用于垃圾回收的并行標(biāo)記處理裝置,此處不再贅述。
本實(shí)施例提供的用于垃圾回收的并行標(biāo)記處理裝置,通過(guò)第一標(biāo)記線程根據(jù)線程啟動(dòng)指令,從第一私有棧中取出預(yù)先壓入的第一對(duì)象的第一指針,遍歷所述第一指針指示的所述第一對(duì)象引用的第二對(duì)象,并根據(jù)預(yù)設(shè)的n個(gè)標(biāo)記線程與虛擬機(jī)堆中內(nèi)存塊的對(duì)應(yīng)關(guān)系對(duì)所述第二對(duì)象進(jìn)行第二標(biāo)記處理。由此,參照第一標(biāo)記線程的標(biāo)記處理過(guò)程,通過(guò)n個(gè)標(biāo)記線程的并行標(biāo)記處理,實(shí)現(xiàn)了利用有限的內(nèi)存進(jìn)行并行標(biāo)記處理,提高整個(gè)垃圾回收的性能。
圖14是本申請(qǐng)另一個(gè)實(shí)施例的用于垃圾回收的并行標(biāo)記處理裝置的結(jié)構(gòu)示意圖。
參見(jiàn)圖14,基于圖13所示實(shí)施例,所述第二標(biāo)記模塊22包括:
第一判斷單元221,用于根據(jù)所述對(duì)應(yīng)關(guān)系,判斷是否負(fù)責(zé)對(duì)當(dāng)前處理的第二對(duì)象所在的內(nèi)存塊p1進(jìn)行標(biāo)記處理;
第一處理單元222,用于如果所述第一標(biāo)記線程負(fù)責(zé)對(duì)所述內(nèi)存塊p1進(jìn)行標(biāo)記處理,則將當(dāng)前處理的第二對(duì)象的第二指針壓入到所述第一私有棧中;
第二判斷單元223,用于判斷是否成功將所述第二指針壓入到所述第一私有棧中;
第二處理單元224,用于如果所述第一標(biāo)記線程未能成功將所述第二指針壓入到所述第一私有棧中,則將所述內(nèi)存塊p1的位圖中、與該第二對(duì)象對(duì)應(yīng)的狀態(tài)標(biāo)記為溢出狀態(tài)。
進(jìn)一步地,所述第二處理單元224還用于:
設(shè)置與所述內(nèi)存塊p1對(duì)應(yīng)的溢出標(biāo)志。
進(jìn)一步地,在另一個(gè)實(shí)施例中,
所述第二處理單元224還用于:如果所述第一標(biāo)記線程成功將所述第二指針壓入到所述第一私有棧中,則繼續(xù)對(duì)所述第一指針對(duì)應(yīng)的下一個(gè)第二對(duì)象進(jìn)行處理。
進(jìn)一步地,在另一個(gè)實(shí)施例中,所述第二標(biāo)記模塊22還包括:
所述第一處理單元222,還用于如果所述第一標(biāo)記線程不負(fù)責(zé)對(duì)所述內(nèi)存塊p1進(jìn)行標(biāo) 記處理,確定標(biāo)記線程m負(fù)責(zé)對(duì)所述內(nèi)存塊p1進(jìn)行標(biāo)記處理,將所述第二指針壓入到所述第一標(biāo)記線程中與所述標(biāo)記線程m對(duì)應(yīng)的公用輸出隊(duì)列m中;
第三判斷單元225,用于判斷是否成功將所述第二指針壓入到所述公用輸出隊(duì)列m中;
第三處理單元226,用于如果所述第一標(biāo)記線程成功將所述第二指針壓入到所述公用輸出隊(duì)列m中,則繼續(xù)對(duì)所述第一指針對(duì)應(yīng)的下一個(gè)第二對(duì)象進(jìn)行處理。
進(jìn)一步地,在另一個(gè)實(shí)施例中,所述第二標(biāo)記模塊22還包括:
所述第三處理單元226,還用于如果所述第一標(biāo)記線程未能成功將所述第二指針壓入到所述公用輸出隊(duì)列m中,則把所述第二指針壓入到所述第一標(biāo)記線程中的第一緩存隊(duì)列中;
第四判斷單元227,用于判斷是否成功將所述第二指針壓入到所述第一緩存隊(duì)列中;
第四處理單元228,用于如果所述第一標(biāo)記線程未能成功將所述第二指針壓入到所述第一緩存隊(duì)列中,則將所述內(nèi)存塊p1的位圖中、與當(dāng)前處理的第二對(duì)象對(duì)應(yīng)的狀態(tài)標(biāo)記為溢出狀態(tài)。
進(jìn)一步地,在另一個(gè)實(shí)施例中,
所述第四處理單元228還用于:
設(shè)置與所述內(nèi)存塊p1對(duì)應(yīng)的溢出標(biāo)志。
進(jìn)一步地,在另一個(gè)實(shí)施例中,
所述第四處理單元228,還用于如果所述第一標(biāo)記線程成功將所述第二指針壓入到所述第一緩存隊(duì)列中,則繼續(xù)對(duì)所述第一指針對(duì)應(yīng)的下一個(gè)第二對(duì)象進(jìn)行處理。
進(jìn)一步地,在另一個(gè)實(shí)施例中,
所述第二處理單元224,還用于查詢所述內(nèi)存塊p1的位圖中與該第二對(duì)象對(duì)應(yīng)的狀態(tài)標(biāo)記;如果與該第二對(duì)象對(duì)應(yīng)的狀態(tài)標(biāo)記為未標(biāo)記狀態(tài),則將與該第二對(duì)象對(duì)應(yīng)的狀態(tài)修改為壓入狀態(tài)。
需要說(shuō)明的是,前述對(duì)用于垃圾回收的并行標(biāo)記處理方法實(shí)施例的解釋說(shuō)明也適用于該實(shí)施例的用于垃圾回收的并行標(biāo)記處理裝置,此處不再贅述。
本實(shí)施例提供的用于垃圾回收的并行標(biāo)記處理裝置,通過(guò)第一標(biāo)記線程根據(jù)線程啟動(dòng)指令,從第一私有棧中取出預(yù)先壓入的第一對(duì)象的第一指針,遍歷所述第一指針指示的所述第一對(duì)象引用的第二對(duì)象,并根據(jù)預(yù)設(shè)的n個(gè)標(biāo)記線程與虛擬機(jī)堆中內(nèi)存塊的對(duì)應(yīng)關(guān)系對(duì)所述第二對(duì)象進(jìn)行第二標(biāo)記處理。由此,參照第一標(biāo)記線程的標(biāo)記處理過(guò)程,通過(guò)n個(gè)標(biāo)記線程的并行標(biāo)記處理,利用有限的內(nèi)存實(shí)現(xiàn)高效的并行標(biāo)記,同時(shí)實(shí)現(xiàn)標(biāo)記線程負(fù)載均衡,從而減少cpu緩存一致性沖突,提高整個(gè)垃圾回收的性能。
圖15是本申請(qǐng)另一個(gè)實(shí)施例的用于垃圾回收的并行標(biāo)記處理裝置的結(jié)構(gòu)示意圖。
參見(jiàn)圖15,基于圖13所示實(shí)施例,本實(shí)施例中預(yù)設(shè)的n個(gè)標(biāo)記線程中每個(gè)標(biāo)記線程還包括:1個(gè)緩存隊(duì)列,以及與其他(n-1)個(gè)標(biāo)記線程對(duì)應(yīng)的(n-1)個(gè)公用輸出隊(duì)列;所述第二標(biāo)記模塊22還包括:
第五判斷單元229,用于判斷所述第一私有棧是否為空;
第六判斷單元210,用于如果所述第一私有棧為空,判斷第一標(biāo)記線程的第一緩存隊(duì)列是否為空;
第五處理單元211,用于如果所述第一緩存隊(duì)列不為空,所述第一標(biāo)記線程從所述第一緩存隊(duì)列中取出預(yù)先壓入的第三對(duì)象的第三指針,其中,所述第一標(biāo)記線程不負(fù)責(zé)對(duì)當(dāng)前處理的第三對(duì)象所在的內(nèi)存塊p2進(jìn)行標(biāo)記處理;根據(jù)所述對(duì)應(yīng)關(guān)系,確定標(biāo)記線程w負(fù)責(zé)對(duì)當(dāng)前處理的第三對(duì)象所在的內(nèi)存塊p2進(jìn)行標(biāo)記處理;將所述第三指針壓入到所述第一標(biāo)記線程中與所述標(biāo)記線程w對(duì)應(yīng)的公用輸出隊(duì)列w中;
第七判斷單元212,用于判斷是否成功將當(dāng)前處理的第三指針壓入到所述公用輸出隊(duì)列w中;
第六處理單元213,用于如果所述第一標(biāo)記線程成功將所述第三指針壓入到所述公用輸出隊(duì)列w中,則繼續(xù)對(duì)所述第一緩存隊(duì)列中的下一個(gè)第三對(duì)象向?qū)?yīng)的公用輸出隊(duì)列進(jìn)行壓入處理。
進(jìn)一步地,在另一個(gè)實(shí)施例中,
所述第六處理單元213,還用于如果所述第一標(biāo)記線程未能成功將所述第三指針壓入到所述公用輸出隊(duì)列w中,則將所述第三指針重新壓入所述第一緩存隊(duì)列中。
需要說(shuō)明的是,前述對(duì)用于垃圾回收的并行標(biāo)記處理方法實(shí)施例的解釋說(shuō)明也適用于該實(shí)施例的用于垃圾回收的并行標(biāo)記處理裝置,此處不再贅述。
本實(shí)施例提供的用于垃圾回收的并行標(biāo)記處理裝置,在第一標(biāo)記線程的第一私有棧為空時(shí),且第一緩存隊(duì)列不為空,從第一緩存隊(duì)列中取出預(yù)先壓入的第三對(duì)象的第三指針,向本線程中與對(duì)應(yīng)標(biāo)記線程的公用輸出隊(duì)列中進(jìn)行壓入處理,以供與第三對(duì)象對(duì)應(yīng)的標(biāo)記線程對(duì)其進(jìn)行標(biāo)記處理。由此,參照第一標(biāo)記線程的標(biāo)記處理過(guò)程,通過(guò)n個(gè)標(biāo)記線程的進(jìn)行協(xié)同并行的標(biāo)記處理,利用有限的內(nèi)存實(shí)現(xiàn)高效的并行標(biāo)記,同時(shí)實(shí)現(xiàn)標(biāo)記線程負(fù)載均衡,從而減少cpu緩存一致性沖突,提高整個(gè)垃圾回收的性能。
圖16是本申請(qǐng)另一個(gè)實(shí)施例的用于垃圾回收的并行標(biāo)記處理裝置的結(jié)構(gòu)示意圖。
參見(jiàn)圖16,基于圖15所示實(shí)施例,所述第二標(biāo)記模塊22還包括:
第八判斷單元214,用于如果所述第一緩存隊(duì)列為空,判斷其他(n-1)個(gè)標(biāo)記線程中 與所述第一標(biāo)記線程對(duì)應(yīng)的公用輸出隊(duì)列是否為空;
第七處理單元215,用于如果當(dāng)前處理的標(biāo)記線程t中與所述第一標(biāo)記線程對(duì)應(yīng)的公用輸出隊(duì)列不為空,所述第一標(biāo)記線程從當(dāng)前處理的公用輸出隊(duì)列中取出預(yù)先壓入的第四對(duì)象的第四指針,其中,所述第四對(duì)象為所述標(biāo)記線程t預(yù)先壓入的、由所述第一標(biāo)記線程負(fù)責(zé)對(duì)所述第四對(duì)象所在的內(nèi)存塊p3進(jìn)行標(biāo)記處理;將所述第四指針壓入到所述第一私有棧中;
第九判斷單元216,用于判斷是否成功將所述第四指針壓入到所述第一私有棧中;
第八處理單元217,用于如果所述第一標(biāo)記線程未能成功將所述第四指針壓入到所述第一私有棧中,則將所述內(nèi)存塊p3的位圖中、與該第四對(duì)象對(duì)應(yīng)的狀態(tài)標(biāo)記為溢出狀態(tài)。
進(jìn)一步地,在另一個(gè)實(shí)施例中,
所述第八處理單元217,還用于設(shè)置與所述內(nèi)存塊p3對(duì)應(yīng)的溢出標(biāo)志。
進(jìn)一步地,在另一個(gè)實(shí)施例中,
所述第八處理單元217,還用于如果所述第一標(biāo)記線程成功將所述第四指針壓入到所述第一私有棧中,則繼續(xù)對(duì)下一個(gè)第四對(duì)象向所述第一私有棧中進(jìn)行壓入處理。
需要說(shuō)明的是,前述對(duì)用于垃圾回收的并行標(biāo)記處理方法實(shí)施例的解釋說(shuō)明也適用于該實(shí)施例的用于垃圾回收的并行標(biāo)記處理裝置,此處不再贅述。
本實(shí)施例提供的用于垃圾回收的并行標(biāo)記處理裝置,第一標(biāo)記線程在第一私有棧和第一緩存隊(duì)列為空,且其他標(biāo)記線程中與第一標(biāo)記線程對(duì)應(yīng)的公用輸出隊(duì)列不為空時(shí),取出預(yù)先壓入的第四對(duì)象的第四指針,向本線程中的第一私有棧壓入處理。由此,參照第一標(biāo)記線程的標(biāo)記處理過(guò)程,通過(guò)n個(gè)標(biāo)記線程的進(jìn)行協(xié)同并行的標(biāo)記處理,利用有限的內(nèi)存實(shí)現(xiàn)高效的并行標(biāo)記,同時(shí)實(shí)現(xiàn)標(biāo)記線程負(fù)載均衡,從而減少cpu緩存一致性沖突,提高整個(gè)垃圾回收的性能。
圖17是本申請(qǐng)另一個(gè)實(shí)施例的用于垃圾回收的并行標(biāo)記處理裝置的結(jié)構(gòu)示意圖。
參見(jiàn)圖17,基于圖16所示實(shí)施例,所述第二標(biāo)記模塊22還包括:
第十判斷單元218,用于如果其他(n-1)個(gè)標(biāo)記線程中與所述第一標(biāo)記線程對(duì)應(yīng)的公用輸出隊(duì)列都為空,所述第一標(biāo)記線程判斷本線程負(fù)責(zé)標(biāo)記的內(nèi)存塊中是否有溢出狀態(tài)的第五對(duì)象;
第九處理單元219,用于如果所述第一標(biāo)記線程負(fù)責(zé)標(biāo)記的內(nèi)存塊中具有溢出狀態(tài)的第五對(duì)象,所述第一標(biāo)記線程將當(dāng)前處理的內(nèi)存塊p4中標(biāo)記溢出狀態(tài)的第五對(duì)象修改為壓入狀態(tài),將當(dāng)前第五對(duì)象的第五指針壓入到所述第一私有棧中;
第十一判斷單元220,用于所述第一標(biāo)記線程判斷是否成功將所述第五指針壓入到所 述第一私有棧中;
第十處理單元221,用于如果所述第一標(biāo)記線程未能成功將所述第五指針壓入到所述第一私有棧中,則將所述內(nèi)存塊p4的位圖中、與該第五對(duì)象對(duì)應(yīng)的狀態(tài)標(biāo)記為溢出狀態(tài)。
進(jìn)一步地,在另一個(gè)實(shí)施例中,
所述第十處理單元221,還用于設(shè)置與所述內(nèi)存塊p5對(duì)應(yīng)的溢出標(biāo)志。
進(jìn)一步地,在另一個(gè)實(shí)施例中,
所述第十處理單元221,還用于如果所述第一標(biāo)記線程成功將所述第五指針壓入到所述第一私有棧中,則繼續(xù)對(duì)下一個(gè)第五對(duì)象進(jìn)行處理。
進(jìn)一步地,在另一個(gè)實(shí)施例中,
所述第九處理單元219,還用于如果所述第一標(biāo)記線程負(fù)責(zé)標(biāo)記的內(nèi)存塊中不具有溢出狀態(tài)的第五對(duì)象,則標(biāo)記結(jié)束,退出線程。
需要說(shuō)明的是,前述對(duì)用于垃圾回收的并行標(biāo)記處理方法實(shí)施例的解釋說(shuō)明也適用于該實(shí)施例的用于垃圾回收的并行標(biāo)記處理裝置,此處不再贅述。
本實(shí)施例提供的用于垃圾回收的并行標(biāo)記處理裝置,第一標(biāo)記線程在第一私有棧、第一緩存隊(duì)列、以及其他標(biāo)記線程中與第一標(biāo)記線程對(duì)應(yīng)的公用輸出隊(duì)列都為空時(shí),根據(jù)本線程負(fù)責(zé)標(biāo)記的具有溢出狀態(tài)的第五對(duì)象進(jìn)行壓入處理。由此,參照第一標(biāo)記線程的標(biāo)記處理過(guò)程,通過(guò)n個(gè)標(biāo)記線程的并行的標(biāo)記處理,利用有限的內(nèi)存實(shí)現(xiàn)高效的并行標(biāo)記,提高整個(gè)垃圾回收的性能。
在本說(shuō)明書(shū)的描述中,參考術(shù)語(yǔ)“一個(gè)實(shí)施例”、“一些實(shí)施例”、“示例”、“具體示例”、或“一些示例”等的描述意指結(jié)合該實(shí)施例或示例描述的具體特征、結(jié)構(gòu)、材料或者特點(diǎn)包含于本申請(qǐng)的至少一個(gè)實(shí)施例或示例中。在本說(shuō)明書(shū)中,對(duì)上述術(shù)語(yǔ)的示意性表述不必須針對(duì)的是相同的實(shí)施例或示例。而且,描述的具體特征、結(jié)構(gòu)、材料或者特點(diǎn)可以在任一個(gè)或多個(gè)實(shí)施例或示例中以合適的方式結(jié)合。此外,在不相互矛盾的情況下,本領(lǐng)域的技術(shù)人員可以將本說(shuō)明書(shū)中描述的不同實(shí)施例或示例以及不同實(shí)施例或示例的特征進(jìn)行結(jié)合和組合。
此外,術(shù)語(yǔ)“第一”、“第二”僅用于描述目的,而不能理解為指示或暗示相對(duì)重要性或者隱含指明所指示的技術(shù)特征的數(shù)量。由此,限定有“第一”、“第二”的特征可以明示或者隱含地包括至少一個(gè)該特征。在本申請(qǐng)的描述中,“多個(gè)”的含義是至少兩個(gè),例如兩個(gè),三個(gè)等,除非另有明確具體的限定。
流程圖中或在此以其他方式描述的任何過(guò)程或方法描述可以被理解為,表示包括一個(gè)或更多個(gè)用于實(shí)現(xiàn)特定邏輯功能或過(guò)程的步驟的可執(zhí)行指令的代碼的模塊、片段或部分, 并且本申請(qǐng)的優(yōu)選實(shí)施方式的范圍包括另外的實(shí)現(xiàn),其中可以不按所示出或討論的順序,包括根據(jù)所涉及的功能按基本同時(shí)的方式或按相反的順序,來(lái)執(zhí)行功能,這應(yīng)被本申請(qǐng)的實(shí)施例所屬技術(shù)領(lǐng)域的技術(shù)人員所理解。