首页 > 其他分享 >垃圾收集器

垃圾收集器

时间:2023-12-01 17:34:12浏览次数:27  
标签:标记 对象 收集器 并发 线程 垃圾 CMS

G1垃圾收集器

遵循分代收集理论设计的,但其堆内存的布局与其他收集器有非常明显的差异:G1不再坚持固定大小以及固定数量的分代区域划分,而是把连续的Java堆划分为多个大小相等的独立区域(Region),每一个Region都可以根据需要,扮演新生代的Eden空间、Survivor空间,或者老年代空间。收集器能够对扮演不同角色的Region采用不同的策略去处理,这样无论是新创建的对象还是已经存活了一段时间、熬过多次收集的旧对象都能获取很好的收集效果。
Region中还有一类特殊的Humongous区域,专门用来存储大对象。G1认为只要大小超过了一个Region容量一半的对象即可判定为大对象。每个Region的大小可以通过参数 -XX:G1HeapRegionSize 设定,取值范围为1MB~32MB,且应为2的N次幂。而对于那些超过了整个Region容量的超级大对象,将会被存放在N个连续的Humongous Region 之中,G1的大多数行为都把 Humongous Region 作为老年代的一部分来进行看待。

就是说将堆内存划分后标记区块而不是标记某一对象占用的内存,垃圾收集时对每一不同的内存区域执行不同的收集策略,对于大对象,有专门的大存储空间,也可以合用多个大空间。垃圾收集以单个空间作为单位,而不是以整个空间。对新生代和老年代所处的空间不固定而是动态的区域集合。根据每个区域的回收价值维护回收优先级。

CMS(Concurrent Mark Sweep)收集器

是一种以获取最短回收停顿时间为目标的收集器。从名字上就可以看出CMS收集器是基于标记-清除算法实现的,它的运作过程分为四个步骤,包括:

  1. 初始标记(CMS initial mark);
  2. 并发标记(CMS concurrent mark);
  3. 重新标记(CMS remark);
  4. 并发清除(CMS concurrent sweep)。
    其中初始标记、重新标记这两个步骤仍然需要“Stop The World”。初始标记仅仅只是标记一下GC Roots能直接关联到的对象,速度很快;并发标记阶段就是从GC Roots的直接关联对象开始遍历整个对象图的过程,这个过程耗时较长但是不需要停顿用户线程,可以与垃圾收集线程一起并发运行;而重新标记阶段则是为了修正并发标记期间,因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录,这个阶段的停顿时间通常会比初始标记阶段稍长一些,但也远比并发标记阶段的时间短;最后是并发清除阶段,清理删除掉标记阶段判断的已经死亡的对象,由于不需要移动存活对象,所以这个阶段也是可以与用户线程同时并发的。由于在整个过程中耗时最长的并发标记和并发清除阶段中,垃圾收集器线程都可以与用户线程一起工作,所以从总体上来说,CMS收集器的内存回收过程是与用户线程一起并发执行的。

就是先快速标记根直接关联的对象,然后再并发的与用户线程同步标记对象,标记完成后通过并发过程中的记录修正标记(主要是防止清理了新增的对象),最后清理已死亡对象,由于不需要移动,所以也可以并发。
主要是为了不让垃圾收集的耗时操作停顿,影响用户线程,通过快速标记和并发思想尽可能缩短垃圾收集时间。

缺点

CMS收集器对处理器资源非常敏感。在并发阶段,它虽然不会导致用户线程停顿,但却会因为占用了一部分线程(或者说处理器的计算能力)而导致应用程序变慢,降低总吞吐量。
然后,由于CMS收集器无法处理“浮动垃圾”(Floating Garbage),有可能出现“Con-current Mode Failure”失败进而导致另一次完全“Stop TheWorld”的Full GC的产生。
还有最后一个缺点,CMS是一款基于“标记-清除”算法实现的收集器,这意味着收集结束时会有大量空间碎片产生。空间碎片过多时,将会给大对象分配带来很大麻烦,往往会出现老年代还有很多剩余空间,但就是无法找到足够大的连续空间来分配当前对象,而不得不提前触发一次Full GC的情况。

占用部分线程(减少了停顿时间)、在并发标记的过程中变动(删除了引用)直到下一次gc才能清除的就叫浮动垃圾、标记清除算法,空间利用率低,没有合适得位置就只能触发Gc来腾出空间

标签:标记,对象,收集器,并发,线程,垃圾,CMS
From: https://www.cnblogs.com/twfplayer/p/17870580.html

相关文章

  • 垃圾收集算法
    垃圾收集算法在Java内存运行时区域中,堆和方法区有着显著的不确定性:接口的多个实现类需要的内存可能不同方法执行中不同条件需要的内存空间也不同这部分内存的分配和回收是动态的。两个问题,回收谁、怎么回收回收谁——可回收垃圾(算法)当对象没有被任何地方引用时,显然是可回......
  • 智慧垃圾分拣站:解决城市垃圾分类难题的创新科技
    随着城市化进程的不断加快,垃圾处理问题日益凸显。为了更好地解决垃圾分类问题,越来越多的城市开始推广智慧垃圾分拣站,利用创新科技实现高效垃圾分类处理。 山海鲸使用三维建模技术,建立了一个智慧垃圾分拣站数字孪生模型,它是一种新型的垃圾分类处理设备,可以通过智能化的方式,对垃......
  • 2023-11-29 闲话 垃圾桶是这里吗
    算法竞赛学不了一点。刷点b站视频吧。纯纯当作水博客用,看再多哔哩哔哩也和研究怎么拍个照片让机器把力矩学了没有半毛钱关系是吧。昨天刷了一个参加IROS2022kyoto的分享。现在仍然有印象的几点是:advisor觉得他很social,问他有没有经验。他说大概可以先加入一些小团体......
  • 智能垃圾桶丨悦享便捷生活
    垃圾桶是人们日常生活所必不可少的必需品,它让生活中所产生的垃圾有了一个正确的存放地方。随着生产技术的迅速发展,垃圾桶也得以更新换代。由最初的简单式的圆筒式垃圾桶,到现在出现的感应式垃圾桶、智能语音控制垃圾桶,垃圾桶也变得越来越智能,让人们切实感受到了科技的进步所带来的的......
  • 垃圾回收过程可设置的参数
    1内存分代垃圾回收主要是在堆没有足够的内存空间来存放新创建的对象时被触发。由于堆中的对象生命周期不同,故在进行垃圾回收时,不是所有对象都需要被回收,只是回收不再可达的对象。同时在进行垃圾回收时需要暂停应用程序,故会造成应用在暂停期间不可用,垃圾回收持续的时间越长,则应用不......
  • day03-4垃圾回收机制
    【垃圾回收机制】【一】引入解释器在执行到定义变量的语法时,会申请内存空间来存放变量的值,而内存的容量是有限的,这就涉及到变量值所占用内存空间的回收问题当一个变量值没有用了(简称垃圾)就应该将其占用的内存给回收掉,那什么样的变量值是没有用的呢?单从逻辑层面分析,我们......
  • 垃圾回收主要是回收那块内存区域?
    Java虚拟机的垃圾回收主要集中在Java堆这个内存区域。Java堆是用于存放对象实例的内存区域,垃圾回收的目标就是清理掉那些不再被引用的对象,释放内存空间,以便新的对象能够被创建和分配。Java堆可以划分为两个主要的区域:新生代(YoungGeneration):新创建的对象首先被分配到新生代。......
  • JVM学习记录三(垃圾回收器之标记法及回收算法)
    先了解为什么样的垃圾会被回收,哪里的垃圾回收的是堆内垃圾,当对象没有任何引用指向,那就是垃圾,就有可能被回收回去怎么定位是可需要被回收的垃圾引用计数法:当对象被引用一次那就增加一个一个引用次数,如果未被引用过,则引用次数为0,不过可能会存在循环引用,出现内存泄露的问题可达性计数......
  • 垃圾回收机制
    引用计数Python中,主要通过引用计数(ReferenceCounting)进行垃圾回收typedefstruct_object{intob_refcnt;struct_typeobject*ob_type;}PyObject;在Python中每一个对象的核心就是一个结构体PyObject,它的内部有一个引用计数器(ob_refcnt)。程序在运行的过程中会实时的更......
  • 《流畅的Python》 读书笔记 第8章_对象引用、可变性和垃圾回收
    第8章_对象引用、可变性和垃圾回收本章的主题是对象与对象名称之间的区别。名称不是对象,而是单独的东西name='wuxianfeng'#name是对象名称'wuxianfeng'是个str对象variablesarelabels,notboxes变量是标注,而不是盒子引用式变量的名称解释本章还会讨论标识......