欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

應(yīng)用程序級(jí)的內(nèi)存管理方法

文檔序號(hào):6613290閱讀:226來(lái)源:國(guó)知局
專利名稱:應(yīng)用程序級(jí)的內(nèi)存管理方法
技術(shù)領(lǐng)域
本發(fā)明涉及內(nèi)存管理技術(shù),特別是指一種應(yīng)用程序級(jí)的內(nèi)存管理方法。
背景技術(shù)
在嵌入式系統(tǒng)中,由于總的可用內(nèi)存相對(duì)比較小,而瀏覽器
(browser )的正常運(yùn)行需要比較大的內(nèi)存并且內(nèi)存分配和釋放頻繁, 例如, 一張賞心悅目的網(wǎng)頁(yè)中存在著各種長(zhǎng)短不一的文字段、各種表單
(Form)以及各種圖片等等,通過(guò)幾種矩形數(shù)據(jù)結(jié)構(gòu)(box)來(lái)表示它 們。在排版過(guò)程中,隨著上下文的改變,這幾種矩形數(shù)據(jù)結(jié)構(gòu)會(huì)進(jìn)行頻 繁的分配釋放,例如把圖片插入到網(wǎng)頁(yè)的時(shí)候,網(wǎng)頁(yè)會(huì)把一個(gè)局部區(qū)域 內(nèi)的矩形數(shù)據(jù)結(jié)構(gòu)釋放然后重新生成,從內(nèi)存管理角度來(lái)看,這導(dǎo)致了 頻繁的內(nèi)存分配和釋放。為了保證瀏覽器的正常運(yùn)行和減小內(nèi)部碎片, 有必要對(duì)應(yīng)用程序?yàn)g覽器進(jìn)行內(nèi)存管理。

發(fā)明內(nèi)容
有鑒于此,本發(fā)明提出一種應(yīng)用程序級(jí)的內(nèi)存管理方法,提高內(nèi)存 分配和釋^t過(guò)程的管理效率。
基于上述目的本發(fā)明提供的一種應(yīng)用程序級(jí)的內(nèi)存管理方法,包括 對(duì)固定大小數(shù)據(jù)結(jié)構(gòu)和可變大小數(shù)據(jù)結(jié)構(gòu)的內(nèi)存空間的管理,其管理方 法包括
釆用池式內(nèi)存管理的方式管理固定大小數(shù)據(jù)結(jié)構(gòu)的內(nèi)存空間的分配 和釋放,采用垃圾回收機(jī)制回收固定大小數(shù)據(jù)結(jié)構(gòu)內(nèi)存空間的分配和釋 放過(guò)程中產(chǎn)生的內(nèi)存碎片;
釆用矢量方式管理可變大小數(shù)據(jù)結(jié)構(gòu)的內(nèi)存空間的分配和釋放,采 用壓縮機(jī)制回收可變大小數(shù)據(jù)結(jié)構(gòu)內(nèi)存空間的分配和釋放過(guò)程中產(chǎn)生的 內(nèi)存碎片。
該方法所述固定大小數(shù)據(jù)結(jié)構(gòu)內(nèi)存空間的分配過(guò)程包括為每種固 定大小的數(shù)據(jù)結(jié)構(gòu)對(duì)象分別建立一個(gè)對(duì)象池,各種對(duì)象池組成一個(gè)池鏈 表(pool linked list);為所述固定大小的數(shù)據(jù)結(jié)構(gòu)對(duì)象分配一個(gè)固定大 小的內(nèi)存塊(arena)并按對(duì)象大小對(duì)這內(nèi)存塊進(jìn)行格式化。
該方法所述對(duì)固定大小的內(nèi)存塊格式化后還包括將該固定大小的 數(shù)據(jù)結(jié)構(gòu)對(duì)象的GCThing數(shù)據(jù)結(jié)構(gòu)中的flagp指針指向?qū)?yīng)的標(biāo)志位, 并把該標(biāo)志位設(shè)置為正在使用,將該對(duì)象可用空間的首地址返回給用 戶,將對(duì)象池中freeListHead指針指向下一個(gè)對(duì)象可用空間的首地址。
該方法所述分配過(guò)程前進(jìn)一步包括判斷當(dāng)前分配是否為首次分 配,如果是,為這個(gè)矩形數(shù)據(jù)結(jié)構(gòu)對(duì)象建立一個(gè)對(duì)象池頭,并掛到池鏈 表中;如果不是則直接執(zhí)行所述分配過(guò)程。
該方法如果不是,則進(jìn)一步查看是否存在一個(gè)可用對(duì)象空間,如果 有,將對(duì)象的GCThing數(shù)據(jù)結(jié)構(gòu)中的flagp指針指向?qū)?yīng)的標(biāo)志位,并 把標(biāo)志位置為正在使用;否則,對(duì)桂在該對(duì)象池中的所有內(nèi)存塊進(jìn)行垃 圾回收。
該方法所述固定大小數(shù)據(jù)結(jié)構(gòu)內(nèi)存空間的釋放過(guò)程包括根據(jù)分配 時(shí)返回的首地址找到相應(yīng)GCThing數(shù)據(jù)結(jié)構(gòu)中的flagp指針,此指針指 向一個(gè)標(biāo)志位,把這個(gè)標(biāo)志位i殳為已經(jīng)廢棄不用。
該方法所述固定大小數(shù)據(jù)結(jié)構(gòu)為矩形數(shù)據(jù)結(jié)構(gòu)。
該方法所述垃圾回收過(guò)程為對(duì)掛在此對(duì)象池中的所有固定大小的內(nèi) 存塊進(jìn)行垃圾回收,回收的可用對(duì)象通過(guò)鏈表的形式掛到freeListHead 指針下。
該方法如果垃圾回收后發(fā)現(xiàn)在這個(gè)池中已經(jīng)沒(méi)有可用空間,則再動(dòng) 態(tài)分配一個(gè)固定大小的內(nèi)存塊給這個(gè)池,其中每次分配的內(nèi)存塊大小都
是固定的。
該方法釆用位圖與垃圾回收機(jī)制結(jié)合來(lái)重用在固定大小的內(nèi)存塊中 已被用戶廢棄的內(nèi)存空間。
該方法所述可變大小數(shù)據(jù)結(jié)構(gòu)內(nèi)存空間的分配和釋放過(guò)程包括從
索引緩存中取得一個(gè)索引值,并把此索引值放到將要分配給使用者的內(nèi) 存的最后位置;
設(shè)置矢量(Vector)數(shù)據(jù)結(jié)構(gòu)中的各值,在其內(nèi)記錄了分配次數(shù)、 已分配內(nèi)存的總大小和下一次分配的起始位置;
設(shè)置對(duì)應(yīng)的對(duì)象表結(jié)構(gòu)中的各值,把其內(nèi)的標(biāo)志位置為正在使用, 地址置為當(dāng)前可用地址,大小置為使用者請(qǐng)求分配內(nèi)存的大小;返回索 引值給使用者。
該方法所述采用壓縮機(jī)制回收可變大小數(shù)據(jù)結(jié)構(gòu)內(nèi)存空間的分配和 釋放過(guò)程中產(chǎn)生的內(nèi)存碎片過(guò)程包括在對(duì)象表中檢測(cè)各StrMap數(shù)據(jù) 結(jié)構(gòu)的標(biāo)志位是已經(jīng)廢棄不用還是正在使用,如果標(biāo)志位是已經(jīng)廢棄不 用,那么更改這個(gè)標(biāo)志位為已經(jīng)回收并繼續(xù)檢測(cè)下一個(gè)StrMap數(shù)據(jù)結(jié) 構(gòu)的標(biāo)志位,直到找到一個(gè)標(biāo)志位是正在使用的StrMap數(shù)據(jù)結(jié)構(gòu),然 后把這個(gè)StrMap數(shù)據(jù)結(jié)構(gòu)對(duì)應(yīng)的內(nèi)存中的內(nèi)容移到前面已經(jīng)廢棄不用 的內(nèi)存中,并更改這個(gè)StrMap數(shù)據(jù)結(jié)構(gòu)的成員變量addr的值為新 值,重復(fù)這個(gè)過(guò)程,直到把對(duì)象表中的所有StrMap數(shù)據(jù)結(jié)構(gòu)檢測(cè)完。
從上面所述可以看出,本發(fā)明提出應(yīng)用程序級(jí)的內(nèi)存管理方法,采 用池式內(nèi)存管理的方式管理固定大小數(shù)據(jù)結(jié)構(gòu)的內(nèi)存空間的分配和釋 放,由于會(huì)根據(jù)需要而動(dòng)態(tài)增長(zhǎng),因此不用預(yù)測(cè)內(nèi)存池的大小;由于內(nèi) 存管理器減少了存儲(chǔ)每一個(gè)對(duì)象需要的一個(gè)表頭大小,并且減少了碎 片,池式內(nèi)存管理能夠在較少內(nèi)存中存儲(chǔ)更多對(duì)象,減少系統(tǒng)的整體內(nèi) 存需求。同時(shí),通過(guò)一個(gè)具有垃圾回收機(jī)制的可動(dòng)態(tài)增長(zhǎng)的內(nèi)存池來(lái)容 納一類小型結(jié)構(gòu)對(duì)象,使這些小型結(jié)構(gòu)對(duì)象在內(nèi)存中緊密排列,因而可 以循環(huán)使用池內(nèi)空間,且降低分頁(yè)系統(tǒng)中的分頁(yè)頻率及其帶來(lái)的額外開(kāi) 銷。由于實(shí)現(xiàn)的分配和釋放函數(shù)性能很好,因而提高了時(shí)間效率和實(shí)時(shí) 響應(yīng)能力。
采用矢量方式管理可變大小數(shù)據(jù)結(jié)構(gòu)的內(nèi)存空間的分配和釋放,采 用壓縮(Compaction)機(jī)制回收可變大小數(shù)據(jù)結(jié)構(gòu)內(nèi)存空間的分配和釋 放過(guò)程中產(chǎn)生的內(nèi)存碎片。利用具有壓縮機(jī)制的矢量方式通過(guò)移動(dòng)"繼 續(xù)在用對(duì)象"來(lái)移除"繼續(xù)在用對(duì)象"之間的"已經(jīng)廢棄不用的對(duì) 象",從而把"繼續(xù)在用對(duì)象,,移成連續(xù)排列,而"已經(jīng)廢棄不用的所 有對(duì)象"所占用的空間解放出來(lái)放到地址空間的某一端,對(duì)它們進(jìn)行循 環(huán)使用。減少了內(nèi)存碎片,避免了內(nèi)存空間的浪費(fèi)。
綜上,通過(guò)本發(fā)明方案提高了內(nèi)存分配和釋放過(guò)程的管理效率,不
會(huì)消耗盡系統(tǒng)的內(nèi)存而導(dǎo)致死機(jī);比系統(tǒng)的內(nèi)存管理更加高效。


圖1為本發(fā)明實(shí)施例瀏覽器內(nèi)存管理各分區(qū)的布局;
圖2為本發(fā)明實(shí)施例具有垃圾回收機(jī)制的可動(dòng)態(tài)增長(zhǎng)的池式內(nèi)存管 理的數(shù)據(jù)結(jié)構(gòu)示意圖3為本發(fā)明實(shí)施例矢量方式的數(shù)據(jù)結(jié)構(gòu)示意圖4為本發(fā)明實(shí)施例固定大小數(shù)據(jù)結(jié)構(gòu)內(nèi)存空間的分配和釋》文的流 程示意圖5為本發(fā)明實(shí)施例可變大小數(shù)據(jù)結(jié)構(gòu)內(nèi)存空間的分配和釋放的流 程示意圖。
具體實(shí)施例方式
下面參照附圖對(duì)本發(fā)明進(jìn)行更全面的描述,其中說(shuō)明本發(fā)明的示例 性實(shí)施例。
本發(fā)明是一種應(yīng)用程序級(jí)的內(nèi)存管理方案,內(nèi)部提供了兩套內(nèi)存管 理機(jī)制,分別是
采用池式內(nèi)存管理(Pooled Memory Management)的方式來(lái)管理 固定大小數(shù)據(jù)結(jié)構(gòu)的分配和釋放,采用垃圾回收機(jī)制回收其內(nèi)存碎片;
采用矢量方式來(lái)管理可變大小數(shù)據(jù)結(jié)構(gòu)的分配和釋放,比如字符 串,采用壓縮機(jī)制回收其內(nèi)存碎片。
下面結(jié)合具體實(shí)施例進(jìn)行詳細(xì)說(shuō)明
應(yīng)用程序?yàn)g覽器內(nèi)存管理是在一塊已分配的內(nèi)存上進(jìn)行再組織內(nèi)存 的使用方式,它不會(huì)涉及操作系統(tǒng)的內(nèi)存管理。
首先從系統(tǒng)獲得一塊固定大小的內(nèi)存,然后把這塊內(nèi)存按照功能進(jìn) 行固定分區(qū)。
參見(jiàn)圖1所示,圖1是瀏覽器內(nèi)存管理各分區(qū)的布局,把從系統(tǒng)獲
得的內(nèi)存分為四個(gè)區(qū)
第一個(gè)區(qū)是靜態(tài)區(qū)(Static Section),大小為20K,這個(gè)區(qū)主要包 括用于保存全局性數(shù)據(jù)結(jié)構(gòu)(GlobalCtlVar )的全局變量區(qū)(Global Variables Section ) 、 50個(gè)字(word)大小的索引緩存(Indices Buffer )、池鏈表(Pool Linked List),另外預(yù)留了一些空閑區(qū)域(Free Area )。
第二個(gè)區(qū)是字串映射區(qū)(String Map Section),是一個(gè)對(duì)象表,大 小為20K,用于存放數(shù)據(jù)結(jié)構(gòu)StrMap類型的數(shù)組,預(yù)定義數(shù)組大小為 1000, String Map功能之一類似于位圖(bitmap),用于管理空閑的數(shù) 據(jù)塊。
第三個(gè)區(qū)是保留區(qū)(Reserve Section ),大小是20K。 第四個(gè)區(qū)是可用空間區(qū)(Available Section),真正分配給用戶的內(nèi)
存從這個(gè)區(qū)取出。有關(guān)池的分配從上到下,有關(guān)矢量方式的分配從下到上。
本發(fā)明實(shí)施例中,對(duì)于固定大小數(shù)據(jù)結(jié)構(gòu)的分配和釋放采用具有垃 圾回收機(jī)制的可動(dòng)態(tài)增長(zhǎng)的池式內(nèi)存管理。
與傳統(tǒng)固定大小的內(nèi)存池技術(shù)相比,本發(fā)明引入了具有垃圾回收機(jī) 制的可動(dòng)態(tài)增長(zhǎng)的池式內(nèi)存管理,其數(shù)據(jù)結(jié)構(gòu)如圖2所示。
鏈表頭數(shù)據(jù)結(jié)構(gòu)由isShift、 searchPoolCounter 、 next和func pointers各成員組成。isShift用于標(biāo)志池式鏈表有沒(méi)有動(dòng)態(tài)調(diào)整過(guò),調(diào) 整是按每個(gè)池的使用頻率進(jìn)行排序,使用頻率高的在前,這樣可以減少 搜索到對(duì)應(yīng)池的平均時(shí)間;searchPoolCounter用于統(tǒng)計(jì)搜索池的次 數(shù);next指向池頭結(jié)構(gòu);func pointers用于注冊(cè)一些函數(shù)的指針。
池頭數(shù)據(jù)結(jié)構(gòu)由 boxStructSize 、 boxPool 、 freeListHead 、 boxUsedSize、 arenaUsedSize、 maxBytes、 frequency、 mark和next成 員組成。boxStructSize是一個(gè)數(shù)值,表示這個(gè)池只能用于給
boxStructSize大小的數(shù)據(jù)結(jié)構(gòu)分配內(nèi)存空間;boxPool的類型是 ArenaPool數(shù)據(jù)結(jié)構(gòu),用于管理這個(gè)池內(nèi)的所有內(nèi)存塊;freeListHead 指向池中當(dāng)前可用于分配的一塊空間;boxUsedSize用于記錄已經(jīng)分配 的空間總大小;arenaUsedSize用于記錄分配給內(nèi)存塊的空間總大小; maxBytes表示用于這個(gè)池的目前最大空間;frequency用于記錄從這個(gè) 池中分配內(nèi)存的總次數(shù);mark用于標(biāo)志這個(gè)池是否在使用;next指向 一個(gè)池。
內(nèi)存塊數(shù)據(jù)結(jié)構(gòu)由next、 base、 limit、 usedLimit、 avail和split成 員組成。next指向下一個(gè)內(nèi)存塊結(jié)構(gòu);base記錄了當(dāng)前內(nèi)存塊中第一個(gè) 可用地址;limit記錄了當(dāng)前內(nèi)存塊的最后位置;usedLimit記錄了當(dāng)前 內(nèi)存塊的可用空間的最后位置;avail指向當(dāng)前內(nèi)存塊中下一個(gè)用于分 配的地址;split指向當(dāng)前內(nèi)存塊中標(biāo)志區(qū)的最后位置。
這樣做的好處是由于會(huì)根據(jù)需要而動(dòng)態(tài)增長(zhǎng),因此不用預(yù)測(cè)內(nèi)存 池的大??;由于具有垃圾回收機(jī)制,因此可以循環(huán)使用池內(nèi)空間。
采用可動(dòng)態(tài)增長(zhǎng)的池式內(nèi)存管理
瀏覽器使用多種矩形數(shù)據(jù)結(jié)構(gòu)對(duì)象,并經(jīng)常對(duì)它們進(jìn)行分配和釋 放,但現(xiàn)有技術(shù)的內(nèi)存管理器會(huì)為每一個(gè)對(duì)象存儲(chǔ)一個(gè)表頭 (header),對(duì)小對(duì)象而言這些表頭可能會(huì)使程序的內(nèi)存需求加倍,此 外,在一個(gè)共享的堆(heap)中分配和釋放小對(duì)象,會(huì)帶來(lái)碎片風(fēng)險(xiǎn), 并因大量動(dòng)態(tài)對(duì)象而增加管理時(shí)間。
因此,本發(fā)明實(shí)施例對(duì)每種分配和釋放頻繁的矩形數(shù)據(jù)結(jié)構(gòu)對(duì)象分 別建立一個(gè)對(duì)象池,各種對(duì)象池組成一個(gè)池鏈表(pool linked list)。 一 個(gè)對(duì)象池首先預(yù)先分配一個(gè)固定大小的內(nèi)存塊并按對(duì)象大小對(duì)其進(jìn)行格 式化;當(dāng)用完一個(gè)固定大小的內(nèi)存塊的最后一個(gè)對(duì)象時(shí),對(duì)當(dāng)前的池進(jìn) -f亍垃圾回收處理,把回收的空間放入這個(gè)池的空閑鏈表(free linked list)當(dāng)中,用戶可以重用空閑鏈表中的空間;如果垃圾回收后發(fā)現(xiàn)在 這個(gè)池中已經(jīng)沒(méi)有可用空間,則再動(dòng)態(tài)分配一個(gè)固定大小的內(nèi)存塊給這 個(gè)池,其中每次分配的內(nèi)存塊大小都是固定的。從這種池式內(nèi)存管理的 過(guò)程來(lái)看,對(duì)固定大小的內(nèi)存塊的分配采用了動(dòng)態(tài)分區(qū)方式,對(duì)固定大
小的內(nèi)存塊中結(jié)構(gòu)對(duì)象的分配采用了固定分區(qū)方式。
其中,本實(shí)施例中所述池鏈表的表頭用GCThing數(shù)據(jù)結(jié)構(gòu)來(lái)描 述,GCThing由next指針、flagp指針組成。這里GCThing是聲明一 個(gè)結(jié)構(gòu)體類型時(shí)的結(jié)構(gòu)體名;next指針是GCThing結(jié)構(gòu)體的一個(gè)成 員,其指向另外一個(gè)GCThing結(jié)構(gòu)體或?yàn)榭?;flagp指針是GCThing 結(jié)構(gòu)體的一個(gè)成員,其指向標(biāo)志區(qū)的一個(gè)標(biāo)志位;freeListHead指針是 池頭結(jié)構(gòu)體的一個(gè)成員,其指向由所有空閑對(duì)象組成的空閑鏈表的首地址。
以上這樣做的好處是由于內(nèi)存管理器減少了存儲(chǔ)每一個(gè)對(duì)象需要 的一個(gè)表頭大小,并且減少了碎片,池式內(nèi)存管理能夠在較少內(nèi)存中存 儲(chǔ)更多對(duì)象,減少系統(tǒng)的整體內(nèi)存需求。同時(shí),通過(guò)一個(gè)具有垃圾回收 機(jī)制的可動(dòng)態(tài)增長(zhǎng)的內(nèi)存池來(lái)容納一類小型結(jié)構(gòu)對(duì)象,使這些小型結(jié)構(gòu) 對(duì)象在內(nèi)存中緊密排列,因而降低分頁(yè)系統(tǒng)中的分頁(yè)頻率及其帶來(lái)的額 外開(kāi)銷。由于實(shí)現(xiàn)的分配和釋放函數(shù)性能很好,因而提高了時(shí)間效率和 實(shí)時(shí)響應(yīng)能力。
但是,對(duì)于每個(gè)固定大小的內(nèi)存塊,由于在最后剩余空間不能容納 一個(gè)結(jié)構(gòu)對(duì)象的大小,那么這塊剩余空間就會(huì)成內(nèi)部碎片。當(dāng)然,求出 固定大小的內(nèi)存塊的合理大小,會(huì)使內(nèi)部碎片減少到幾個(gè)字節(jié),甚至沒(méi) 有內(nèi)部碎片。特別是每個(gè)池的最后一個(gè)固定大小的內(nèi)存塊,由于這個(gè)固
定大小的內(nèi)存塊最有可能沒(méi)有放滿結(jié)構(gòu)對(duì)象,因此可能會(huì)有比較多的空 間浪費(fèi)。其中,所述求固定大小的內(nèi)存塊合理大小具體可以釆用如下方 式對(duì)于出現(xiàn)頻率比較低的矩形數(shù)據(jù)結(jié)構(gòu)對(duì)象,固定大小的內(nèi)存塊的大 小可以取的較小并且其可用空間取矩形數(shù)據(jù)結(jié)構(gòu)大小與GCThing數(shù)據(jù) 結(jié)構(gòu)大小之和的整數(shù)倍;對(duì)于出現(xiàn)頻率比較高的矩形數(shù)據(jù)結(jié)構(gòu)對(duì)象,固 定大小的內(nèi)存塊的大小可以取得較大并且其可用空間取矩形數(shù)據(jù)結(jié)構(gòu) 大小與GCThing數(shù)據(jù)結(jié)構(gòu)大小之和的整數(shù)倍。
為了解決內(nèi)存碎片問(wèn)題,本實(shí)施例進(jìn)一步采用位圖與垃圾回收機(jī)制 共同經(jīng)營(yíng)回收在固定大小的內(nèi)存塊中已經(jīng)廢棄不用的內(nèi)存空間。
用戶從固定大小的內(nèi)存塊中分配走內(nèi)存空間,即如圖2中標(biāo)有已分
配空間(allocated space)的區(qū)域(這塊區(qū)域由其上面的GCThing數(shù)據(jù) 結(jié)構(gòu)進(jìn)行管理,GCThing由next指針、flagp指針組成),當(dāng)用戶用完 這塊內(nèi)存空間時(shí),對(duì)應(yīng)用程序級(jí)的內(nèi)存管理采用位圖與垃圾回收機(jī)制結(jié) 合來(lái)重用在固定大小的內(nèi)存塊中已被用戶廢棄不用的內(nèi)存空間。
在圖2中的標(biāo)志區(qū)(FLAG SECTION)其本質(zhì)上是一個(gè)位圖,在 標(biāo)志區(qū)中最小的單位是一個(gè)字節(jié)而不是一個(gè)位,在標(biāo)志區(qū)中每一個(gè)標(biāo)志 位(flag)都與一個(gè)按存放結(jié)構(gòu)大小進(jìn)行格式化后的內(nèi)存區(qū)域相對(duì)應(yīng), 在圖2中用GCThing數(shù)據(jù)結(jié)構(gòu)中的flagp指針指向標(biāo)志區(qū)中與其相對(duì)應(yīng) 標(biāo)志位,用一個(gè)字節(jié)大小的標(biāo)志位來(lái)表示其相對(duì)應(yīng)的內(nèi)存區(qū)域是正在使 用,還是已經(jīng)廢棄不用,或是已經(jīng)回收。
用戶通過(guò)本實(shí)施例的內(nèi)存管理器獲得一塊內(nèi)存區(qū)域,內(nèi)存管理器把 相對(duì)應(yīng)的標(biāo)志位置為正在使用;用戶通過(guò)內(nèi)存管理器釋放分配給它的內(nèi) 存區(qū)域,內(nèi)存管理器把相對(duì)應(yīng)的標(biāo)志位置為已經(jīng)廢棄不用;內(nèi)存管理器 回收標(biāo)志位標(biāo)志為已經(jīng)廢棄不用的內(nèi)存區(qū)域,把回收的內(nèi)存區(qū)域通過(guò) GCThing數(shù)據(jù)結(jié)構(gòu)掛到以freeListHead為頭指針的空閑塊鏈表中,如 圖2所示,從而達(dá)到了廢棄內(nèi)存區(qū)域的循環(huán)使用。
參見(jiàn)圖4所示,下面以為一個(gè)矩形數(shù)據(jù)結(jié)構(gòu)分配一塊內(nèi)存空間的過(guò) 程為例,對(duì)可動(dòng)態(tài)增長(zhǎng)的池式內(nèi)存管理過(guò)程進(jìn)行舉例說(shuō)明。
步驟401~402,判斷是否為首次分配,如果是首次分配,為這個(gè)矩 形數(shù)據(jù)結(jié)構(gòu)對(duì)象建立一個(gè)對(duì)象池頭,并掛到池鏈表(pool linked list) 中,進(jìn)入步驟403;如果不是首次分配的情況,進(jìn)入步驟408。
所述將對(duì)象池頭掛到池鏈表的過(guò)程包括首先找到池鏈表的最后位 置的next指針,然后把此對(duì)象池頭的首地址賦給這個(gè)next指針。
步驟403 ~ 404,為該矩形數(shù)據(jù)結(jié)構(gòu)對(duì)象分配一個(gè)固定大小的內(nèi)存塊 并掛到剛建立的對(duì)象池中;按對(duì)象大小(對(duì)象大小由表頭GCThing數(shù) 據(jù)結(jié)構(gòu)大小與矩形數(shù)據(jù)結(jié)構(gòu)的大小組成)對(duì)固定大小的內(nèi)存塊進(jìn)行格式 化。
步驟405~406,格式化完成之后,把第一個(gè)對(duì)象的GCThing數(shù)據(jù) 結(jié)構(gòu)中的flagp指4f指向標(biāo)志區(qū)中對(duì)應(yīng)的標(biāo)志^:,并把該標(biāo)志位i殳為正
在使用,然后把第一個(gè)對(duì)象的可用空間的首地址返回給用戶。
步驟407,將對(duì)象池中freeListHead指針指向第二個(gè)對(duì)象可用空間 的首地址。
步驟408,如果不是首次分配,找到這個(gè)矩形數(shù)據(jù)結(jié)構(gòu)相應(yīng)的對(duì)象池。
步驟409 ~ 411,通過(guò)freeListHead指針查看是否存在一個(gè)可用的 對(duì)象空間,如果存在,將該矩形數(shù)據(jù)結(jié)構(gòu)對(duì)應(yīng)的GCThing數(shù)據(jù)結(jié)構(gòu)中 的flagp指針指向?qū)?yīng)的標(biāo)志位,并把標(biāo)志位設(shè)為正在使用,并把此對(duì) 象的可用空間首地址返回給用戶,然后更新freeListHead指針,結(jié)束; 如果不存在,進(jìn)入步驟412。
步驟412,對(duì)掛在此對(duì)象池中的所有固定大小的內(nèi)存塊進(jìn)行垃圾回 收,回收的可用對(duì)象通過(guò)鏈表的形式掛到freeListHead指針下。
步驟413 ~ 415,判斷垃圾回收后,通過(guò)freeListHead指針是否至 少有一個(gè)可用對(duì)象,如果是,那么設(shè)置freeListHead指針指向的第一個(gè)
可用對(duì)象相應(yīng)的標(biāo)志位為正在使用,然后把此對(duì)象的可用空間的首地址 返回給用戶;否則(即如果垃圾回收后,沒(méi)有發(fā)現(xiàn)一個(gè)可用對(duì)象)進(jìn)入
步驟416。
步驟416 ~ 418,為這個(gè)矩形數(shù)據(jù)結(jié)構(gòu)對(duì)象分配一個(gè)固定大小的內(nèi)存 塊并掛到剛建立的對(duì)象池中,并按對(duì)象大小(表頭GCThing數(shù)據(jù)結(jié)構(gòu) 大小與矩形數(shù)據(jù)結(jié)構(gòu)的大小組成)對(duì)固定大小的內(nèi)存塊進(jìn)行格式化,格 式化完成之后,把第一個(gè)對(duì)象的GCThing數(shù)據(jù)結(jié)構(gòu)中的flagp指針指向 相應(yīng)標(biāo)志位,并把標(biāo)志位設(shè)為正在使用,然后把第一個(gè)對(duì)象的可用空的 首地址返回給用戶。
當(dāng)釋放一個(gè)矩形數(shù)據(jù)結(jié)構(gòu)所占用的內(nèi)存空間的時(shí)候,根據(jù)分配時(shí)返 回的首地址找到相應(yīng)GCThing數(shù)據(jù)結(jié)構(gòu)中的flagp指針,此指針指向一 個(gè)標(biāo)志位,把這個(gè)標(biāo)志位設(shè)為已經(jīng)廢棄不用,這樣就表示這塊內(nèi)存空間 可以再次利用。但是當(dāng)前還不能使用,只有經(jīng)過(guò)垃圾回收才可以使用。 當(dāng)通過(guò)freeListHead指針發(fā)現(xiàn)沒(méi)有一個(gè)可用對(duì)象空間的時(shí)候,就要執(zhí)行 垃圾回收,其過(guò)程如下檢測(cè)各個(gè)對(duì)象的標(biāo)志位是不是置為已經(jīng)廢棄不
用,如果已經(jīng)廢棄不用,把這塊對(duì)象掛入freeListHead指針?biāo)赶虻逆?br> 表,并把標(biāo)志位置為已經(jīng)回收。
另外,使用者也也可以主動(dòng)調(diào)用垃圾回收函數(shù)執(zhí)行垃圾回收過(guò)程。 對(duì)于可變大小數(shù)據(jù)結(jié)構(gòu)的分配和釋放采用具有壓縮機(jī)制的矢量結(jié)構(gòu)。
在瀏覽器中,除了結(jié)構(gòu)大小固定的對(duì)象頻繁分配和釋放外,經(jīng)常有 大量大小不同的對(duì)象分配和釋放,目前,這種現(xiàn)象主要出現(xiàn)在處理 TextBox這一塊內(nèi)容上,這些大小不同的對(duì)象具有如下特點(diǎn)其一是對(duì) 象的分配和釋放是隨機(jī)發(fā)生的;其二是對(duì)象可以在其生命過(guò)程中改變自 身大小。如果直接利用系統(tǒng)函數(shù)進(jìn)行分配和釋放,在總內(nèi)存比較小的嵌 入式系統(tǒng)中,會(huì)造成過(guò)多的碎片,從而浪費(fèi)了大量?jī)?nèi)存空間。
本發(fā)明實(shí)施例采用具有壓縮機(jī)制的矢量,通過(guò)移動(dòng)"繼續(xù)在用對(duì) 象"來(lái)移除"繼續(xù)在用對(duì)象"之間的"已經(jīng)廢棄不用的對(duì)象",從而把 "繼續(xù)在用對(duì)象"移成連續(xù)排列,而"已經(jīng)廢棄不用的所有對(duì)象"所占 用的空間解放出來(lái)放到地址空間的某一端,對(duì)它們進(jìn)行循環(huán)使用。
矢量的數(shù)據(jù)結(jié)構(gòu)如圖3:
索引緩存(Index Buffer):存放索引值,索引值的最大個(gè)數(shù)是預(yù)先 設(shè)置的,用完所有索引值后,可以動(dòng)態(tài)增加索引緩存的大小,從而獲得 更多的可用索引值;
對(duì)象表(Object Table):由StrMap數(shù)據(jù)結(jié)構(gòu)組成。StrMap數(shù)據(jù) 結(jié)構(gòu)由下列成員變量組成成員變量mark用于標(biāo)記相應(yīng)的內(nèi)存是正在 使用,或者已經(jīng)廢棄不用,或者已經(jīng)回收,size表示與這個(gè)StrMap相 對(duì)應(yīng)的已分配內(nèi)存的大小,addr表示與這個(gè)StrMap相對(duì)應(yīng)的已分配內(nèi) 存的首地址。
矢量結(jié)構(gòu)(Vector Structure):用于記錄管理可變大小數(shù)據(jù)結(jié)構(gòu)的 分配和釋放的一些參數(shù)。成員變量elementNum用于記錄當(dāng)前分配內(nèi)存 的次數(shù),dearNum用于記錄已經(jīng)釋放內(nèi)存的次數(shù),index等于最大的索 引值個(gè)數(shù),totalUsed用于記錄已使用內(nèi)存的大小,vectorLen記錄用于 可變大小數(shù)據(jù)結(jié)構(gòu)的總內(nèi)存大小,pNum指向索引緩存(Index Buffer)的首地址,pCurrNum指向索引緩存(Index Buffer)的當(dāng)前 可用地址,pLastNum指向索引緩存(Index Buffer)的最后地址, haslndex表示在索引緩存(Index Buffer)中是否還有可用索引值, pStrMap指向?qū)ο蟊淼氖椎刂罚琾LastSearchPos指向?qū)ο蟊淼淖詈笏阉?的位置,pLastlndex指向?qū)ο蟊淼淖詈蟮刂罚琾EndAUoc指向用于可變 大小數(shù)據(jù)結(jié)構(gòu)的內(nèi)存的最后位置,pCurrAlloc指向在可變大小數(shù)據(jù)結(jié)構(gòu) 的內(nèi)存中當(dāng)前可用位置,注冊(cè)回調(diào)函數(shù)部分是指把一些相關(guān)的函數(shù)指針 存放在這里。
下面對(duì)可變大小數(shù)據(jù)結(jié)構(gòu)的分配和釋放過(guò)程進(jìn)行舉例說(shuō)明。
分配過(guò)程中,使用者調(diào)用可變大小數(shù)據(jù)結(jié)構(gòu)的分配函數(shù),分配函數(shù) 的參數(shù)是使用者請(qǐng)求分配內(nèi)存的大小。
步驟501,首先從索引緩存中取得一個(gè)索引值,并把此索引值放到 將要分配給使用者的內(nèi)存的最后位置
步驟502,更新矢量結(jié)構(gòu)中的各值,在其內(nèi)記錄分配次數(shù)、已分配 內(nèi)存的總大小和下一次分配的起始位置。
步驟503,設(shè)置對(duì)應(yīng)的對(duì)象表結(jié)構(gòu)中的各值,把其內(nèi)的標(biāo)志位置為 已使用,地址置為當(dāng)前可用地址,大小置為使用者請(qǐng)求分配內(nèi)存的大小。
步驟504,最后返回索引值給使用者。使用者通過(guò)此索引值得到分 配獲得的內(nèi)存地址。
當(dāng)需要釋放內(nèi)存空間的時(shí)候,使用者調(diào)用可變大小數(shù)據(jù)結(jié)構(gòu)的釋放 函數(shù)釋放已分配的內(nèi)存空間,釋放函數(shù)的參數(shù)是索引值。釋放函數(shù)所做 的事情僅是把此索引值對(duì)應(yīng)的對(duì)象表(字串映射)中的標(biāo)志位置為已經(jīng) 廢棄不用。
如果可用空間已經(jīng)不足,則會(huì)對(duì)用于可變大小數(shù)據(jù)結(jié)構(gòu)的空間執(zhí)行 壓縮操作,具體過(guò)程如下在對(duì)象表中從第一個(gè)StrMap數(shù)據(jù)結(jié)構(gòu)開(kāi) 始,檢測(cè)其對(duì)應(yīng)的標(biāo)志位是已經(jīng)廢棄不用還是正在使用,如果標(biāo)志位是 已經(jīng)廢棄不用,那么更改這個(gè)標(biāo)志位為已經(jīng)回收并繼續(xù)檢測(cè)下一個(gè) StrMap數(shù)據(jù)結(jié)構(gòu)的標(biāo)志位,直到找到一個(gè)標(biāo)志位是正在使用的StrMap 數(shù)據(jù)結(jié)構(gòu),然后把這個(gè)StrMap數(shù)據(jù)結(jié)構(gòu)對(duì)應(yīng)的內(nèi)存中的內(nèi)容移到前面 已經(jīng)廢棄不用的內(nèi)存中,并更改這個(gè)StrMap數(shù)據(jù)結(jié)構(gòu)的成員變量addr 的值為新值,重復(fù)這個(gè)過(guò)程,直到把對(duì)象表中的所有StrMap數(shù)據(jù)結(jié)構(gòu) 檢測(cè)完。執(zhí)行壓縮之后,把所有正在使用的空間連成一片,沒(méi)有使用的 空間也連成一片。這時(shí)索引值對(duì)應(yīng)的內(nèi)存地址發(fā)生改變,但是返回給使 用者的索引值不變,因此使用者要通過(guò)索引值得到分配獲得的內(nèi)存地 址。
以上實(shí)施例是針對(duì)嵌入式瀏覽器的內(nèi)存管理描述的,本發(fā)明也可以 應(yīng)用于其他場(chǎng)合的應(yīng)用程序級(jí)的內(nèi)存管理,特別是對(duì)固定大小數(shù)據(jù)結(jié)構(gòu) 種類較少(比如10種以下)的情況具有很好的效果。
本發(fā)明的描述是為了示例和描述起見(jiàn)而給出的,而并不是無(wú)遺漏的 或者將本發(fā)明限于所公開(kāi)的形式。很多修改和變化對(duì)于本領(lǐng)域的普通技 術(shù)人員而言是顯然的。選擇和描述實(shí)施例是為了更好說(shuō)明本發(fā)明的原理 和實(shí)際應(yīng)用,并且使本領(lǐng)域的普通技術(shù)人員能夠理解本發(fā)明從而設(shè)計(jì)適 于特定用途的帶有各種修改的各種實(shí)施例。
權(quán)利要求
1.一種應(yīng)用程序級(jí)的內(nèi)存管理方法,包括對(duì)固定大小數(shù)據(jù)結(jié)構(gòu)和可變大小數(shù)據(jù)結(jié)構(gòu)的內(nèi)存空間的管理,其特征在于,包括采用池式內(nèi)存管理的方式管理固定大小數(shù)據(jù)結(jié)構(gòu)的內(nèi)存空間的分配和釋放,采用垃圾回收機(jī)制回收固定大小數(shù)據(jù)結(jié)構(gòu)內(nèi)存空間的分配和釋放過(guò)程中產(chǎn)生的內(nèi)存碎片;采用矢量方式管理可變大小數(shù)據(jù)結(jié)構(gòu)的內(nèi)存空間的分配和釋放,采用壓縮機(jī)制回收可變大小數(shù)據(jù)結(jié)構(gòu)內(nèi)存空間的分配和釋放過(guò)程中產(chǎn)生的內(nèi)存碎片。
2. 根據(jù)權(quán)利要求l所述的方法,其特征在于,所述固定大小數(shù)據(jù)結(jié) 構(gòu)內(nèi)存空間的分配過(guò)程包括為每種固定大小的數(shù)據(jù)結(jié)構(gòu)對(duì)象分別建立 一個(gè)對(duì)象池,各種對(duì)象池組成一個(gè)池鏈表;為所述固定大小的數(shù)據(jù)結(jié)構(gòu) 對(duì)象分配一個(gè)固定大小的內(nèi)存塊并按對(duì)象大小對(duì)其進(jìn)行格式化。
3. 根據(jù)權(quán)利要求2所述的方法,其特征在于,所述對(duì)固定大小的內(nèi) 存塊格式化后還包括將該固定大小的數(shù)據(jù)結(jié)構(gòu)對(duì)象的GCThing數(shù)據(jù) 結(jié)構(gòu)中的flagp指針指向?qū)?yīng)的標(biāo)志位,并把該標(biāo)志位設(shè)置為正在使 用,將該對(duì)象可用空間的首地址返回給用戶,將對(duì)象池中freeListHead 指針指向下一個(gè)對(duì)象可用空間的首地址。
4. 根據(jù)權(quán)利要求3所述的方法,其特征在于,所述分配過(guò)程前進(jìn)一 步包括判斷當(dāng)前分配是否為首次分配,如果是,為這個(gè)矩形數(shù)據(jù)結(jié)構(gòu) 對(duì)象建立一個(gè)對(duì)象池頭,并掛到池鏈表中;如果不是則直接執(zhí)行所述分 配過(guò)程。
5. 根據(jù)權(quán)利要求4所述的方法,其特征在于,如果不是,則進(jìn)一步 查看是否存在一個(gè)可用對(duì)象空間,如果有,將對(duì)象的GCThing數(shù)據(jù)結(jié) 構(gòu)中的flagp指針指向?qū)?yīng)的標(biāo)志位,并把標(biāo)志位置為正在使用;否 則,對(duì)掛在該對(duì)象池中的所有固定大小的內(nèi)存塊進(jìn)行垃圾回收。
6. 根據(jù)權(quán)利要求1所述的方法,其特征在于,所述固定大小數(shù)據(jù)結(jié) 構(gòu)內(nèi)存空間的釋放過(guò)程包括根據(jù)分配時(shí)返回的首地址找到相應(yīng) GCThing數(shù)據(jù)結(jié)構(gòu)中的flagp指針,此指針指向一個(gè)標(biāo)志位,把這個(gè)標(biāo) 志位設(shè)為已經(jīng)廢棄不用。
7. 根據(jù)權(quán)利要求1至6任意一項(xiàng)所述的方法,其特征在于,所述固 定大小數(shù)據(jù)結(jié)構(gòu)為矩形數(shù)據(jù)結(jié)構(gòu)。
8. 根據(jù)權(quán)利要求1至6任意一項(xiàng)所述的方法,其特征在于,所述垃 圾回收過(guò)程為對(duì)掛在此對(duì)象池中的所有固定大小的內(nèi)存塊進(jìn)行垃圾回 收,回收的可用對(duì)象通過(guò)鏈表的形式掛到freeListHead指針下。
9. 根據(jù)權(quán)利要求8所述的方法,其特征在于,如果垃圾回收后發(fā)現(xiàn) 在這個(gè)池中已經(jīng)沒(méi)有可用空間,則再動(dòng)態(tài)分配一個(gè)固定大小的內(nèi)存塊給 這個(gè)池,其中每次分配的內(nèi)存塊大小都是固定的。
10. 根據(jù)權(quán)利要求8所述的方法,其特征在于,采用位圖與垃圾回 收機(jī)制結(jié)合來(lái)重用在固定大小的內(nèi)存塊中已被用戶廢棄的內(nèi)存空間。
11. 根據(jù)權(quán)利要求1所述的方法,其特征在于,所述可變大小數(shù)據(jù) 結(jié)構(gòu)內(nèi)存空間的分配和釋放過(guò)程包括從索引緩存中取得一個(gè)索引值, 并把此索引值放到將要分配給使用者的內(nèi)存的最后位置;設(shè)置矢量數(shù)據(jù)結(jié)構(gòu)中的各值,在其內(nèi)記錄了分配次數(shù)、已分配內(nèi)存 的總大小和下一次分配的起始位置;設(shè)置對(duì)應(yīng)的對(duì)象表結(jié)構(gòu)中的各值,把其內(nèi)的標(biāo)志位置為正在使用, 地址置為當(dāng)前可用地址,大小置為使用者請(qǐng)求分配內(nèi)存的大??;返回索 引值給使用者。
12. 根據(jù)權(quán)利要求1所述的方法,其特征在于,所述采用壓縮機(jī)制 回收可變大小數(shù)據(jù)結(jié)構(gòu)內(nèi)存空間的分配和釋放過(guò)程中產(chǎn)生的內(nèi)存碎片過(guò) 程包括在對(duì)象表中檢測(cè)各StrMap數(shù)據(jù)結(jié)構(gòu)的標(biāo)志位是已經(jīng)廢棄不用 還是正在使用,如果標(biāo)志位是已經(jīng)廢棄不用,那么更改這個(gè)標(biāo)志位為已 經(jīng)回收并繼續(xù)檢測(cè)下一個(gè)StrMap數(shù)據(jù)結(jié)構(gòu)的標(biāo)志位,直到找到一個(gè)標(biāo) 志位是正在使用的StrMap數(shù)據(jù)結(jié)構(gòu),然后把這個(gè)StrMap數(shù)據(jù)結(jié)構(gòu)對(duì) 應(yīng)的內(nèi)存中的內(nèi)容移到前面已經(jīng)廢棄不用的內(nèi)存中,并更改這個(gè) StrMap數(shù)據(jù)結(jié)構(gòu)的成員變量addr的值為新值,重復(fù)這個(gè)過(guò)程,直到把 對(duì)象表中的所有StrMap數(shù)據(jù)結(jié)構(gòu)檢測(cè)完。
全文摘要
本發(fā)明公開(kāi)一種應(yīng)用程序級(jí)的內(nèi)存管理方法,包括對(duì)固定大小數(shù)據(jù)結(jié)構(gòu)和可變大小數(shù)據(jù)結(jié)構(gòu)的內(nèi)存空間的管理,其管理方法包括采用池式內(nèi)存管理的方式管理固定大小數(shù)據(jù)結(jié)構(gòu)的內(nèi)存空間的分配和釋放,采用垃圾回收機(jī)制回收固定大小數(shù)據(jù)結(jié)構(gòu)內(nèi)存空間的分配和釋放過(guò)程中產(chǎn)生的內(nèi)存碎片;采用矢量方式管理可變大小數(shù)據(jù)結(jié)構(gòu)的內(nèi)存空間的分配和釋放,采用壓縮機(jī)制回收可變大小數(shù)據(jù)結(jié)構(gòu)內(nèi)存空間的分配和釋放過(guò)程中產(chǎn)生的內(nèi)存碎片。通過(guò)本發(fā)明方案提高了內(nèi)存分配和釋放過(guò)程的管理效率,不會(huì)消耗盡系統(tǒng)的內(nèi)存而導(dǎo)致死機(jī);比系統(tǒng)的內(nèi)存管理更加高效。
文檔編號(hào)G06F12/02GK101169759SQ20071016927
公開(kāi)日2008年4月30日 申請(qǐng)日期2007年11月8日 優(yōu)先權(quán)日2007年11月8日
發(fā)明者胡世煒, 費(fèi)華東 申請(qǐng)人:Ut斯達(dá)康通訊有限公司
網(wǎng)友詢問(wèn)留言 已有0條留言
  • 還沒(méi)有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1
五指山市| 锡林郭勒盟| 泌阳县| 建湖县| 页游| 扶余县| 漳浦县| 通州市| 黄陵县| 五常市| 昭通市| 宁陵县| 博乐市| 乃东县| 临城县| 长子县| 仙桃市| 东乌珠穆沁旗| 尼木县| 尼玛县| 永新县| 永年县| 高安市| 邹城市| 会理县| 枝江市| 安宁市| 中山市| 塘沽区| 天峨县| 灌南县| 唐山市| 清水河县| 广宁县| 汕头市| 佛山市| 东海县| 晋中市| 山东省| 南漳县| 泗洪县|