「这是我参与11月更文挑战的第10天,活动详情查看:2021最后一次更文挑战」
什么是标记清除算法?
标记清除算法是一种直接的全面停顿算法。简单的说,它们找出所有不可达的对象,并将它们放入空闲列表Free。
标记清除算法的运行过程
清扫过程将分为标记阶段和清扫阶段。
- 标记阶段
- 遍历所有对象找标记活动对象
- 清扫阶段 遍历所有对象清除没有标记对象,同时他会清除第一阶段所作的标记,便于之后可以进行正常的工作,
图示
如图所示,在我们 global
中使用,我们会递归下面的属性,并为可达对象添加一下对应的标记,而a1
和b1
并没有在global
中使用,就会在下一轮中被清除掉
标记清除算法优缺点
优点
正所谓人无完人,算法也是如此没有算法是百分之百完美的,有优有劣,但是人都是比较出来的嘛!相对于引用计算算法,他有一个非常非常的大的优势就是它可以回收互相引用的对象值。哈哈哈哈哈哈!
缺点
如图所示,我们模拟内存的存储情况,红色区域是我们的可达对象,在可达对象有两个无法达到的区域,这种情况下,在进行清除操作的时候,左右两个会被清除,并将空间放入空闲空间,之后内容进入的时候再分配给该对象。
空间碎片化 这种方式清理出来的内存是不连续的,产生内存碎片,需要维护一个空闲列表,像我们只有回收虽然是回收了3个节点,但是因为不联系的关系空间的使用并不正常完美
总而言之
- 效率不高
- 在进行GC的时候,需要停止整个应用程序,导致用户体验差
- 这种方式清理出来的内存是不连续的,产生内存碎片,需要维护一个空闲列表;