网上非常多文件介绍了 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)

垃圾回收顺序图

最新文章

  1. 常用Java排序算法
  2. hdu 1106:排序(水题,字符串处理 + 排序)
  3. 微信小程序开发1
  4. struts2更新版本操作有关事项备注
  5. 【转】终于解决了Apache乱码问题
  6. [.NET MVC进阶系列03] Views 视图基础
  7. 禁止选择文本和禁用右键 v2.0
  8. Download SymmetricDS Data Sync Software for Free
  9. HashMap之Hash碰撞冲突解决方案及未来改进
  10. 超界文字滚动 (id和类型两种实现方式)
  11. 为开源社区尽一份力,翻译RocketMQ官方文档
  12. [51nod1671]货物运输
  13. nginx 日志分析工具goaccess
  14. Spring之DAO模块
  15. Python--可迭代对象,迭代器,生成器
  16. UVa 11627 - Slalom 二分. oj错误题目 难度: 0
  17. input file 美化
  18. php多进程 防止出现僵尸进程
  19. maven项目目录结构 学习笔记
  20. JarvisOJ平台Web题部分writeup

热门文章

  1. python学习笔记之五:抽象
  2. App域名劫持之DNS高可用 - 开源版HttpDNS方案详解(转)
  3. 内网port映射具体解释(花生壳)
  4. OpenGL3D迷宫场景设计
  5. REDGATE又一好用的脚本工具ScriptsManager1.3
  6. Android4.0设置接口变更摘要(四)
  7. Ubuntu 设备 spark
  8. c++堆栈实现
  9. 高质量c c++编程
  10. 返璞归真 asp.net mvc (1) - 添加、查询、更新和删除的 Demo