Dalvik内存:

1.系统堆/外部堆(External heap)/CRT堆(Java方法调用栈/Java函数调用栈/...)----malloc/calloc/realloc/free

OS系统启动本地程序->创建CRT(包括堆)->入口函数

2.系统栈(Dalvik函数调用栈)

系统创建:SP指针

3.GC堆(系统申请内存,dl组织成GC堆)----dvmMalloc/垃圾回收----Dalvik启动创建/关闭释放

启动:创建一个GC堆(GCHeap),其包含3个堆,常用第一个堆

(1)dvmAllocRegion():向系统申请一块映射过的内存,交给dl管理

(2)createMspace:交给dl管理---只用系统分配的一半以便扩充

(3)mspace_malloc:在dl内存(空间)上创建一个GC堆(包括GC堆的管理数据)

4.方法区/线性内存(Linear)(ClassObject的实体数据)----dvmLinearAlloc/dvmLinearFree----Dalvik启动创建/关闭释放

系统申请一块映射过的内存,直接组织成Linear内存......只读且线性

--------------------------------------------------------------------------------

GC堆位图:每一位对应堆中8字节内存

(1)活对象位图(liveBits)

(2)标记位图(markBits)

--------------------------------------------------------------------------------

创建对象(dvmHeapSourceAlloc):(标志位flags:ALLOC_DEFAULT,ALLOC_DONT_TRACK,ALLOC_FINALIZABLE)

(1)dlmalloc在GC堆上:分配内存,设置liveBits

(2)处理flags标志位(ALLOC_DEFAULT:放入track引用表,ALLOC_DONT_TRACK:无,ALLOC_FINALIZABLE:放入finalizable引用表)

(3)(若有引用)赋值给引用

--------------------------------------------------------------------------------

垃圾回收(dvmCollectGarbageInternal):Mark-Sweep

(1)标记(Mark):扫描引用表和调用栈,设置markBits

(1)标记根集(RootSet):需要递归扫描的放入标记栈(MarkStack)

System classes defined by root classloader
                     For each thread:

Interpreted stack, from top to "curFrame"

Dalvik registers (args + local vars)

JNI local references

Automatic VM local references (TrackedAlloc):跟踪放入的引用(如果想跟踪某个Java对象可以调dvmAddTrackedAlloc,放入跟踪引用表)

Associated Thread/VMThread object

ThreadGroups (could track & start with these instead of working

upward from Threads)

Exception currently being thrown, if present

JNI global references

Interned string table

Primitive classes

Special objects

gDvm.outOfMemoryObj

Objects allocated with ALLOC_NO_GC

Objects pending finalization (but not yet finalized):待finalize引用表

Objects in debugger object registry

(2)递归扫描标记栈(MarkStack)

(2)处理Finalize表

(3)清除(Sweep):比较liveBits和markBits,清除没有标记的对象(dvmHeapSourceFreeList:清除位图,释放内存)

--------------------------------------------------------------------------------

Dalvik不支持SoftReference/WeakReference/PhantomReference,全部当成强引用,GC时先清空这3个引用表(但如果不清空还是有相应的管理函数存在),但Java层面并不知道

SoftReference/WeakReference/PhantomReference都继承自Reference类(强引用)

--------------------------------------------------------------------------------

但同时Dalvik保留了SoftReference/WeakReference/PhantomReference的支持代码

1.Mark标记时不会扫描(全局)软/弱/虚引用表

2.如果注释掉这3行代码,打开软/弱/虚引用支持

gcHeap->softReferences = NULL;

gcHeap->weakReferences = NULL;

gcHeap->phantomReferences = NULL;

则在Sweep之前:

(1)SoftRefs:如果内存不足,软引用表中引用清空(NULL),否则补充标记软引用表所有引用----或者删除

(2)WeakRefs:弱引用表中引用清空(NULL)-----直接删除

(3)PhantomRefs:虚引用表中引用清空(NULL)----直接删除

--------------------------------------------------------------------------------

finalizable引用表:对象如果有finalize方法,创建时会被放入(全局)finalize引用,扫描根集后(Sweep前),finalize表中未标记对象放入pendingFinalize待finalize表,留给HeapWorker线程处理

Dalvik创建一个HeapWorker线程,每隔一段时间处理 待finalize表(从待fianlize表依次取出并临时放入线程局部引用表,调用finalize方法,取出线程局部引用表----下次不会被扫描到----被GC)

--------------------------------------------------------------------------------

android dalvik vm alloc

Dalvik内存管理相关推荐

  1. android 播放英强博客,Android内存管理、监测剖析

    Android内存管理机制 Android内存管理主要有:LowMemory Killer机制,Ashmem,PMEM/ION及Native内存和Dalvik内存管理管理和JVM垃圾回收机制. Low ...

  2. Android 内存管理 amp;Memory Leak amp; OOM 分析

    1.Android 流程管理&内存 Android主要应用在嵌入式设备其中.而嵌入式设备因为一些众所周知的条件限制,通常都不会有非常高的配置,特别是内存是比較有限的. 假设我们编写的代 码其中 ...

  3. Android之内存管理-内存监测-内存优化

    推荐文章:Android进程与内存及内存泄漏 Android之内存管理 1.1 Dalvik Dalvik虚拟机是Android程序的虚拟机,是Android中Java程序的运行基础.其指令集基于寄存 ...

  4. Android 内存管理 Memory Leak OOM 分析

    转载博客:http://blog.csdn.net/vshuang/article/details/39647167 1.Android 进程管理&内存 Android主要应用在嵌入式设备当中 ...

  5. Android官方开发文档Training系列课程中文版:APP的内存管理

    写在开头的话: 如果有同学对Android性能比较关注的,可以阅读这篇文章:Android性能优化建议 原文地址:http://android.xsoftlab.net/training/articl ...

  6. Android内存管理-SoftReference的使用

    Android内存管理-SoftReference的使用 发布时间:2010-09-15 作者:Android开发网原创 很多时候我们需要考虑Android平台上的内存管理问题,Dalvik VM给每 ...

  7. iOS 的内存管理和虚拟内存机制具体是怎么运作的?

    iOS 的内存管理和虚拟内存机制具体是怎么运作的? 众所周知,iOS 设备的内存普遍较小.但就最终用户体验而言,流畅舒服.想知道虚拟内存在其中是否发挥了作用? 3 条评论 分享 按投票排序按时间排序 ...

  8. Android 内存管理之优化建议

    OOM(OutOfMemory)转:http://hukai.me/android-performance-oom/ 前面我们提到过使用getMemoryClass()的方法可以得到Dalvik He ...

  9. davlik虚拟机内存管理之一——内存分配

    dalvik虚拟机是Google在Android平台上的Java虚拟机的实现,内存管理是dalvik虚拟机中的一个重要组件. 从概念上来说,内存管理的核心就是两个部分:分配内存和回收内存.Java语言 ...

最新文章

  1. Java线程同步机制synchronized关键字的理解
  2. 关于C语言运算符优先级的记忆技巧是什么?
  3. DHCP和DNS的概念—Vecloud微云
  4. 使用ganglia监控hadoop及hbase集群
  5. 干货|吴恩达Coursera课程教你学习神经网络二!
  6. CAutoupdater通用 自动升级组件用户手册
  7. springboot实现快速整合mybatis+mysql
  8. mysql查询配置变量
  9. python小爬虫,爬取文章(知乎专栏)片段
  10. html选择日期的组件,怎样实现一个datePicker(日期选择)组件
  11. antd使用g2plot统计图表(7)
  12. 破解压缩包、pdf、word 密码【Hashcat + john the ripper】
  13. 将视频作为网站背景html,将视频作为网页背景
  14. 2029年会实现通用人工智能吗?
  15. openjpeg:jpeg2000(j2k)图像内存压缩编码
  16. 制作U盘CDLinux使用奶瓶进行网络抓包
  17. Matlab/Simulink中PMSM模型的反电动势系数和转矩系数
  18. java开发必须安装jre吗_安装jdk后还需要安装jre吗
  19. iOS 8 Auto Layout界面自动布局约束
  20. 校内计算机技能考核,校内专业技能达标认证.PDF

热门文章

  1. CSS3知识点整理(三)----变形与动画
  2. shell (check return of each line)(PIPESTATUS[@])and sudoer
  3. 合并果子_tyvj1066_vijos1097_codevs1063_贪心+堆
  4. PHP程序员的技术成长规划(转载)
  5. Delphi2009下编译提示“无法找到“Excel_TLB”
  6. 7.串口操作之API篇 GetCommMask SetCommMask WaitCommEvent
  7. SQL Server 2008 R2 中不能删除复制(replication) 的解决方法
  8. Mustache 中的html转义问题处理
  9. [HAOI2007] 理想的正方形 (单调队列)
  10. SVN专题(Visual SVN Server + TortoiseSVN + Visual SVN)