基于嵌入式設(shè)備瀏覽器內(nèi)存管理策略研究
(1)管理策略一:具有垃圾回收機(jī)制的可動(dòng)態(tài)增長(zhǎng)的池式分配。與傳統(tǒng)固定大小的內(nèi)存池技術(shù)相比,在此引入了具有垃圾回收機(jī)制的可動(dòng)態(tài)增長(zhǎng)的池式分配,其數(shù)據(jù)結(jié)構(gòu)如圖3所示。由于會(huì)根據(jù)需要而動(dòng)態(tài)增長(zhǎng),因此不用預(yù)測(cè)內(nèi)存池的大??;由于具有垃圾回收機(jī)制,因此可以循環(huán)使用池內(nèi)空間。瀏覽器使用多種box對(duì)象,并經(jīng)常對(duì)它們進(jìn)行分配和歸還,但典型的內(nèi)存管理器會(huì)為每一個(gè)對(duì)象存儲(chǔ)一個(gè)header(表頭),對(duì)小對(duì)象而言這些headers可能會(huì)使程序的內(nèi)存需求加倍,此外,在一個(gè)共享的heap中分配和歸還小對(duì)象會(huì)帶來碎片風(fēng)險(xiǎn),并因大量動(dòng)態(tài)對(duì)象而增加管理時(shí)間。因此,對(duì)每種分配和歸還頻繁的box對(duì)象分別建立一個(gè)對(duì)象池,各種對(duì)象池形成一個(gè)poollinkedlist。一個(gè)對(duì)象池首先預(yù)先分配一個(gè)固定大小的arena并按對(duì)象大小對(duì)arena進(jìn)行格式化,當(dāng)用完arena的最后一個(gè)對(duì)象時(shí),對(duì)當(dāng)前的pool進(jìn)行垃圾回收,把回收的空間放入這個(gè)pool的freelist當(dāng)中,用戶可以重用freelist上的空間,如果垃圾回收后發(fā)現(xiàn)在這個(gè)pool中已經(jīng)沒有可用空間,則動(dòng)態(tài)分配一個(gè)arena。從這種池式分配的過程來看,對(duì)arena的分配采用了動(dòng)態(tài)分區(qū)方式,對(duì)arena中結(jié)構(gòu)對(duì)象的分配采用了固定分區(qū)方式。
從理論上分析,由于內(nèi)存管理器減少了存儲(chǔ)每一個(gè)對(duì)象需要的一個(gè)header(表頭)大小(在這里這個(gè)表頭是GCThing,GCThing由next指針、flagp指針組成),并且減少了碎片,池式分配能夠在較少內(nèi)存中存儲(chǔ)更多對(duì)象,減少系統(tǒng)的整體內(nèi)存需求。同時(shí),通過一個(gè)具有垃圾回收機(jī)制的可動(dòng)態(tài)增長(zhǎng)的內(nèi)存池來容納一類小型結(jié)構(gòu)對(duì)象,使這些小型結(jié)構(gòu)對(duì)象在內(nèi)存中緊密排列,因而降低分頁(yè)系統(tǒng)中的paging頻率及其帶來的額外開銷。由于本方案實(shí)現(xiàn)的分配和歸還函數(shù)性能較好,因而提高了時(shí)間效率和實(shí)時(shí)響應(yīng)能力。但是,對(duì)于每個(gè)arena,由于在最后剩余空間不能容納一個(gè)結(jié)構(gòu)對(duì)象的大小,那么這塊剩余空間就會(huì)成內(nèi)部碎片。當(dāng)然,求出arena的合理大小會(huì)使內(nèi)部碎片減少到幾個(gè)字節(jié),甚至是沒有內(nèi)部碎片;特別是每個(gè)pool的最后一個(gè)arena,由于這個(gè)arena最有可能沒有放滿結(jié)構(gòu)對(duì)象,因此可能會(huì)有比較多的空間浪費(fèi)。
用戶從arena中分配走內(nèi)存空間,圖3中標(biāo)有allocated space的區(qū)域(這塊區(qū)域由其上面的GCThing數(shù)據(jù)結(jié)構(gòu)進(jìn)行管理,GCThing由next指針、flagp指針組成),當(dāng)用戶用完這塊內(nèi)存空間,應(yīng)用程序級(jí)的內(nèi)存管理應(yīng)該如何重用它,以及在什么時(shí)候重用它。采用位圖與垃圾回收機(jī)制結(jié)合來重用在arena中已被用戶廢棄的內(nèi)存空間。在圖3中的FLAG SECTION其本質(zhì)上是一個(gè)bitmap,在FLAG SECTION中最小的單位是一個(gè)字節(jié)而不是一個(gè)位,在FLAG SECTION中每一個(gè)flag都與一個(gè)按存放結(jié)構(gòu)大小進(jìn)行格式化后的內(nèi)存區(qū)域相對(duì)應(yīng),在圖3中用GCThing數(shù)據(jù)結(jié)構(gòu)中的flagp指針處理flag與其相對(duì)應(yīng)的內(nèi)存區(qū)域之間相互掛鉤,用flag字節(jié)來表示其相對(duì)應(yīng)的內(nèi)存區(qū)域是正在使用,還是用戶已經(jīng)廢棄,或是已經(jīng)被的內(nèi)存管理器回收。用戶通過的內(nèi)存管理器獲得一塊內(nèi)存區(qū)域,內(nèi)存管理器把相對(duì)應(yīng)的flag置為正在使用;用戶通過內(nèi)存管理器釋放分配給它的內(nèi)存區(qū)域,內(nèi)存管理器把相對(duì)應(yīng)的flag置為已經(jīng)廢棄;內(nèi)存管理器回收flag標(biāo)志為已經(jīng)廢棄的內(nèi)存區(qū)域,把回收的內(nèi)存區(qū)域通過GCTh-ing數(shù)據(jù)結(jié)構(gòu)掛到以freeListHead為頭指針的空閑塊鏈表中,如圖3所示,從而達(dá)到了廢棄內(nèi)存區(qū)域的循環(huán)使用。
評(píng)論