码迷,mamicode.com
首页 > 移动开发 > 详细

Android Dalvikvm 内存管理理解

时间:2014-06-28 07:11:04      阅读:281      评论:0      收藏:0      [点我收藏+]

标签:android   dalvik   

网上很多文件介绍了 jvm 内存管理的理论,但在 Dalvikvm 中,究竟是如何实现的。

这几天猛看了 Dalvikvm 的源代码,说一下我的理解:


在大层面上讲跟理论一样,jvm 把内存分成了一些区,

bubuko.com,布布扣



关于各区的说明参见。

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 的高效,这点浪费还是值得的。


新建对象 

bubuko.com,布布扣

(  注意:一般 new创建对象多用汇编实现,但也调用到dvmAllocObject)


垃圾回收顺序图

bubuko.com,布布扣






Android Dalvikvm 内存管理理解,布布扣,bubuko.com

Android Dalvikvm 内存管理理解

标签:android   dalvik   

原文地址:http://blog.csdn.net/span76/article/details/35259599

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!