Top n++ things you need to know about Dalvik VM memory model

來源:互聯網
上載者:User
關於 dalvik虛擬機器  記憶體模型  你最應該知道的 n 個實現特徵

對於任何java虛擬機器的實現,記憶體管理和垃圾收集(簡稱記憶體模型 )都是重頭戲。它的實現效率將很大程度上決定改虛擬機器實現的效能。本文將以最簡潔的方式告訴你 dvm 裡記憶體模型(DVM ALLOC)的n個實現特徵:

1. DVM ALLOC實現裡,記憶體配置有兩種,GC heap 和 Native heap。

他們最大的區別是 GC heap裡申請的記憶體最終將由垃圾收集器回收。而native heap裡的記憶體不受垃圾收集器管理,必須顯式的釋放。

GC heap 裡面盛放的都是java 對象,它們都是通過以下函數(或者封裝它的函數)申請記憶體:

void* dvmMalloc(size_t size, int flags) @heap.cpp

而native heap 用於服務於DVM Alloc實現本身的,如下文提到的CardTable, HeapBitmap 等, 它們是通過 malloc()或者ashmem_create_region()申請記憶體。

 

2. DVM實現內建了兩種垃圾收集器, 分別是 標誌-清除垃圾收集 和 拷貝垃圾收集。 選擇哪種那垃圾收集器是在編譯是決定的(是否制定WITH_COPYING_GC編譯選項),而不能通過運行時動態切換。

 

3. DVM用一塊獨立的記憶體(CardTable)標記GC heap的使用方式。概念上,整個GC heap被分成等大的地區,每個地區是 GC_CARD_SIZE 大小。CardTable裡每個位元組代表一個該地區。

dvm初始化時,CardTable裡每個位元組被初始化為GC_CARD_CLEAN (0x00)值,表示其對應的GC heap地區沒有寫入內容。如果後面該地區被寫入內容後,其對應的CardTable位元組會被標記為GC_CARD_DIRTY (0x70)。

通過這種方法,dvm可以以地區為單位來檢查改段記憶體是否被使用過。比如在垃圾收集過程中,沒有使用過的地區根本不需要搜尋其中的對象。

 

4. DVM使用另一段獨立的記憶體(HeapBitmap)來標記記憶體中java對象狀態。 HeapBitpmap是一個unsign long 數組(unsigned long *bits)。其中每個數群組成員是被稱作一個字(word, unsign long type)。

該模型中,我們可以把整個個gc heap分成以HB_OBJECT_ALIGNMENT (8)為大小的地區,其每個地區中用HeapBitmap中的一個bit來表示。

比如heapbitmap數組第一個字的最高位(第31位)表示gc heap的一個byte(HB_OBJECT_ALIGNMENT 長)內容,第30位表示gc heap上得第二個byte。

 

dvm使用兩種HeapBitmap, 一種是LiveBitmap 來表示 live object在gc heap裡的分布。 如果在記憶體裡某個地址裡(必然是HB_OBJECT_ALIGNMENT對齊的),存在一個java object,則其的HeapBitmap裡的對應的位被標記 (置一)。

另一種HeapBitmap叫MarkBitmap, 表示根節點(root set)以及強可觸及對象的分布。

 

5. 標記-清除垃圾收集 演算法,就是使用LiveBitMap遍曆GC heap, 標註所有的根節點以及所有的強可觸及對象,從而標識出MarkBitmap。這樣,所有在 LiveBitmap中標識,卻沒有在MarkBitmap標識的位對應的對象就是垃圾。

 

6. DVM記憶體模型並不複雜,卻是用了分層實現。比如Alloc.cpp 裡多數函數只是簡單的調用Heap.cpp裡對應的函數,而Heap.cpp裡函數有調用 HeapSource.cpp/MarkSweep.cpp (for mark-sweep gc) 或者 Copying.cpp(for copying gc)裡的實現。 這種分層模型的好處是最大程度上隱藏細節,增加設計的靈活性。比如heap實現函數完全不知道當前使用的是 mark-sweep gc 還是 copying gc。 它調用的介面完全一樣。這樣子,如果將來我們實現別的gc演算法,我們完全不需要改動heap層以上的內容。

7.DVM記憶體模型裡大量使用訪問器(Vistor)。所謂訪問器,就是遍曆同一個集合裡的所有的元素,對每個元素調用指定的處理函數。我們通過傳入不同的處理函數編譯可以方便的操作同一個集合每一元素以產生不同的行為。

8. DVM管理GC heap是藉助 著名的dlmalloc 記憶體 Clerk實現的。作者是Doug Lea。

9. 至今沒有看到該模型實現有什麼驚豔之處。 你所能讀到的所有的技術都能在其他的java vm實現裡找到參考。

以上是快速研究dvm alloc源碼的結論,有不當之處請不吝賜教。下面是扔給大家的挑戰:

1. 實現你自己的垃圾收集器,越簡單越好! 要求盡量減少對其他部分的修改。改垃圾收集器應該能夠編譯,運行。

2. 在dvm裡實現 標誌-清除 和 拷貝 兩種垃圾收集器的 運行時動態切換。

3. 用更加節省記憶體的方式實現 CardTable

4. 實際使用中發現,Mark-Sweep垃圾收集器會產生很嚴重片段記憶體。今天看到一個極端的例子,明明一個虛擬機器執行個體裡還有60%空閑內粗(十幾兆)卻申請一個200+K記憶體時拋出OOM。 怎樣子解決這個問題?

哈哈,Happy Androiding !

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.