首页 > 编程知识 正文

g1垃圾回收器缺点,垃圾收集器为什么用G1

时间:2023-05-05 22:56:41 阅读:15005 作者:4688

CMS垃圾收集器的弊端:内存碎片化,需要保留空间。

在处理这两个问题时,暂停时间太长的可能性很高,即CMS的暂停时间是不可预测的。

因此,G1还可以理解为是在CMS垃圾收集器中“升级”的。

G1垃圾收集器可以为您设置停止世界暂停所需的时间。 G1会根据这个时间尽量满足你。

在JVM堆中,堆的内存分布由物理空间隔离——

但是,在G1垃圾收集器中,堆的划分不是以物理形式而是以逻辑形式进行划分。

但是,分代的概念在G1中也依然发挥着作用。 例如,新的对象被分配到Eden区,经过15次Minor GC新生代的对象如果还活着,就会转移到旧的年代等…

以下是G1中【堆】的空间分布——

从图中可以看出,堆被分割成多个同等的区域,在G1中每个区域被称为Region。

传统的垃圾收集器对堆进行物理分割。 堆空间(内存)较大时,每次进行【垃圾回收】时都需要将较大的区域堆积成一个整体进行回收。 虽然其收集时间难以控制,但是如果分割多个小区域,则向【小区域】的回收会更容易控制其【收集时间】

G1还有另一个Humongous (大对象)区域。 实际上,它来存储特别大的对象(超过一半的region内存)。 如果发现没有对大对象的引用,可以直接在年轻一代的Minor GC中回收。

G1的GC过程在G1收集器中主要有混合GC (young GC )和混合GC,写特殊场景可能会产生全GC

Minor GC G1的Minor GC触发器计时与其他垃圾收集器相同:

当Eden区域已满时,将触发Minor GC。 Minor GC也同样会发生停止世界。

值得注意的是,在G1世界,新生代和老年代所占空间并不固定,而是根据【最大停工时间】进行调整。

如果你知道这是给我们提供参数配置就好了。 通过根据参数动态改变年轻一代的Region的个数,可以抑制Minor GC的开销

Minnor GC回收流程:

路由扫描更新处理Rset复制对象路由扫描与以前的CMS类似,在初始标签的流程更新处理rsethttp://www.Sina.com/CMS中,Minor GC通过【卡表】避免了所有表扫描的老一代对象因为Minor GC是回收年轻一代的对象,但是如果老年代有引用年轻一代的对象的话,老年代引用的对象就不能回收。

同样,G1也有这样的问题。 在CMS中被称为卡片表,G1解决【世代间参照】问题的存储通常称为RSet

每个Region存储的RSet记录引用当前Region的其他Region的对象关系。

对于年轻一代的Region,该RSet只保存来自旧年代的引用。 因为年轻一代会自己制作Minor GC。

对于较旧年代的Region,该RSet仅保存来自较旧年代的引用。 G1收集器不需要保存年轻一代的引用,因为它在旧年代被回收之前回收年轻一代。

因此,第二步是处理和扫描RSet的信息,将关于老年代对象有年轻一代对象的引用添加到GC Roots中,以免被回收。

复制对象在扫描后将生存对象保存在【空闲的Survivor区域】或【旧的年代】,其他的Eden区域清除。

此外,G1还有另一个名称: CSet、Collection

Set,在GC上保存了一次【执行垃圾回收】的区域。 CSet中的所有生存对象都将传输到另一个可用的Region

Rset概念:

混合GC在堆区域占有率达到一定阈值时启动混合GC (默认值的45%,由参数决定)。 混合GC依赖于全局并发标记统计后的Region数据

全局标记:

从初始标签(STW )并发标签最终标签(STW )清理) STW )名称可以看出,混合GC是混合GC,混合GC一定要回收年轻一代,采集并回收老一代Region的一部分。

初始标记这个过程共享了Minor GC的Stop the world,复用了扫描GC Roots的操作。

在这个过程中,老的年代和新的世代都会被扫描

在这个阶段不运行stop the world,GC线程与用户线程一起运行,GC线程收集每个Region的生存对象信息。 从GC根向下追溯,查找此堆中的生存对象需要时间。

重新标记与CMS一样,对在并发标记阶段更改的对象进行标记。

这个阶段也要清理stop the world,主要是清点和重置标记状态,根据停顿预测模型决定这次GC的区域大小。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。