Dalvik虚拟机用来分配对象的堆划分为两部分,一部分叫做Active Heap,另一部分叫做Zygote Heap。下面基于管理机制来介绍为何分配为这两部分,以及堆内存的管理。

  我们从Android系统启动说起。

  Android系统启动后,会有一个Zygote进程创建第一个Dalvik虚拟机,它只维护了一个堆。以后启动的所有应用程序进程是被Zygote进程fork出来的,并都持有一个自己的Dalvik虚拟机。在创建应用程序的过程中,Dalvik虚拟机采用COW策略复制Zygote进程的地址空间。

  COW策略:一开始的时候(未复制Zygote进程的地址空间的时候),应用程序进程和Zygote进程共享了同一个用来分配对象的堆。当Zygote进程或者应用程序进程对该堆进行写操作时,内核就会执行真正的拷贝操作,使得Zygote进程和应用程序进程分别拥有自己的一份拷贝,这就是所谓的COW。因为copy是十分耗时的,所以必须尽量避免copy或者尽量少的copy。

  为了实现这个目的,当创建第一个应用程序进程时,会将已经使用了的那部分堆内存划分为一部分,还没有使用的堆内存划分为另外一部分。前者就称为Zygote堆,后者就称为Active堆。这样只需把zygote堆中的内容复制给应用程序进程就可以了。以后无论是Zygote进程,还是应用程序进程,当它们需要分配对象的时候,都在Active堆上进行。这样就可以使得Zygote堆尽可能少地被执行写操作,因而就可以减少执行写时拷贝的操作。在Zygote堆里面分配的对象其实主要就是Zygote进程在启动过程中预加载的类、资源和对象了。这意味着这些预加载的类、资源和对象可以在Zygote进程和应用程序进程中做到长期共享。这样既能减少拷贝操作,还能减少对内存的需求。

  类似于JVM,Dalvik虚拟机也需要负责对堆内存中的对象进行管理工作,它使用的也是标记清除算法,但是细节上略有区别。

  Mark-Sweep算法分为两个阶段:

  • Mark阶段:通过递归对象的引用,从对象的根集开始标记被引用的对象。
  • Sweep阶段:回收没有被标记的对象占用的内存。

  Dalvik虚拟机通过Heap Bitmap来标记标记对象有没有被引用。所谓Heap Bitmap就是一个unsigned long数组,如果一个对象被引用,那么在Bitmap中与它对应的那一位就会被设置为1。否则的话,就设置为0。Dalvik使用了两个Bitmap来描述堆的对象,一个称为Live Bitmap,另一个称为Mark Bitmap。Live Bitmap用来标记上一次GC时被引用的对象,也就是没有被回收的对象,而Mark Bitmap用来标记当前GC有被引用的对象。这样只需要回收上一次被引用,当前未被引用的对象就可以了。

  在垃圾收集的Mark阶段,要求除了垃圾收集线程之外,其它的线程都停止(Stop The World),否则如果对象在GC过程中又引用了其他对象,就会可能导致不能正确地标记每一个对象。然而,这将造成程序卡顿,效率降低。所以必须允许在Mark阶段使垃圾回收线程和其他线程可以并发执行(Concurrent GC)。

为了实现此目的,Dalvik将Mark阶段划分为两步:

  •   第一步,只标记根集对象,即在GC过程开始的时刻,那些被全局变量,栈变量,寄存器对象引用的对象。这个阶段只允许GC线程运行,防止这些根集对象在这个过程中再去引用其他对象。
  •   第二步,通过这些根集对象引用关系,可以找到并标记其他正在使用的对象。这个阶段可以允许其他线程与GC线程并发执行。为了实现GC线程与其他线程并发,需要把其他线程对对象的修改记录下来,记录这些修改的数据结构被称为Card Table。

  Dalvik虚拟机进行部分垃圾收集时,实际上就是只收集在Active堆上分配的对象。因此对Dalvik虚拟机来说,Card Table就是用来记录在Zygote堆上分配的对象在部收垃圾收集执行过程中对在Active堆上分配的对象的引用。

  与Bitmap不同,Card Table中每个card大小为一个字节,如果与它对应的对象在第二步未被修改过,其值为clean,否则为dirty。对于被修改过的对象,在第二步结束后需要重新使用GC线程排他地对这些对象进行标记。由于这些对象不是很多所以这个过程很快,这也是分两步的原因。

转载于:https://www.cnblogs.com/cqumonk/p/4682699.html

Dalvik 堆内存管理与回收相关推荐

  1. Linux堆内存管理深入分析(上)

    Linux堆内存管理深入分析 (上半部) 作者:走位@阿里聚安全   0 前言 近年来,漏洞挖掘越来越火,各种漏洞挖掘.利用的分析文章层出不穷.从大方向来看,主要有基于栈溢出的漏洞利用和基于堆溢出的漏 ...

  2. Linux堆内存管理深入分析

    0 前言 近年来,漏洞挖掘越来越火,各种漏洞挖掘.利用的分析文章层出不穷.从大方向来看,主要有基于栈溢出的漏洞利用和基于堆溢出的漏洞利用两种.国内关于栈溢出的资料相对较多,这里就不累述了,但是关于堆溢 ...

  3. Linux堆内存管理深入分析 (上半部)【转】

    转自:http://www.cnblogs.com/alisecurity/p/5486458.html Linux堆内存管理深入分析 (上半部) 作者:走位@阿里聚安全 0 前言 近年来,漏洞挖掘越 ...

  4. linux堆内存管理

    堆内存的使用在linux开发过程中非常普遍,我们有必要了解相关的内存管理方便我们对内存问题的理解和定位. 堆内存结构层次 linux的堆内存管理分为三个层次,分别为分配区area.堆heap和内存块c ...

  5. 【Linux 内核 内存管理】Linux 内核堆内存管理 ① ( 堆内存管理 | 内存描述符 mm_struct 结构体 | mm_struct 结构体中的 start_brk、brk 成员 )

    文章目录 一.堆内存管理 二.内存描述符 mm_struct 结构体 三.mm_struct 结构体中的 start_brk.brk 成员 一.堆内存管理 Linux 操作系统中的 " 堆内 ...

  6. linux堆内存管理深入分析,【技术分享】Linux堆溢出之Fastbin Attack实例详解

    1. 摘要 在近几年各大CTF比赛中,看到有很多次pwn类别题中出现fastbin攻击的情况,例如今年的defcon,RCTF,胖哈勃杯,0CTF final等等 ,fastbin attack是堆漏 ...

  7. PHP内存管理 垃圾回收

    来源:http://www.jianshu.com/p/63a381a7f70c 概述 1) 操作系统直接管理着内存,所以操作系统也需要进行内存管理,计算机中通常都有内存管理单元(MMU) 用于处理C ...

  8. 容器java堆内存什么时候回收_JVM内存垃圾回收方法

    概要: why:为什么回收,见what what:垃圾回收哪些内存(不可达对象的确定) when:何时执行GC(安全点.安全区域) how:如何回收(原理--垃圾回收算法.实现--垃圾收集器) 1.垃 ...

  9. Java堆的管理--垃圾回收

    1  引言 Java的堆是一个运行时数据区,类的实例(对象)从中分配空间.Java虚拟机(JVM)的堆中储存着正在运行的应用程序所建立的所有对象,这些对象通过new.newarray.anewarra ...

最新文章

  1. mysql3.0数据库修复_mysql3.0监控mysql数据库
  2. CVPR‘22 最新106篇论文分方向整理|包含目标检测、动作识别、图像处理等32个方向
  3. 广数系统u盘支持什么格式_支持转换50+种三维软件格式还能减面还是免费的,什么工具这么强大?...
  4. 数据产品经理从零到一:数据产品能力模型构建
  5. BlockingQueue阻塞队列
  6. apache2 配置php,Windows配置PHP5与Apache2
  7. java索引ref_java – 如何使用jgit库将git HEAD指向特定的ref?
  8. 框架源码专题:Mybatis的一级缓存、二级缓存是什么?有什么作用?
  9. 汇编语言学习之汇编语言源程序的输入
  10. 拓端tecdat|R语言生存分析可视化分析
  11. 2017.5.20欢(bei)乐(ju)赛解题报告
  12. CMMI质量管理体系——软件测试缺陷管理
  13. python实现SGD(stochastic gradient descent)算法
  14. 网络调试助手连接mysql_网络调试助手模拟MQTT协议连接百度物联网并操作时序数据库...
  15. win7摄像头软件_电脑最好用录屏软件,一分钟下载安装
  16. ANC 调试 -FF 降噪原理和调试
  17. 50个表单功能,验证,安全和自定义化的jQuery插件
  18. 推荐一个特别好用的软件,简直就是懒人神器,强迫症的福音
  19. typescript 的认识3
  20. 计算机视觉期刊水平,计算机视觉和模式识别领域的SCI期刊菜鸡一枚,领域,识别,EditSprings,艾德思...

热门文章

  1. EL表达式---自定义函数(转)
  2. 【转】对路径**的访问被拒绝
  3. 我的LAMP实现过程——apache+php
  4. 《江南》、乌镇、《似水年华》
  5. x == (x = y) 不等于 (x = y) == x ?
  6. COCI 2018/2019 CONTEST #2 Solution
  7. Excel 使用VBA 使表格的值被修改后填充颜色标注
  8. EmailMessage类
  9. 准备-上机考试-华为
  10. oracle10g中获得可更新的(修改、增加等) ResultSet