《深入理解Java虚拟机》笔记-垃圾收集器-G1

G1收集器(Garbage-First)

面向服务器

特点:

并发;不需要配合其它收集器,能够独立管理整个GC堆;整体上采用标记-整理,局部采用复制算法,运行期间不会产生内存碎片;可预测的停顿,可预测的停顿时间模型,使用者可以指定在一个长度为M毫秒的时间片段内,消耗在垃圾收集上的时间不得超过N毫秒。

内存布局和其他收集器有较大差别:将整个Java堆划分为多个大小相等的独立区域(Region)新生代和老年代不再是物理隔离,它们都是一些Region的集合。

为了避免Java堆中全区域的垃圾收集,G1跟踪各个堆里面的垃圾堆积的价值大小,价值通过回收所获得的空间大小和回收所需的时间的经验值来衡量。维护一个Region的优先列表,每次根据允许的收集时间,优先回收价值最大的Region。保证在有限时间内可以获取尽可能高的收集效率。

在做对象可达性判定对象存活时,不同Region之间的对象可能存在引用关系,就像其他收集器中新生代和老年代之间的对象存在引用一样。虚拟机通过Remembered Set对象来避免全堆扫描。每个Region都有一个与之对应的Remembered Set,用来记录其中对象的引用。在进行内存回收时,在GC Roots中的枚举范围中加入Remembered Set就可以保证不用全堆扫描也不会有遗漏。

在不考虑维护Remembered Set操作的情况下,G1收集器的运作大致分为4步:

初始标记;

需要停顿线程,仅标记GC Roots能直接的关联到的对象,标记TAMS,指明下一阶段用户程序创建对象的Region。

并发标记;

从GC Roots开始对堆中对象进行可达性分析,可与用户线程并发执行。

最终标记;

需要停顿线程。修改那些在并发标记阶段由于用户线程继续运行而导致标记产生变动的那一部分标记记录。虚拟机把它们记录在Remembered Set Logs中,最终标记阶段的任务就是把Remembered Set Logs中的内容合并到Remembered Set中。

筛选回收;

首先根据各个Region的回收价值和成本排序,按照用户期望的GC停顿时间来指定回收计划。可停顿也可与用户线程并发。

《《深入理解Java虚拟机》笔记-垃圾收集器-G1》

G1收集器运行示意图

    原文作者:java虚拟机
    原文地址: https://blog.csdn.net/qr457535344/article/details/80872736
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞