標籤: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)
記憶體回收順序圖