博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
垃圾回收器之标记擦除法
阅读量:6081 次
发布时间:2019-06-20

本文共 1361 字,大约阅读时间需要 4 分钟。

垃圾回收器之标记擦除法

 

         这一次我们来简单的了解一下标记擦除法(mark-and-sweep),标记擦除法是第一个被广泛使用的,并且可以解决循环引用问题的垃圾回收算法;

         使用标记擦除法的时候,垃圾对象并不能立即被回收,相反垃圾的回收是等到内存不够使用的时候才触发;这个时候程序的执行流程将被暂时的休眠,一旦所有的垃圾回收后,才会唤醒正常的程序执行流程。

         标记擦除法又被称为跟踪垃圾的回收器算法,因为它跟踪所有可以直接或者间接被程序访问的对象集合;这些可以被程序直接访问的对象,有局部变量和静态变量。在回收器中,这些变量被称为根对象。一个被其他对象字段引用的对象称为可被间接访问的对象。所以可以正常访问的对象,我们称为存活对象,否则就是垃圾。

         标记擦除算法包括两个阶段,在第一个节点它首先找到所有的可访问对象并进行标记,这个阶段被叫做标记阶段;第二个阶段就是扫描堆栈上的所有未标记的对象,并进行回收内存操作,这个阶段被叫做擦除节点。

         为了区别垃圾对象和正常对象,我们需要记录每个对象的状态;所以我们可以给每个对象添加一个布尔类型的字段marked。默认情况下,所有对象刚被创建的时候都是没有被标记的,因此字段marked的初始值为false

         标记给定的对象p以及所有可以通过p间接访问的对象,我们可以通过类似以下Mark的方法实现:

         Void Markobject p

         {

                   If(!p.marked)

                   {

                            p.marked = true;                       

For each object q referenced by p

Mark(q);

}

}

         我们可以注意到,在这个标记的阶段,当我们遇到已经被标记的对象什么都没有做。因此,可以保证算法可以正常结束,并且只有标记了所有可访问对象后才结束。

         在第二个阶段,本算法会扫描所有的堆上的对象,来定位所有的未标记对象。在扫描的过程中,这些未标记的对象所占的内存被回收,同时每一个正常的对象的marked字段被重置为false,以便为下一次的回收做准备。

void Sweep()

{

         for each object p in the heap

                   if (p.marked)

                            p.marked = false

                   else

                            heap.Release(p);

}

整个算法的实现过程可以使用下图表示

回收算法开始之前的状态

        

经过标记阶段后的状态,所有可访问对象都已经被标记

 

经过擦除阶段后的状态,仅仅剩下正常的活动对象,并且将其marked字段重置为false

 

 

因为标记擦除法通过根对象跟踪所有的可访问对象,所以即使在循环引用的情况下也能正确的识别和回收垃圾对象。这个是其相对计数法的最大优势。

然而其劣势就是执行算法的时候,需要休眠中断程序的正常执行流程,特别是需要人机交互、需要满足苛刻的实时执行要求的系统。

另外一个问题就是内存碎片问题。其往往发生在已经运行过数次垃圾回收器的长时间运行的系统中。其具体的体现就是正常的对象被很多没有使用的小内存碎片隔离,其可能会导致可用内存满足所申请的内存,但是由于这些内存并不连续,导致不能正常分配内存的问题。

转载于:https://www.cnblogs.com/wufengtinghai/archive/2012/05/04/2482079.html

你可能感兴趣的文章
Android控件GridView之仿支付宝钱包首页带有分割线的GridView九宫格的完美实现
查看>>
如何制作一款HTML5 RPG游戏引擎——第一篇,地图类的实现
查看>>
Android 之使用LocalBroadcastManager解决BroadcastReceiver安全问题
查看>>
破解物联网落地困境-阿里云硬件接入最佳实践
查看>>
POJ 2503 字符串(两种方法)
查看>>
ArcGIS API for Flex 调用天地图、e都市瓦片地图
查看>>
【Yaml】Yaml学习笔记
查看>>
Mockito教程
查看>>
筛选并保留最后一次记录(如筛选最后一次缴纳电费的记录 )
查看>>
亚马逊开源 Neo-AI 框架,可优化 AI 模型提升部署速度
查看>>
新网盘时代,私有云斐讯天天链N1开启智能家居新生活!
查看>>
《西游伏妖篇》明星全阵容曝光 相约大年初一
查看>>
有一种手机能让你一见钟情,华为P20 Pro亮黑色图赏
查看>>
京东商城CEO徐雷年会演讲:我们抗住风霜 业务基本面良好
查看>>
德国飞往意大利民航客机机翼撕裂 途中乘客发现裂痕
查看>>
菜鸟保税仓成全球商家进中国首选 秒级通关领先全球
查看>>
退休延迟致新老职员共事 澳大利亚管理者面临挑战
查看>>
适当时公布?新西兰会否重启父母团聚移民引关注
查看>>
春运中的“洋导游”
查看>>
探访高铁“火花侠”驾驶火龙专列 脚下钢花飞溅
查看>>