天天看點

Android Dalvikvm 記憶體管理了解

網上非常多檔案介紹了 jvm 記憶體管理的理論,但在 Dalvikvm 中,到底是怎樣實作的。

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

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

Android Dalvikvm 記憶體管理了解

關于各區的說明參見。

對于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 的高效,這點浪費還是值得的。

建立對象 

Android Dalvikvm 記憶體管理了解

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

垃圾回收順序圖

Android Dalvikvm 記憶體管理了解

繼續閱讀