《垃圾回收的算法与实现》——GC标记-清除算法
基本算法
- 标记-清除算法由 ==标记阶段== 和 ==清除阶段== 构成。
- 标记即将所有活动的对象打上标记。
- 清除即将那些没有标记的对象进行回收。
标记与清除
- 遍历GC root引用,递归标记(设置对象头中的标志位)对象。
- 标记时如果标志位表示已经标记过则可以跳过。
- 遍历对象有深度优先与广度优先两种算法,其搜索的步骤数一致,而深度优先的内存使用量更小,因此一般使用深度优先。
- 清除阶段将再次遍历堆,未标记的对象加入到空闲链表中,标记的对象则去除标记。
分配与合并
- 分配指mutator(Application)申请分块时获取内存块的过程。
- 分配即通过搜索空闲链表,找到一个大小合适的块。分配测量有如下:
- First-fit,找到第一个大于要求大小的块即返回。
- Best-fit,找到比要求大小大的最小块。
- Worst-fit,找出最大的块将其分割成要求大小块和剩余的,一般不使用(容易产生碎片)
- 对于内存中连续的垃圾可以对其进行合并,减少碎片。
优缺点
优点
- 算法实现简单。
- 与保守式GC算法兼容(对象不能被移动)。
缺点
- 碎片化。
- 分配速度慢,每次分配需要遍历空闲链表。
- 与写时复制(copy-on-write)冲突,因为做GC时需要将对象头进行标记,这将导致大量的数据发生复制。
- STW(Stop-The-World)长,两个阶段均要遍历整个堆。
改进
多个空闲链表
针对分配速度慢
- 根据块的大小建立不同的空闲链表,相同大小的块链接到相同链表中。
- 由于对于大块的申请比较少,因此主要针对小块建立链表,对于大块的可以都在同一个链表中,如大于2-100的分别建立各自大小的链表而大于100的都写入一个大块链表。
BiBOP
针对碎片化
- 原理:将大小相近的对象整理成固定大小的块进行管理。
- 把堆分割成固定大小的块,让每个块只能配置同样大小的对象。
- 但是并不能很好的消除碎片化,如果对堆的分隔没控制好反而可能导致堆的利用率。
位图标记
针对写时复制
- 由于GC过程需要修改对象中属性导致写时复制不兼容,因此指收集各个对象的标志位并表格化。
- 将堆中的对象与位图对应上,而后通过位图的标志代表堆中对象的标志。
- 优点:
- 兼容写时复制
- 清除阶段可以快速的去除标记。
延迟清除法
针对STW过长
- 延迟清除法(Lazy-Sweep)是缩减清除操作而导致的mutator STW的方法。
- 标记结束后不做清除操作而是在分配操作中进行。
- 在分配时,从上次遍历结束的地方开始使用First-fit查找块,如果找不到返回NULL,此时进行标记阶段而后再次进行First-fit查找。还找不到则分配失败。
《垃圾回收的算法与实现》——GC标记-清除算法的更多相关文章
- Java GC 标记/清除算法
1) 标记/清除算法是怎么来的? 我们在程序运行期间如果想进行垃圾回收,就必须让GC线程与程序当中的线程互相配合,才能在不影响程序运行的前提下,顺利的将垃圾进行回收. 为了达到这个目的,标记/清除算法 ...
- 1. GC标记-清除算法(Mark Sweep GC)
世界上第一个GC算法,由 JohnMcCarthy 在1960年发布. 标记-清除算法由标记阶段和清除阶段构成. 标记阶段就是把所有的活动对象都做上标记的阶段. 标记阶段就是"遍历对象并标记 ...
- JVM-GC算法(一)-标记清除算法
首先,我们得知道根搜索算法,它可以解决我们应该回收哪些对象的问题,但是它显然还不能承担垃圾搜集的重任,因为我们在程序(程序也就是指我们运行在JVM上的JAVA程序)运行期间如果想进行垃圾回收,就必须让 ...
- JVM内存管理------GC算法精解(五分钟让你彻底明白标记/清除算法)
相信不少猿友看到标题就认为LZ是标题党了,不过既然您已经被LZ忽悠进来了,那就好好的享受一顿算法大餐吧.不过LZ丑话说前面哦,这篇文章应该能让各位彻底理解标记/清除算法,不过倘若各位猿友不能在五分钟内 ...
- GC算法精解(五分钟让你彻底明白标记/清除算法)
GC算法精解(五分钟让你彻底明白标记/清除算法) 相信不少猿友看到标题就认为LZ是标题党了,不过既然您已经被LZ忽悠进来了,那就好好的享受一顿算法大餐吧.不过LZ丑话说前面哦,这篇文章应该能让各位彻底 ...
- JVM内存管理之GC算法精解(五分钟让你彻底明白标记/清除算法)
相信不少猿友看到标题就认为LZ是标题党了,不过既然您已经被LZ忽悠进来了,那就好好的享受一顿算法大餐吧.不过LZ丑话说前面哦,这篇文章应该能让各位彻底理解标记/清除算法,不过倘若各位猿友不能在五分钟内 ...
- (转)jvm具体gc算法介绍标记整理--标记清除算法
转自:https://www.cnblogs.com/ityouknow/p/5614961.html GC算法 垃圾收集器 概述 垃圾收集 Garbage Collection 通常被称为“GC”, ...
- JVM之GC算法、垃圾收集算法——标记-清除算法、复制算法、标记-整理算法、分代收集算法
标记-清除算法 此垃圾收集算法分为“标记”和“清除”两个阶段: 首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记对象,它的标记过程前面已经说过——如何判断对象是否存活/死去 死去的对象就会 ...
- JVM垃圾回收(二)- Minor GC vs Major GC vs Full GC
Minor GC vs Major GC vs Full GC 垃圾回收的活动会清理对内存中的不同区域,这些事件一般被称为Minor,Major以及Full GC events.本章我们会讨论这些清理 ...
随机推荐
- jacob将word转换为html
1.导包jacob.jar 2.将下面两个文件复制到C:\Windows\System32路径下 3.代码如下 // 8 代表word保存成html public static final int W ...
- OpenGL中的旋转是可以叠加的?
OpenGL中的旋转是可以叠加的? 1. opengl中的旋转 如:glrogtate(45.0f, 0, 0, 1),是将当前坐标系顺时针旋转45度,然后绘制, 程序如下: ; float line ...
- Tomcat的error-page掩盖action实例化的exception
在使用Struts2+Spring+Tomcat开发的时候,为了避免骚扰用户,线上系统我们一般会定义错误处理页面.但是如果开发环境中也这么做(在web.xml定义了错误转发页面),而碰巧某个actio ...
- Spring Boot 2 实践记录之 封装依赖及尽可能不创建静态方法以避免在 Service 和 Controller 的单元测试中使用 Powermock
在前面的文章中(Spring Boot 2 实践记录之 Powermock 和 SpringBootTest)提到了使用 Powermock 结合 SpringBootTest.WebMvcTest ...
- c#中取整方式
主要用到 System 命名空间下的一个数据类 Math ,调用他的方法 一共有三种方式: 第一种 Math.Round:根据四舍五入取整 第二种 Math.Ceiling:向上取整,有小数,整数加1 ...
- ASP.NET Core 2 学习笔记(七)路由
ASP.NET Core通过路由(Routing)设定,将定义的URL规则找到相对应行为:当使用者Request的URL满足特定规则条件时,则自动对应到相符合的行为处理.从ASP.NET就已经存在的架 ...
- Oracle数据库设置Scott登录
Oracle数据库Scott登录 在安装数据库时,用户登录选项中,Scott用户默认是未解锁的. 用户名填写as sysdba:密码是原来设置的,登录进去,新建SQL窗口,输入命令: alert us ...
- Redirect与Transfer 的区别
共同点: 都是重定向: 不同点: redirect: 1发生在客户端: 2.发送两次请求,第一次请求原始页面,当调用此方法时,创建一个应答头,返回状态码302,第二次请求重定向的页面: 3.得不到任何 ...
- s11 day 101 python Linux环境安装 与路飞项目支付功能
from django.conf.urls import urlfrom django.contrib import adminfrom app01 import viewsurlpatterns = ...
- Android Studio - 如何停止logcat不断滚动信息?
今天升级了一下Android Studio,升级之后准备调试程序,发现logcat里面不断滚动各种信息,我想调试程序非常困难了!滚动信息截图: 如何阻止自动出现的各种滚动信息,只显示我正在开发工程的调 ...