基于嵌入式設備瀏覽器內存管理策略研究
(2)管理策略二:具有Compaction機制的Vector分配策略。在Browser中,除了結構大小固定的對象頻繁分配和歸還外,經常有大量大小不同的對象分配和歸還,目前,這種現(xiàn)象主要出現(xiàn)在處理TextBox這一塊內容上,這些大小不向的對象具有如下特點:其一是對象的分配和歸還是隨機發(fā)生的;其二是對象可以在其生命過程中改變自身大小。如果直接利用系統(tǒng)函數進行分配和釋放,在總內存比較小的嵌入式系統(tǒng)中會造成過多的碎片,從而浪費了大量內存空間。具有Compaction機制的Vector通過移動“繼續(xù)在用對象”來移除“繼續(xù)在用對象”之間的“已經廢棄不用的對象”,從而把“繼續(xù)在用對象”移成連續(xù)排列,而“已經廢棄不用的所有對象”所占用的空間解放出來放到地址空間的某一端,對它們進行循環(huán)使用,移動對象,最富有挑戰(zhàn)的問題在于保證原來對內存空間的引用都被正確更新。當某個對象移往一個新位置,所有指向原地址的指針都將失效。雖然技術上有可能找出每一個移動對象的原有指針并更新之,但通常引入一個額外的間接層會使問題更簡單:用戶引用的是指向對象表中一個項目欄內對象的“handle”,而不再直接指向對象地址,“handle”是指向某對象真實地址的“惟一”指針,對象表中一個項目欄內有代表handle的addr、有表示對象所占空間的大小size和用于標志對象所占空間是否為“繼續(xù)在用對象”還是“已經廢棄不用的對象”的標志位mark。圖4表示了對象引用、對象表和實際對象的三者關系。當內存中移動“繼續(xù)在用對象”的時候,只需要更新對象表中相對應項目欄中代表handle的addr,使它指向對象的新地址,其他所有引用都可以繼續(xù)正確地訪問該對象。這里返回給用戶的引用是對象表的索引,用戶再通過索引獲得相對應的handle指針addr,為了使用戶快速獲取可用索引,建立了50個可用索引的buffer。本文引用地址:http://m.butianyuan.cn/article/150448.htm
如果對許多對象執(zhí)行Compaction,那么整個Compaction過程是比較費時的,因此,什么時候執(zhí)行Compaction將對一個應用程序的執(zhí)行效率有著重大影響。原則是:在內存空間和可用索引能夠滿足分配的情況下,能不要Compaction就不要執(zhí)行Compaction。因此建立了兩個執(zhí)行Compaction的觸發(fā)點,一個觸發(fā)點是當用完了預分配1 000個索引值時;另一個觸發(fā)點是當沒有可用內存空間用于分配時觸發(fā)。結果,在許多情況下避開了Compaction過程。對于管理索引值問題,采用了如下簡單算法:先取前50個索引值放到Index Buffer中,用完50個索引值以后,再取50個索引值放入Buffer中,直到預分配的1 000個索引值用完為止,這時執(zhí)行Compaction,然后按順序搜索對象表,如果對象表表項標志為可以重復利用,則把這個對象表表項的索引加入到Index Buffer之中,直到填滿Index Buffer為止;如果1 000個索引值已經全部用完,則按100為單位動態(tài)增加索引值。在Vector中,存放對象表需要一些額外的空間,大量對象的Compaction會占用比較多的時間,從而降低時間效率。
3 Browser內存管理的性能分析
Browser分別調用自己應用程序級的內存管理的接口與系統(tǒng)級的內存管理的接口進行運行比較,結論是應用程序級的內存管理效率比系統(tǒng)級的內存管理效率要高,網頁越大,體現(xiàn)出來的效率越高。
3.1 池式分配內存使用情況
對于Browse中各種固定大小的結構(這種結構稱謂thing),分別用相對應的一個內存池(pool)進行管理,各個pool形成一條pool鏈,內存管理器在執(zhí)行一段時間后會按照各個pool的調用頻率高低對pool鏈進行排序,從而提高了查找pool的效率。用小網頁、中等大小網頁和大網頁對pool鏈中的各個pool進行測試,得到如圖5所示的結果。
評論