垃圾回收器之标记擦除法
这一次我们来简单的了解一下标记擦除法(mark-and-sweep),标记擦除法是第一个被广泛使用的,并且可以解决循环引用问题的垃圾回收算法;
使用标记擦除法的时候,垃圾对象并不能立即被回收,相反垃圾的回收是等到内存不够使用的时候才触发;这个时候程序的执行流程将被暂时的休眠,一旦所有的垃圾回收后,才会唤醒正常的程序执行流程。
标记擦除法又被称为跟踪垃圾的回收器算法,因为它跟踪所有可以直接或者间接被程序访问的对象集合;这些可以被程序直接访问的对象,有局部变量和静态变量。在回收器中,这些变量被称为根对象。一个被其他对象字段引用的对象称为可被间接访问的对象。所以可以正常访问的对象,我们称为存活对象,否则就是垃圾。
标记擦除算法包括两个阶段,在第一个节点它首先找到所有的可访问对象并进行标记,这个阶段被叫做标记阶段;第二个阶段就是扫描堆栈上的所有未标记的对象,并进行回收内存操作,这个阶段被叫做擦除节点。
为了区别垃圾对象和正常对象,我们需要记录每个对象的状态;所以我们可以给每个对象添加一个布尔类型的字段marked。默认情况下,所有对象刚被创建的时候都是没有被标记的,因此字段marked的初始值为false;
标记给定的对象p以及所有可以通过p间接访问的对象,我们可以通过类似以下Mark的方法实现:
Void Mark(object 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
因为标记擦除法通过根对象跟踪所有的可访问对象,所以即使在循环引用的情况下也能正确的识别和回收垃圾对象。这个是其相对计数法的最大优势。
然而其劣势就是执行算法的时候,需要休眠中断程序的正常执行流程,特别是需要人机交互、需要满足苛刻的实时执行要求的系统。
另外一个问题就是内存碎片问题。其往往发生在已经运行过数次垃圾回收器的长时间运行的系统中。其具体的体现就是正常的对象被很多没有使用的小内存碎片隔离,其可能会导致可用内存满足所申请的内存,但是由于这些内存并不连续,导致不能正常分配内存的问题。
分享到:
相关推荐
垃圾收集器采用计数法或标记法来查找需要清除的对象。计数法由于无法检测循环引用的对象,现在已经很少采用了。重点谈一下标记法。Flex 应用的对象在内存中被映射成树形结构。这很好理解,每个 Flex 应用总有一个 ...
3.2 Minor GC、Major GC、Full GC区别及触发条件4 如何判断对象是否存活4.1 引用计数法4.4.2 可达性分析法5 垃圾回收机制策略(也称为GC的算法)5.1 引用计数算法(Reference counting)5.2 标记–清除算法(Mark-...
聊一聊 JVM 中的垃圾回收算法? 标记-清除算法 标记-复制算法 标记-整理算法 什么是记忆集,什么是卡表?记忆集和卡表有什么关系? 什么是卡页? 什么是写屏障?写屏障带来的问题? 什么是三色标记法?三色标记法会...
2:垃圾回收:垃圾确定【引用计数法、可达性分析】+垃圾收集算法【标记-清除、标记整理、复制】+垃圾收集器【Serial+PareNew+Serial Old+Paralles Old+CMS+G1】 3:JVM内存调优:JVM参数【标准参数、-X参数、-XX参数等...
* [24 Python垃圾回收机制](#24-python垃圾回收机制) * [1 引⽤计数](#1-引⽤计数) * [2 标记-清除机制](#2-标记-清除机制) * [3 分代技术](#3-分代技术) * [25 Python的List](#25-python的list) * [26 Python...
文章目录内存回收引用计数法可达性分析浅谈引用强引用软引用弱引用虚引用方法区GC 算法标记-清除算法(Mark-Sweep)复制算法(Copying)标记-整理算法(Mark-Compact)GC算法综合用年轻代老年代永久代枚举根节点安全...
- 聊一聊 JVM 中的垃圾回收算法? - 标记-清除算法 - 标记-复制算法 - 标记-整理算法 - 什么是记忆集,什么是卡表?记忆集和卡表有什么关系? - 什么是卡页? - 什么是写屏障?写屏障带来的问题? - 什么是...
JVM 知识点整理:GC垃圾收集器判断哪些对象需要回收引用计数器算法可达性分析算法引用还有分类(了解)“缓刑” finalize(了解)开始垃圾收集标记 – 清除算法复制算法标记 – 整理算法分代收集算法HotSpot 算法...
第2章 简单的C++垃圾回收器 5 2.1 两种内存管理方法的比较 5 2.1.1 手工内存管理的优缺点 6 2.1.2 垃圾回收的优缺点 6 2.1.3 两种方法都可以使用 7 2.2 在C++中创建垃圾回收器 7 2.3 选择垃圾回收的算法 8 2.3.1 ...
A、对话框 B、剪切板 C、资源管理器或我的电脑 D、控制面板 6. 李铧有一张中国的地理图片要寄给他美国的朋友,请选择最经济快捷的办法( )。 ( C ) A、用美国的联邦快递B、发传真 C、扫描进电脑,发E-Mail D、挂号...
6.10 保留对被绑定方法的引用且支持垃圾回收 243 6.11 缓存环的实现 245 6.12 检查一个实例的状态变化 249 6.13 检查一个对象是否包含某种必要的属性 252 6.14 实现状态设计模式 255 6.15 实现单例模式 257 ...
14.1 C#的继承机制.155 <<page 3>> page begin==================== 14.2 多 态 性 .159 14.3 抽象与密封 .163 14.4 继承中关于属性的一些问题.169 14.5 小 结 .172 第四部分 深入了解 C#.174 第十...
垃圾回收与算法 .................................................................................................................................. 26 2.4.2. 2.4.3. 2.4.4. 2.4.5. 2.4.5.1. 2.4.5.2. ...
垃圾回收与算法 .................................................................................................................................. 26 2.4.2. 2.4.3. 2.4.4. 2.4.5. 2.4.5.1. 2.4.5.2. ...
1.4.2 改进型匈牙利表示法 ............ 13 1.4.3 代码编辑器 ............................ 14 1.5 使用帮助系统 ............................ 17 1.6 小结 ............................................ ...