dalvik虚拟内存管理之二—:垃圾收集
来源:互联网 发布:开放式网络桥架 编辑:程序博客网 时间:2024/06/06 19:10
dalvik虚拟内存管理之二—:垃圾收集
摘要: 垃圾收集是dalvik虚拟机内存管理的核心,垃圾收集的性能在很大程度上影响了一个Java程序内存使用的效率。顾名思义,垃圾收集就是收集垃圾内存加以回收。dalvik虚拟机使用常用的Mark-Sweep算法,该算法一般分Mark阶段 ...
垃圾收集是dalvik虚拟机内存管理的核心,垃圾收集的性能在很大程度上影响了一个Java程序内存使用的效率。顾名思义,垃圾收集就是收集垃圾内存加以回收。dalvik虚拟机使用常用的Mark-Sweep算法,该算法一般分Mark阶段(标记出活动对象),Sweep阶段(回收垃圾内存)和可选的Compact阶段(减少堆中的碎片)。dalvik虚拟机的实现不进行可选的Compact阶段。
1. Mark
垃圾收集的第一步是标记出活动对象,因为没有办法识别那些不可访问的对象(unreachableobjects),因此我们只能标记出活动对象,这样所有未被标记的对象就是可以回收的垃圾。
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虚拟机使用了concurrentmark技术。Concurrentmark引入一个单独的gc线程,由该线程去跟踪自己的根集合中所有可访问的对象,同时所有其它的线程也在运行。这也是concurrent一词的含义,但是为了回收内存,即运行Sweep阶段,必需停止虚拟机的运行。这会导入一个问题,即在gc线程mark对象的时候,其它线程的运行又引入了新的访问对象。因此在Sweep阶段,又重新运行mark阶段,但是在这个阶段对于已经mark的对象可以不用继续递归追踪了。这样从一定程度上降低了程序停顿时间。
1. Mark
垃圾收集的第一步是标记出活动对象,因为没有办法识别那些不可访问的对象(unreachableobjects),因此我们只能标记出活动对象,这样所有未被标记的对象就是可以回收的垃圾。
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虚拟机使用了concurrentmark技术。Concurrentmark引入一个单独的gc线程,由该线程去跟踪自己的根集合中所有可访问的对象,同时所有其它的线程也在运行。这也是concurrent一词的含义,但是为了回收内存,即运行Sweep阶段,必需停止虚拟机的运行。这会导入一个问题,即在gc线程mark对象的时候,其它线程的运行又引入了新的访问对象。因此在Sweep阶段,又重新运行mark阶段,但是在这个阶段对于已经mark的对象可以不用继续递归追踪了。这样从一定程度上降低了程序停顿时间。
0 0
- dalvik虚拟内存管理之二—:垃圾收集
- dalvik虚拟内存管理之三——调试信息
- JVM垃圾收集 & Dalvik垃圾收集资料
- Dalvik虚拟机垃圾收集机制
- Dalvik虚拟机的垃圾收集机制
- Dalvik虚拟机垃圾收集机制简要介绍
- Dalvik 虚拟机的垃圾收集简介
- 操作系统之内存管理(二)之虚拟内存管理(引入虚拟内存之后)
- 垃圾收集器(二)
- 4、垃圾收集之垃圾收集算法
- 深入理解JVM之二:垃圾收集器概述
- 深入理解JVM之二:垃圾收集器概述
- 深入理解JVM之二:垃圾收集器概述
- JVM之垃圾收集
- jvm内存管理-垃圾收集
- Dalvik虚拟机垃圾收集机制简要介绍和学习计划
- Dalvik虚拟机垃圾收集机制简要介绍和学习计划
- Dalvik虚拟机垃圾收集(GC)过程分析
- UILabel改变字体行间距
- web前端开发分享-目录
- 个性化推荐系统技术总结
- android中给TextView设置属性ellipsize, 过长自动隐藏 或 跑马灯效果
- Python正则表达式指南
- dalvik虚拟内存管理之二—:垃圾收集
- 百度地图开发学习网址
- Vision引擎中效果图形-投射贴花
- 10个Java编码中微妙的最佳实践
- 迈瑞综合应用及流程管理平台项目
- JFinal logoJAVA 极速WEB+ORM框架 JFinal
- linux操作中用到的命令
- 有关内存泄漏的查找解决思路方法
- 交换机链路聚合在网络中的作用