Android Dalvikvm 記憶體管理理解

來源:互聯網
上載者:User

標籤:android   dalvik   

網上很多檔案介紹了 jvm 記憶體管理的理論,但在 Dalvikvm 中,究竟是如何?的。

這幾天猛看了 Dalvikvm 的原始碼,說一下我的理解:


在大層面上講跟理論一樣,jvm 把記憶體分成了一些區,




關於各區的說明參見。

http://blog.csdn.net/lengyuhong/article/details/5953544


對於hello world 這樣簡單程式,發現dalvikvm也就用了一個heap, 就是Eden區了。


dalvikvm 使用 mmap 建立共用記憶體(堆是多個線程共用的),就是Eden區,再用dlmalloc 中的( mspace_free,mspace_calloc等) 來自己對它進行管理(也就不在調用OS的記憶體指派了,這樣做可能是因為效能可以預測)

代碼在:dalvik/vm/alloc/HeapSource.cpp#dvmHeapSourceStartup

值得注意的是,除了使用dlmalloc,dalvikvm 還是用了2個bitmap的來對應整個堆,一個叫liveBitmap, 一個叫markBitmap 是為了做gc的。

1在gc過程中,先把markbitmap清0

2在sweepscan過程中,找到每一object指標,就在對應markbitmap位置置位,這是一個深度優先(使用了stack)搜尋演算法

3在liveBitmap中有但markbitmap沒有標記的對象就是該在sweep時用mspace_free 來釋放

4markbitmap成了了liveBitmap 表明live objects

進入下一次迴圈


由於對象有大有小,而bitmap 是按照object的最小的size來映射一個bit的, 因此肯定有浪費的空間, 但為了現實marksweep 的高效,這點浪費還是值得的。


建立對象 


(  注意:一般 new建立對象多用彙編實現,但也調用到dvmAllocObject)


記憶體回收順序圖







聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.