首页
学习
活动
专区
工具
TVP
发布

GC算法-标记压缩算法

概述 还记得标记清除和复制算法的问题么? 堆使用效率低和碎片化问题. 那么有没有能够利用整个堆, 有没有内存碎片化问题的算法呢? 这就是标记压缩算法了....创建对象分配内存的操作与复制算法一样. 这个算法简直是融合了标记清除和复制算法的优点, 解决了他们的问题, 不光堆的使用效率变高了, 而且也没有内存碎片的问题了....而这, 也是标记压缩算法最大的问题了, 执行时间太久了, 标记清除对堆进行一次遍历, 而标记压缩要进行三次. 三倍的时间. 可想而知. 不过也有伟人说了, 算法没有好不好, 只有是否适合....这几种可达性的算法各有优劣吧. 标记压缩的衍生 Two-Finger算法 将堆的遍历次数减少到两次....(原谅我的无知) 其他 还有一些其他的表格算法、lmmixGC算法等, 因为这两个我看的似懂非懂, 就不细说了. 标记压缩算法差不多就这么些. 告辞~~~

95710
您找到你想要的搜索结果了吗?
是的
没有找到

【Java 虚拟机原理】垃圾回收算法 ( 标记-清除算法 | 复制算法 | 标记-整理算法 )

文章目录 总结 一、标记-清除算法 二、复制算法 三、标记-整理算法 总结 常用的垃圾回收算法 : 标记-清除算法 ; 复制算法 ; 标记-整理算法 ; 这些算法没有好坏优劣之分 , 都有各自的 优势...定位 找到了 垃圾对象 , 那么 将该 垃圾对象 进行标记 , 如下图 , 标记为 橙色 ; 标记好之后 , 在执行 GC 内存回收时 , 会 将 被标记的 内存 回收 ; 标记-清除算法优缺点 :...只能使用 一半内存 ; 复制算法 适合使用 内存量较小 , 但是 操作很频繁的区域 , 如 : 在 年轻代 的 Survivor 中 , 使用的就是 复制算法 垃圾回收机制 ; 三、标记-整理算法 --...-- 标记-整理算法标记-清除算法 的更完善的版本 , 标记-整理算法 解决了 内存碎片问题 ; 内存回收后 , 将内存中的对象重新 紧密地 排列 , 消除内存碎片 ; 标记-整理算法 优缺点..., 但这样大大影响程序的执行效率 ; 标记-整理 算法 , 不能用在 内存操作 活跃的场景中 , 如 : 老年代的垃圾回收 , 使用的是 标记-整理 算法 ;

46210

垃圾回收算法(3)-标记清除算法

前言 标记清除算法(Mark-Sweep)是一种非常基础和常见的垃圾收集算法,该算法被J.McCarthy等人在1960年提出并成功的发明并应用于Lisp语言。...这2个名词经常在垃圾收集算法中出现。 collector指的就是垃圾收集器。 mutator是指除了垃圾收集器之外的部分,比如说我们的应用程序本身。...算法原理 标记清除算法将垃圾回收分为2个阶段,标记阶段和清除阶段。...一种可行的实现是,在标记阶段首先通过根节点,标记所有从根节点开始的可达对象。因此,未被标记的对象就是未被引用的垃圾对象。然后在清除阶段清除所有未被标记的对象。...存在问题 标记清除算法最大的问题是存在大量的空间碎片,因为回收后的空间是不连续的。在对象的堆空间分配过程中,尤其是大对象的内存分配,不连续的内存空间的工作效率要低于连续的空间。 ?

84510

垃圾回收算法|GC标记-清除算法

本文是《垃圾回收的算法与实现》读书笔记 ? 什么是GC标记-清除算法(Mark Sweep GC) GC 标记-清除算法标记阶段和清除阶段构成。...(这就是被清除的目标) 标记-清除算法的伪代码如下所示: func mark_sweep(){ mark_phase() // 标记阶段 sweep_phase() // 清除阶段...但是如果使用标记清除算法,这时内存会被设置标志位,就会频繁发生不应该发生的复制。 多个空闲链表 上面所说的标记清除算法只用到了一个空闲链表对大小不一的分块统一处理。...位图标记 在单纯的 GC 标记-清除算法中,用于标记的位是被分配到对象头中的。算法是把对象和头一并处理,但这和写时复制不兼容。 位图标记法是只收集各个对象的标志位并表格化,不喝对象一起管理。...参考链接 垃圾回收的算法与实现 画说 Ruby 与 Python 垃圾回收

1.2K20

三色标记算法

https://cloud.tencent.com/developer/article/1730306https://cloud.tencent.com/developer/article/1764009三色标记算法...:是指利用可达性分析算法,对象被GC线程扫描标记的状态,解决GC漏标的问题黑色:根对象,或者该对象与它的子对象都被扫描过灰色:对象本身被扫描,但是还有没扫描该对象的子对象。...GC 线程和业务线程同时工作,在并发标记中,三色标记算法会存在两个缺陷:多标(浮动垃圾)、漏标。...,1、GMS 避免漏标的方法叫做增量更新:1、GC线程: A 已经完全标记,B 已经完成自身标记,正在标记C2、业务线程:A -> D 新建了引用关系,利用写屏障将A重新标记为灰色...):1、GC线程:A 已经完全标记,B 已经完成自身标记,正在标记C2、业务线程:同时 B -> D 引用断开,利用写屏障将 B -> D 的引用原始快照记录下来3、在重新标记阶段,将B -> D 的引用原始快照拿出来

7300

JVM垃圾回收算法标记清除和复制算法

标记清除算法 当堆中的有效空间被耗尽时,JVM就会停止整个程序(也被称为stop the world),然后开始两项工作.一是:标记, 二是:清除 标记 遍历所有GC Roots,将所有GC Roots...程序运行时堆中对象的状态(默认为0未标记,1为标记过),假如堆内存的可用空间被消耗完,那么GC线程就会启动,停止掉应用程序,使用根可达性算法进行搜索标记....[image-20201101144201836] 被标记后的对象状态 [image-20201101144531448] 使用根可达性算法,所有GC Roots可达的对象都被标记为存活对象,此时已经完成了第一阶段的工作...标记清除的优点是算法简单,缺点如下: 1.效率低下,需要遍历整个堆.进行GC的时候需要停止应用程序 2.垃圾回收后的内存空间是不连续的,因为垃圾对象的分布很随意,那么清除后的内存会不连续....复制算法 复制算法使用了两块同等大小的内存空间,每次只用一块,垃圾回收的时候,把存活的对象直接另外一块内存,然后剩余的垃圾对象全部一次性清除.好处是复制存活对象的时候就不用考虑内存碎片.唯一的缺点就是内存利用率只有

61900

【Android 内存优化】垃圾回收算法 ( 内存优化总结 | 常见的内存泄漏场景 | GC 算法 | 标记清除算法 | 复制算法 | 标记压缩算法 )

文章目录 一、 内存优化总结 二、 常见的内存泄漏场景 三、 内存回收算法 四、 标记-清除算法 ( mark-sweep ) 五、 复制算法 六、 标记-压缩算法 一、 内存优化总结 ---- 内存泄漏原理...GC 垃圾回收之前 , 需要对内存对象进行采集 , 不同的虚拟机使用不同的垃圾回收算法 , 常用的垃圾回收算法 : 标记-清除算法 ( mark-sweep ) 复制算法 标记-压缩算法 分代收集算法...四、 标记-清除算法 ( mark-sweep ) ---- 标记-清除算法 ( mark-sweep ) : 步骤分为两步 : ① 标记 , ② 清除 ; 内存中分为如下几块 : 可回收对象 存活对象...可用内存 标记-清除算法 ( mark-sweep ) 算法中 , 首先标记出可回收对象 , 标记完成之后 , 统一回收 ; 回收完毕后 , 存活的对象仍然保持在原来的位置 , 可用内存基本支离破碎...标记压缩算法 : 与标记清除算法都需要先进行标记 ; 2.

1.2K20

面试题28:GC算法——标记压缩&分代算法

标记压缩算法标记压缩算法如下图所示: 由于老年代的对象存活率很高,不容易被消亡,而复制算法不仅存在空间浪费,而且当老年代对象很多的时候,复制对象的效率会非常的低,所以,基于老年代的特性...,产生了标记压缩算法。...它在标记清除算法的基础上做了优化,和标记清除算法一样,也是首先需要从根节点开始,对所有可达对象做一次标记。...---- 【分代算法】 分代算法如下图所示: 当前jvm的垃圾回收,都是采用分代收集算法 针对新生代由于GC都有大量对象死去被回收,少数存量对象,只需要复制少量对象,就可以完全清除S0/S1的垃圾对象空间...所以采用“复制算法”更为合适; 而老年代对象存活率高,每次GC只清除少部分对象,所以采用“标记-清除”和“标记-压缩”算法来回收。

10510

jvm之垃圾回收标记相关算法解读

只有被标记为己经死亡的对象,GC才会在执行垃圾回收时,释放掉其所占用的内存空间,因此这个过程我们可以称为垃圾标记阶段。 那么在JVM中究竟是如何标记一个死亡对象呢?...标记阶段:引用计数算法  方式一:引用计数算法 引用计数算法(Reference Counting)比较简单,对每个对象保存一个整型的引用计数器属性。用于记录对象被引用的情况。...为了解决这个问题,Python引入了一个叫做“标记-清除”的垃圾回收算法。该算法会在程序运行时周期性地扫描内存中所有的对象,对于被引用的对象会标记为“活跃”的,而未被引用的对象则会被清除掉。...标记阶段:可达性分析算法 可达性分析算法(根搜索算法、追踪性垃圾收集) 相对于引用计数算法而言,可达性分析算法不仅同样具备实现简单和执行高效等特点,更重要的是该算法可以有效地解决在引用计数算法中循环引用的问题...,可以标记为垃圾对象。

15820

标记-清除算法主要分成两个阶段

标记-整理算法(Mark-compact) 下面来看一下做标记-整理算法,也有一些文章会把它翻译成标记-压缩,本课程里面统一称作是标记-整理算法,那么标记-整理算法是怎玩的。...一般来讲复制算法标记-清除算法以及标记-整理算法性能要好一些,因为它不像标记-清除算法或者标记-整理算法那样,需要标记哪些对象是存活的,哪些对象可以回收,而只需要找到存活的对象。...那么老年代的对象一般会使用标记-清除算法或者是标记-整理算法去进行回收。...而老年代里面的对象存活率比较高,所以就采用标记-清除算法或者是标记-整理算法进行回收。 那么相比单纯的标记-清除算法标记-整理算方法以及复制算法三代带来了什么好处呢?...总结 好,简单总结一下,本课时课我们探讨了五种垃圾口的算法。基础的垃圾回收算法标记-清除算法标记-整理以及复制算法

1.3K10

HTML布局标记和列表标记

布局标记 首先要介绍的布局标记是div标记,div可以做网页的层也可以做网页的分区。当div做网页的层时可以实现漂浮在网页上的效果,就像我们经常可以在网站里看见的那些漂浮广告。...我们查看一下百度搜索的源码就可以看到,这个页面用的最多的标记就是div,所以也就可以知道这个页面是使用div标签来布局的: ?...table标记和div标记一样都是属于网页布局的标记,table主要是用来做表格,table里常用的属性是:border表格的边界线、cellpadding 表格的填充程度、cellspacing 内间距距离...列表标记 首先要介绍的第一个列表是ul无序列表,无序列表是一个项目的列表,此列项目使用粗体圆点(典型的小黑圆圈)进行标记,ul需要嵌套li实现列表效果。...接下来是ol有序列表同样,有序列表也是一列项目,列表项目使用自增的数字进行标记,所以称为有序列表。有序列表始于 标签,每个列表项也是始于 标签,代码示例: ? 运行结果: ?

4.1K20

详解gc(垃圾回收)机制五:GC标记-压缩算法

GC标记-压缩算法 gc标记-压缩算法是  详解gc(垃圾回收)机制三:GC复制算法  和  详解gc(垃圾回收)机制四:GC标记-清除算法    结合的产物 可以看到,从此章开始,gc算法从一个独立的...,变成了多个组合方式的,大多数有着垃圾回收的语言,都是使用了多个gc算法组合进行的gc 步骤 1:遍历所有的活动对象,并且标记 2:设定scan指针,new_address指针,scan找到活动对象之后...将活动对象头信息的forwarding指针设定为new_address, new_address指针根据活动对象长度移动,scan根据对象长度移动 3:再次遍历堆,将活动对象复制到forwarding指针指向处,标记...-压缩 过程完成 优点 1:没有内存碎片化,可以有效的利用堆 缺点 1:压缩算法需要搜索3次堆,成本大 本文为仙士可原创文章,转载无需和我联系,但请注明来自仙士可博客www.php20.cn

27620

从原理聊JVM:染色标记和垃圾回收算法

这个算法的问题在于,如果A对象引用B的同时,B对象也引用A,即循环引用,那么虽然双方的引用计数都不为0,但如果仅仅被对方引用实际上没有存在的价值,应该被GC掉。...这种做法,相比普通的两块空间的标记复制算法来说,只有10%的内存空间浪费,而这样做的原因是:大部分情况下,一次young gc后剩余的存活对象非常少。...图13.标记-整理分为两个阶段 此方法避免标记-清除算法的碎片问题,同时也避免了复制算法的空间问题。...一般年轻代中执行GC后,会有少量的对象存活,就会选用复制算法,只要付出少量的存活对象复制成本就可以完成收集。 而年老代中因为对象存活率高,用标记复制算法时数据复制效率较低,且空间浪费较大。...所以需要使用标记-清除或者标记-整理算法来进行回收。 所以通常可以先使用标记清除算法,当碎片率高时,再使用标记整理算法

17411

JVM性能调优-剖析标记整理算法与分代收集算法

简介:标记整理算法讲解以及分代收集算法讲解 标记整理算法解决了什么问题 复制收集算法在对象存活率较⾼时就要进⾏较多的复制操作,效率将会变低。...更关键的是,如果不想浪费 50%的空间,就需要有额外的空间进⾏分配担保,以应对被使⽤的内存中所有对象都 100%存活的极端情况,所以在⽼年代⼀般不能直接选⽤这种算法 标记-整理 根据⽼年代的特点,有⼈提出了另外...⼀种“标记-整理(Mark- Compact)算法标记过程仍然与“标记-清除”算法⼀样,但后续步骤不是直接对可回收对象进⾏清理,⽽是让所有存活的对象都向⼀端移动,然后直接清理掉端边界以外的内存 分代收集...⼀般把 Java 堆分为新⽣代和⽼年代,这样就可以根据各个年代的特点采⽤最适当的收集算法.在新⽣代中,每次垃圾收集时都发现有⼤批对象死去,只有少量存活,那就选⽤复制算法,只需要付出少量存活对象的复制成本就可以完成收集...⽽⽼年代中因为对象存活率⾼、没有额外空间对它进⾏分配担保,就必须使⽤“标记-清理”或者“标记⼀整理”算法来进⾏回收

31510

详解gc(垃圾回收)机制四:GC标记-清除算法

标记-清除算法 GC标记-压缩算法标记阶段和清除阶段构成 我们在详解gc(垃圾回收)机制(一)   简单说明了 标记-清除算法 gc步骤: 1:暂停程序业务逻辑,对所有对象进行标记分类 2:找出程序可达对象和不可达对象...3:删除不可达对象 标记清除算法就是如此简单明了,不会出现循环引用的问题, 但是标记清除算法需要暂停程序,会造成程序卡顿 同时每次标记都需要扫描整个堆内存空间 步骤一:遍历根引用的对象: 步骤二:将已经引用的对象打上标记...步骤三:遍历引用对象的子对象,继续打上标记 步骤四:遍历整个堆,将堆上没有标记的对象清除: 优点 1:算法简单 缺点 1:碎片化 可以看出,在gc之后,每个空闲的堆空间都是不连续的,大大小小,...,也会改动所有的活动对象的标记,导致触发了"写时复制",从而变成了不管有没有重写对象,都会触发写时复制....该缺点可以通过一个新的活动对象(位图结构),将活动对象对应上,在标记时,只在新活动对象改动,而不改动活动对象 本文为仙士可原创文章,转载无需和我联系,但请注明来自仙士可博客www.php20.cn

58530
领券