MIUI论坛 下载APP

MIUI开发组

Rank: 8Rank: 8

积分
2652
机型
未知设备
签到次数
45
MIUI版本
V10.2.10.0.PFGCNXM
私信

dalvik虚拟内存管理之二——垃圾收集

[复制链接]
14547 71 |
2011-4-13 19:59 | 来自PC
| |
|
跳转
本帖最后由 anderson 于 2011-4-13 20:54 编辑

垃圾收集是dalvik虚拟机内存管理的核心,垃圾收集的性能在很大程度上影响了一个Java程序内存使用的效率。顾名思义,垃圾收集就是收集垃圾内存加以回收。dalvik虚拟机使用常用的Mark-Sweep算法,该算法一般分Mark阶段(标记出活动对象),Sweep阶段(回收垃圾内存)和可选的Compact阶段(减少堆中的碎片)。dalvik虚拟机的实现不进行可选的Compact阶段。
1. Mark
垃圾收集的第一步是标记出活动对象,因为没有办法识别那些不可访问的对象
(unreachableobjects),因此我们只能标记出活动对象,这样所有未被标记的对象就是可以回收的垃圾。

1.1 根集合(RootSet)

当进行垃圾收集时,需要停止dalvik虚拟机的运行(当然,除了垃圾收集之外)。因此垃圾收集又被称作STWstop-the-world,整个世界因我而停止)。dalvik虚拟机在运行过程中要维护一些状态信息,这些信息包括:每个线程所保存的寄存器,Java类中的静态字段,局部和全局的JNI引用,JVM中的所有函数调用会对应一个相应C的栈帧。每一个栈帧里可能包含对对象的引用,比如包含对象引用的局部变量和参数。

所有这些引用信息被加入到一个集合中,叫根集合。然后从根集合开始,递归的查找可以从根集合出发访问的对象。因此,Mark过程又被成为追踪,追踪所有可被访问的对象。如下图所示,假定从根集合{a}开始,我们可以访问的对象集合为{a,b, c, d},这样就追踪出所有可被访问的对象集合。
mark.jpg


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的对象可以不用继续递归追踪了。这样从一定程度上降低了程序停顿时间。
        
收藏11 分享  

MIUI开发组

Rank: 8Rank: 8

积分
5153
机型
小米手机1/1S
签到次数
1
MIUI版本
1
私信

1000万用户纪念勋章

2011-4-13 21:26 | 来自PC
|
支持楼主  我是来学习的:lol
个人微薄http://weibo.com/u/1851853010

玩机大师

Rank: 4

积分
1207
机型
Nexus S
签到次数
38
MIUI版本
1
私信
2011-4-13 22:29 | 来自PC
|
……………………

玩机狂人

Rank: 3Rank: 3

积分
341
机型
HTC Desire
签到次数
1
MIUI版本
1
私信
2011-4-14 17:36 | 来自PC
|
学习ing   -_-

玩机之王

Rank: 5Rank: 5

积分
2025
机型
HTC Desire
签到次数
29
MIUI版本
1
私信
2011-4-14 17:40 | 来自PC
|
学习了。。。。。

玩机之王

Rank: 5Rank: 5

积分
4264
机型
未知设备
签到次数
60
MIUI版本
7.9.7
私信

MIUI七周年

2011-4-14 17:42 | 来自PC
|
受教了  感谢
"既不回头,何必不忘
既然无缘,何需誓言
今日种种,似水无痕
明夕何夕,君已陌路"

玩机狂人

Rank: 3Rank: 3

积分
414
机型
HTC Desire
签到次数
5
MIUI版本
1
私信
2011-4-14 17:45 | 来自PC
|
回复 anderson 的帖子

路过……再看一遍,没看懂

玩机之皇

Rank: 6Rank: 6

积分
7882
机型
未知设备
签到次数
277
MIUI版本
8.11.15
私信

小爱同学两周年点赞金米兔勋章MIUI 10专属勋章2018新年勋章MIUI七夕鹊桥勋章MIUI七周年MIUI 9纪念勋章初音勋章小火箭勋章关注腾讯微博关注新浪微博MIUI 100周发烧友俱乐部小米手机元器件合体活动勋章

2011-4-14 17:47 | 来自PC
|
水平有限,没看懂,进来拜服下

MIUI开发组

Rank: 8Rank: 8

积分
3306
机型
未知设备
签到次数
15
MIUI版本
V10.3.4.0.PEHCNXM
私信

1000万用户纪念勋章

2011-4-14 18:49 | 来自PC
|
顶了,再看!

玩机狂人

Rank: 3Rank: 3

积分
320
机型
中兴红牛
签到次数
13
MIUI版本
1
私信

关注腾讯微博

2011-4-14 19:11 | 来自PC
|
没看懂!
快速回复 返回顶部 返回列表