什么是GC 标记-压缩算法

需要对标记清除和GC复制算法有一定了解

GC标记-压缩算法是由标记阶段压缩阶段构成。

标记阶段和标记清除的标记阶段完全一样。之后我们要通过搜索数次堆来进行压缩。

Lisp2 算法的对象

Donald E.Knuth

对象结构如图示:

Lisp2 算法在对象头中为forwarding指针留出空间,forwarding指针表示对象的目标地点。(设定forwarding时,还不存在移动完毕的对象)

概要

假设我们在下图所示的状态下执行GC

标记完后状态如下(过程与标记清除算法相同)

压缩完后的状态如下(可以看到,他们现在的位置是挨着的。)

这种算法并不会对对象的顺序产生影响,知识缩小了他们之间的空隙,让他们聚集在堆的一端。

步骤

压缩阶段代码

compaction_phase(){
set_forwarding_ptr() // 设置forwarding指针
adjust_ptr() // 更新指针
move_obj() // 移动对象
}

步骤一:设定forwarding指针

首先程序会搜索整个堆,给活动的对象设定forwarding指针。初始状态下forwarding是NULL。

set_fowarding_ptr(){
scan = new_address = $heap_start
while(scan < $heap_end)
if(scan.mark = TRUE)
scan.forwarding = new_address
new_address += scan.size
scan += scan.size
}
  • scan 用来搜索堆中的指针,new_address指向目标地点的指针。
  • 一旦scan找到活动对象,forwarding指针就要被更新。按着new_address对象的长度移动。
  • 如下图示:

步骤二:更新指针

adjust_ptr(){
for(r :$roots) // 更新根对象的指针
*r = (*r).forwarding scan = $heap_start
while(scan < $heap_end)
if(scan.mark == TRUE)
for(child :children(scan)) // 通过scan 更新其他对象指针
*child = (*child).forwarding
scan += scan.size
}
  • 首先更新根的指针
  • 然后重写所有活动对象的指针(对堆进行第二次的搜索)

步骤三:移动对象

搜索整个堆(第三次搜索),再将对象移动到forwarding指针的引用处。

move_obj(){
scan = $free = $heap_start
while(scan < $heap_end)
if(scan.mark == TRUE) // 判断是否是活动对象
new_address = scan.forwarding // 获取对象要移动的地点
copy_data(new_address, scan, scan.size) // 复制对象(移动对象)
new_address.forwarding = NULL // 将forwarding改为NULL
new_address.mark = FALSE // mark改为FALSE
$free += new_address.size // 指针后移
scan += scan.size // 指针后移
}

  • 算法不会对对象本身的顺序进行改变,只会把对象集中在堆的一端。
  • 算法没有去删除对象,知识吧对象的mark设置为FALSE
  • 之后把forwarding改为NULL,标志位改为FALSE,将$free移动obj.size个长度。

优缺点

优点:可有效利用堆

使用整个堆在进行垃圾回收,没啥说的。任何的算法都是有得有失,用时间换空间。或者用空间换时间。重要的是它在这里

适不适用。

缺点:压缩花费计算成本

Lisp2 算法中,对堆进行了3次搜索。在搜索时间与堆大小成正相关的状态下,三次搜索花费的时间是很恐怖。也就是说,它的吞吐量要低于其他算法。时间成本至少是标记清除的三倍(当然不包含mutator)

Mark Compact GC (Part one: Lisp2)的更多相关文章

  1. Mark Compact GC (Part two :Two-Finger)

    目录 Two-Finger算法 前提 概要 步骤一:移动对象 步骤二:更新指针 优缺点 表格算法 概要 步骤一:移动对象群 和 构筑间隙表格 移动对象群 构筑间隙表格 步骤二:更新指针 优缺点 Two ...

  2. Mark Sweep GC

    目录 标记清除算法 标记阶段 深度优先于广度优先 清除阶段 分配 First-fit.Best-fit.Worst-fit三种分配策略 合并 优点 实现简单 与保守式GC算法兼容 缺点 碎片化 分配速 ...

  3. 1. GC标记-清除算法(Mark Sweep GC)

    世界上第一个GC算法,由 JohnMcCarthy 在1960年发布. 标记-清除算法由标记阶段和清除阶段构成. 标记阶段就是把所有的活动对象都做上标记的阶段. 标记阶段就是"遍历对象并标记 ...

  4. Gson序列化问题导致的内存溢出,tip:Background sticky concurrent mark sweep GC freed

    问题原因,如果在json model里面放了非可序列化的对象就会导致这中问题,可序列化的就是那些基础数据类型和集合类型,如果在里面放个Android的Activity或者adapter这类类型字段,变 ...

  5. copy GC 和 mark & compaction GC的算法异同

    先标记 然后 copy GC是,对所有child,判断, 如果child没有被访问过,那么拷贝到新地址,child的forwording指向新地址,child标记为已访问,把自己对child的引用改为 ...

  6. Java中9种常见的CMS GC问题分析与解决

    1. 写在前面 | 本文主要针对 Hotspot VM 中"CMS + ParNew"组合的一些使用场景进行总结.重点通过部分源码对根因进行分析以及对排查方法进行总结,排查过程会省 ...

  7. GC学习笔记

    GC学习笔记 这是我公司同事的GC学习笔记,写得蛮详细的,由浅入深,循序渐进,让人一看就懂,特转到这里. 一.GC特性以及各种GC的选择 1.垃圾回收器的特性 2.对垃圾回收器的选择 2.1 连续 V ...

  8. 非常详细GC学习笔记

    转载:http://blog.csdn.net/fenglibing/article/details/6321453 这是我公司同事的GC学习笔记,写得蛮详细的,由浅入深,循序渐进,让人一看就懂,特转 ...

  9. 很具体GC学习笔记

    GC学习笔记 这是我公司同事的GC学习笔记,写得蛮具体的,由浅入深,循序渐进,让人一看就懂,特转到这里. 一.GC特性以及各种GC的选择 1.垃圾回收器的特性 2.对垃圾回收器的选择 2.1 连续 V ...

随机推荐

  1. cocos2d_x_01_环境搭建

    终于效果图: Cocos2d-x-3.3 Mac 安装 下载地址: 參考文档:  在线API列表:  Cocos2d-x-3.3 版本号 从配置安装到创建项目都是命令行 官网下载最新版本号Cocos2 ...

  2. Linux下安装过程中编译PHP时报错:configure: error: libjpeg.(a|so) not found

    在Linux下安装PHP过程中,编译时出现configure: error: libjpeg.(a|so) not found 错误的解决的方法: 检查之后发现已经安装libjpeg.可是/usr/l ...

  3. Android笔记——Activity中的数据传递案例(用户注冊)

    1.创建程序activity_main: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/andro ...

  4. 使用深度学习检测DGA(域名生成算法)——LSTM的输入数据本质上还是词袋模型

    from:http://www.freebuf.com/articles/network/139697.html DGA(域名生成算法)是一种利用随机字符来生成C&C域名,从而逃避域名黑名单检 ...

  5. 集合TreeSet的使用

    集合中的TreeSet是集合体系结构中的底层实现,是Collection的孙子,Set的儿子.TreeSet除拥有父接口的特点外,还有其自身的特点.下面就看看TreeSet的排序是怎么实现的.从它的构 ...

  6. PHP+MySQL登录注册,完整版,详细注释

    纯手写打造. 下载地址:http://download.csdn.net/detail/qq_33599520/9779970 项目结构: 下面是代码: <!DOCTYPE html> & ...

  7. PostgreSQL Replication之第九章 与pgpool一起工作(1)

    在前面的章节中,我们已经能够深入地理解了pgbouncer,同时也学会了如何使用它来尽可能地优化复制设置.在本章我们将了解一个经常被称作与pgbouncer相对应的工具.尽管pgpool的思想与pgb ...

  8. FlatternMap和Map的区别

    flattenMap使用步骤:     1.传入一个block,block类型是返回值RACStream,参数value     2.参数value就是源信号的内容,拿到源信号的内容做处理     3 ...

  9. ReactiveCocoa 中 RACSignal 所有变换操作底层实现分析(上)

    前言 在上篇文章中,详细分析了RACSignal是创建和订阅的详细过程.看到底层源码实现后,就能发现,ReactiveCocoa这个FRP的库,实现响应式(RP)是用Block闭包来实现的,而并不是用 ...

  10. bzoj 2259: [Oibh]新型计算机 最短路 建模

    Code: #include<cstdio> #include<cstring> #include<algorithm> #include<queue> ...