基本算法

  • 标记-清除算法由 ==标记阶段== 和 ==清除阶段== 构成。
  • 标记即将所有活动的对象打上标记。
  • 清除即将那些没有标记的对象进行回收。

标记与清除

  • 遍历GC root引用,递归标记(设置对象头中的标志位)对象。
  • 标记时如果标志位表示已经标记过则可以跳过。
  • 遍历对象有深度优先与广度优先两种算法,其搜索的步骤数一致,而深度优先的内存使用量更小,因此一般使用深度优先。
  • 清除阶段将再次遍历堆,未标记的对象加入到空闲链表中,标记的对象则去除标记。

分配与合并

  • 分配指mutator(Application)申请分块时获取内存块的过程。
  • 分配即通过搜索空闲链表,找到一个大小合适的块。分配测量有如下:
    • First-fit,找到第一个大于要求大小的块即返回。
    • Best-fit,找到比要求大小大的最小块。
    • Worst-fit,找出最大的块将其分割成要求大小块和剩余的,一般不使用(容易产生碎片)
  • 对于内存中连续的垃圾可以对其进行合并,减少碎片。

优缺点

优点

  1. 算法实现简单。
  2. 与保守式GC算法兼容(对象不能被移动)。

缺点

  1. 碎片化。
  2. 分配速度慢,每次分配需要遍历空闲链表。
  3. 与写时复制(copy-on-write)冲突,因为做GC时需要将对象头进行标记,这将导致大量的数据发生复制。
  4. STW(Stop-The-World)长,两个阶段均要遍历整个堆。

改进

多个空闲链表

针对分配速度慢

  • 根据块的大小建立不同的空闲链表,相同大小的块链接到相同链表中。
  • 由于对于大块的申请比较少,因此主要针对小块建立链表,对于大块的可以都在同一个链表中,如大于2-100的分别建立各自大小的链表而大于100的都写入一个大块链表。

BiBOP

针对碎片化

  • 原理:将大小相近的对象整理成固定大小的块进行管理。
  • 把堆分割成固定大小的块,让每个块只能配置同样大小的对象。
  • 但是并不能很好的消除碎片化,如果对堆的分隔没控制好反而可能导致堆的利用率。

位图标记

针对写时复制

  • 由于GC过程需要修改对象中属性导致写时复制不兼容,因此指收集各个对象的标志位并表格化。
  • 将堆中的对象与位图对应上,而后通过位图的标志代表堆中对象的标志。
  • 优点:
    • 兼容写时复制
    • 清除阶段可以快速的去除标记。

延迟清除法

针对STW过长

  • 延迟清除法(Lazy-Sweep)是缩减清除操作而导致的mutator STW的方法。
  • 标记结束后不做清除操作而是在分配操作中进行。
  • 在分配时,从上次遍历结束的地方开始使用First-fit查找块,如果找不到返回NULL,此时进行标记阶段而后再次进行First-fit查找。还找不到则分配失败。

《垃圾回收的算法与实现》——GC标记-清除算法的更多相关文章

  1. Java GC 标记/清除算法

    1) 标记/清除算法是怎么来的? 我们在程序运行期间如果想进行垃圾回收,就必须让GC线程与程序当中的线程互相配合,才能在不影响程序运行的前提下,顺利的将垃圾进行回收. 为了达到这个目的,标记/清除算法 ...

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

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

  3. JVM-GC算法(一)-标记清除算法

    首先,我们得知道根搜索算法,它可以解决我们应该回收哪些对象的问题,但是它显然还不能承担垃圾搜集的重任,因为我们在程序(程序也就是指我们运行在JVM上的JAVA程序)运行期间如果想进行垃圾回收,就必须让 ...

  4. JVM内存管理------GC算法精解(五分钟让你彻底明白标记/清除算法)

    相信不少猿友看到标题就认为LZ是标题党了,不过既然您已经被LZ忽悠进来了,那就好好的享受一顿算法大餐吧.不过LZ丑话说前面哦,这篇文章应该能让各位彻底理解标记/清除算法,不过倘若各位猿友不能在五分钟内 ...

  5. GC算法精解(五分钟让你彻底明白标记/清除算法)

    GC算法精解(五分钟让你彻底明白标记/清除算法) 相信不少猿友看到标题就认为LZ是标题党了,不过既然您已经被LZ忽悠进来了,那就好好的享受一顿算法大餐吧.不过LZ丑话说前面哦,这篇文章应该能让各位彻底 ...

  6. JVM内存管理之GC算法精解(五分钟让你彻底明白标记/清除算法)

    相信不少猿友看到标题就认为LZ是标题党了,不过既然您已经被LZ忽悠进来了,那就好好的享受一顿算法大餐吧.不过LZ丑话说前面哦,这篇文章应该能让各位彻底理解标记/清除算法,不过倘若各位猿友不能在五分钟内 ...

  7. (转)jvm具体gc算法介绍标记整理--标记清除算法

    转自:https://www.cnblogs.com/ityouknow/p/5614961.html GC算法 垃圾收集器 概述 垃圾收集 Garbage Collection 通常被称为“GC”, ...

  8. JVM之GC算法、垃圾收集算法——标记-清除算法、复制算法、标记-整理算法、分代收集算法

    标记-清除算法 此垃圾收集算法分为“标记”和“清除”两个阶段: 首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记对象,它的标记过程前面已经说过——如何判断对象是否存活/死去 死去的对象就会 ...

  9. JVM垃圾回收(二)- Minor GC vs Major GC vs Full GC

    Minor GC vs Major GC vs Full GC 垃圾回收的活动会清理对内存中的不同区域,这些事件一般被称为Minor,Major以及Full GC events.本章我们会讨论这些清理 ...

随机推荐

  1. Robotframework + Appium 之常用元素定位方法

    任何自动化测试,其实手动测试也是一样的,元素定位(目标定位)是首要任务,这是最直接的测试对象呀! 好了,废话不多说,又到了元素定位啦,之前我们已经介绍过selenium及appium常用的定位方法,下 ...

  2. Java Socket重要参数讲解

    (转自http://www.cnblogs.com/ggjucheng/archive/2012/01/06/2314679.html) ( http://docs.oracle.com/javase ...

  3. oracle 游标实现多重循环

    declare -- Local variables here i integer; cursor c_province is select ds.swjg_dm from dm_swjg ds wh ...

  4. Ajax请求php返回json对象数据中包含有数字索引和字符串索引,在for in循环中取出数据的顺序问题

    //php中的数组数据格式 Array ( [all] => Array ( [title] => ALL [room_promotion_id] => all ) [best_av ...

  5. inline函数的作用

    (一)inline函数(摘自C++ Primer的第三版) 在函数声明或定义中函数返回类型前加上关键字inline即把min()指定为内联. inline int min(int first, int ...

  6. 基于tinyproxy搭建代理服务器

    在我们实际的工作当中,经常会遇到这种情况,我们对线上服务器进行操作时是通过跳板机来进行的,出于安全性及投入资金来考虑非必要情况下除跳板机以外的服务器是没有内网ip的,所以当我们位于内网的服务器需要使用 ...

  7. AndroidPn服务端部分bug解决方案

    目前推送的情况已经大致可以了,可以正常推送.但是要在实际生产中使用,要改进很多地方. 原本的版本,是不会对消息重新发送的.消息如果丢失,或者用户没有在线,消息也不会重新的发送.所以,这些问题都是要解决 ...

  8. ASP.NET MVC学习之模型验证详解

    ASP.NET MVC学习之模型验证篇 2014-05-28 11:36 by y-z-f, 6722 阅读, 13 评论, 收藏, 编辑 一.学习前的一句话 在这里要先感谢那些能够点开我随笔的博友们 ...

  9. TransactionScope事务使用

    using (System.Transactions.TransactionScope T_Scope = new System.Transactions.TransactionScope()) { ...

  10. 为什么不能用Abort退出线程

    在使用线程时,如果线程还未结束直接退出线程很有可能会导致数据丢失. class threadAbort { static void Main(string[] args) { WriteMessage ...