dalvik虚拟内存管理之二——垃圾收集
转载自http://www.miui.com/thread-75028-1-1.html
垃圾收集是dalvik虚拟机内存管理的核心,垃圾收集的性能在很大程度上影响了一个Java程序内存使用的效率。顾名思义,垃圾收集就是收集垃圾内存加以回收。dalvik虚拟机使用常用的Mark-Sweep算法,该算法一般分Mark阶段(标记出活动对象),Sweep阶段(回收垃圾内存)和可选的Compact阶段(减少堆中的碎片)。dalvik虚拟机的实现不进行可选的Compact阶段。
1. Mark
垃圾收集的第一步是标记出活动对象,因为没有办法识别那些不可访问的对象(unreachable objects),因此我们只能标记出活动对象,这样所有未被标记的对象就是可以回收的垃圾。
1.1 根集合(RootSet)
当进行垃圾收集时,需要停止dalvik虚拟机的运行(当然,除了垃圾收集之外)。因此垃圾收集又被称作STW(stop-the-world,整个世界因我而停止)。dalvik虚拟机在运行过程中要维护一些状态信息,这些信息包括:每个线程所保存的寄存器,Java类中的静态字段,局部和全局的JNI引用,JVM中的所有函数调用会对应一个相应C的栈帧。每一个栈帧里可能包含对对象的引用,比如包含对象引用的局部变量和参数。
所有这些引用信息被加入到一个集合中,叫根集合。然后从根集合开始,递归的查找可以从根集合出发访问的对象。因此,Mark过程又被成为追踪,追踪所有可被访问的对象。如下图所示,假定从根集合{a}开始,我们可以访问的对象集合为{a, b, c, d},这样就追踪出所有可被访问的对象集合。
1.2 标记栈(MarkStack)
垃圾收集使用栈来保存根集合,然后对栈中的每一个元素,递归追踪所有可访问的对象,对于所有可访问的对象,在markBits位图中该将对象的内存起始地址对应的位设为1。这样当栈为空时,markBits位图就是所有可访问的对象集合。
2. Sweep
垃圾收集的第二步就是回收内存,在Mark阶段通过markBits位图我们可以得到所有可访问的对象集合,而liveBits位图表示所有已经分配的对象集合。因此通过比较这两个位图,liveBits位图和markBits位图的差异就是所有可回收的对象集合。Sweep阶段调用free来释放这些内存给堆。
3. Concurrent Mark(并发标记)
为了运行垃圾收集,需要停止虚拟机的运行,这可能会导致程序比较长时间的停顿。垃圾收集的主要工作位于Mark阶段,为了缩短停顿时间,dalvik虚拟机使用了Concurrent Mark技术。Concurrent Mark引入一个单独的gc线程,由该线程去跟踪自己的根集合中所有可访问的对象,同时所有其它的线程也在运行。这也是Concurrent一词的含义,但是为了回收内存,即运行Sweep阶段,必需停止虚拟机的运行。这会导入一个问题,即在gc线程mark对象的时候,其它线程的运行又引入了新的访问对象。因此在Sweep阶段,又重新运行mark阶段,但是在这个阶段对于已经mark的对象可以不用继续递归追踪了。这样从一定程度上降低了程序停顿时间。
dalvik虚拟内存管理之二——垃圾收集的更多相关文章
- 十问 Linux 虚拟内存管理 (glibc) (二)
版权声明:本文由陈福荣原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/184 来源:腾云阁 https://www.qclo ...
- OS之内存管理 --- 虚拟内存管理(二)
关于虚拟内存管理之前的请看:OS之内存管理 - 虚拟内存管理(一) 帧分配 每个进程对的最小帧数是由操作系统的体系结构决定的,但是最大帧数是由可用物理内存的数量决定的.所以在这之间,对于进程的帧的分配 ...
- dalvik虚拟内存管理之三——调试信息
转载自http://www.miui.com/thread-75063-1-1.html 1. verbosegc一般Java虚拟机要求支持verbosegc选项,输出详细的垃圾收集调试信息.dalv ...
- linux内核--内存管理(二)
一.进程与内存 所有进程(执行的程序)都必须占用一定数量的内存,它或是用来存放从磁盘载入的程序代码,或是存放取自用户输入的数据等等.不过进程对这些内存的管理方式因内存用途不一而不尽相同,有些内 ...
- SoC嵌入式软件架构设计II:没有MMU的CPU虚拟内存管理的设计和实现方法
大多数的程序代码是必要的时,它可以被加载到内存中运行.手术后,可直接丢弃或覆盖其它代码. 我们PC然在同一时间大量的应用,地址空间差点儿能够整个线性地址空间(除了部分留给操作系统或者预留它用).能够觉 ...
- SoC嵌入式软件架构设计II:否MMU的CPU虚拟内存管理的设计与实现方法
大多数的程序代码是必要的时,它可以被加载到内存中运行.手术后,可直接丢弃或覆盖其他代码.我们PC然在同一时间大量的应用,能够整个线性地址空间(除了部分留给操作系统或者预留它用),能够觉得每一个应用程序 ...
- java虚拟机学习-JVM内存管理:深入垃圾收集器与内存分配策略(4)
Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来. 概述: 说起垃圾收集(Garbage Collection,下文简称GC),大部分人都把这项 ...
- Linux内存管理(二)
Linux内存管理之二:Linux在X86上的虚拟内存管理 本文档来自网络,并稍有改动. 前言 Linux支持很多硬件运行平台,常用的有:Intel X86,Alpha,Sparc等.对于不能够通用的 ...
- Linux虚拟内存管理(glibc)
转:https://blog.csdn.net/tengxy_cloud/article/details/53067396 https://www.cnblogs.com/purpleraintear ...
随机推荐
- SqlServer2008快照隔离模式的业务应用
场景: 有200个检测点,每个检测点每天采集5个数据,对表的读写都是随机的(即有可能同时读写),总共有5年的数据. 存储方案A: 日期 点号 类型 值 20120101 001 A 1.0 20120 ...
- 如何在 Arch Linux 中安装 DNSCrypt 和 Unbound
DNSCrypt 是一个用于对 DNS 客户端和 DNS 解析器之间通信进行加密和验证的协议.它可以阻止 DNS 欺骗或中间人攻击. DNSCrypt 可用于大多数的操作系统,包括 Linux,Win ...
- Mongodb Management Studio
1.服务器管理功能添加服务器,删除服务器 2.服务器,数据库,表,列,索引,树形显示和状态信息查看 3.查询分析器功能.支持select,insert,Delete,update支持自定义分页函数 $ ...
- JavaScript 字符串和日期内容整理
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- appjs desktop
/* author: daimajia name: appjs Express example email: daimajia@gmail.com any qu ...
- node cheerio
所谓工欲善其事,必先利其器,所以通读了cheerio的API,顺便翻译了一遍,有些地方因为知道的比较少,不知道什么意思,保留了英文,希望各位不吝告诉我,然后一起把这个翻译完成. ###cheerio ...
- JS获取上传文件的名称、格式、大小
<input id="File1" type="file" onchange="checkFile(this)" /> 方式一) ...
- ODI 12c中使用Groovy脚本创建工程
本文主要介绍在ODI中使用groovy创建工程,并添加一个表转换的映射.要创建groovy脚本,可以从ODI Studio的菜单:工具->Groovy->新脚本 打开一个编辑窗口.在执行下 ...
- FSMC stm32
1.FSMC机制 FSMC(Flexihie Static Memory Controller,可变静态存储控制器)是STM32系列中内部集成256 KB以上FlaSh,后缀为xC.xD和xE的高存储 ...
- 2016-1-6第一个完整APP 私人通讯录的实现 2:增加提示用户的提示框,监听文本框
一:在登录时弹出提示用户的提示框: 1.使用第三方框架. 2.在登陆按钮点击事件中增加如下代码: - (IBAction)loginBtnClicked { NSString *acount = se ...