东坡网 - 更多系统软件下载,请关注东坡网:www.dongpow.com

当前位置:首页 > 系统教程 > Linux教程 > 详细页面

Linux系统Dalvik堆内存的管理与回收介绍(2)

时间:2017-08-17来源:东坡网作者:zhijie

  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线程排他地对这些对象进行标记。由于这些对象不是很多所以这个过程很快,这也是分两步的原因。

  以上就是Linux系统Dalvik堆内存的管理与回收的全部内容了,所以Linux系统不仅可以把Dalvik当做一个虚拟机,还能把Dalvik作为有效的优化工具。

12 下一页
分享到:

相关信息

  • Linux如何通过netstat命令查看80端口连接数

    Linux系统下netstat命令的用法有很多,能够列出所有端口,显示当前UDP连接状况,今天小编要给大家介绍的是Linux使用netstat命令查看80端口连接数的方法,不了解的朋友可以来学习下。...

    2023-03-16

  • Linux启动sshd服务报错could not load host怎么办?

    Linux在启动sshd服务的时候,出现错误提示,提示Could not load host key:/etc/ssh/ssh_ed25519_key,这段错误代码是什么意思呢?遇到该错误代码该如何解决问题呢?随小编一起来学习下吧。...

    2023-03-16

系统教程栏目

栏目热门教程

人气教程排行

站长推荐

热门系统下载

公众号