zoukankan      html  css  js  c++  java
  • Android Dalvikvm 内存管理理解

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


    垃圾回收顺序图







  • 相关阅读:
    使用Areas分离ASP.NET MVC项目
    将json转化为model
    简单的三层asp.net webForm使用Ninject实现Ioc
    本机连接虚拟机Oracle时报错的解决办法
    老电脑升级
    安装Oracle时选择桌面类和服务器类的区别
    64位操作系统下启用32位模式
    log4net在WinForm和ASP.net下的设置
    Delphi2009下编译提示“无法找到“Excel_TLB”
    Delphi 中的MD5实现方法(转)
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4494015.html
Copyright © 2011-2022 走看看