![](https://csdnimg.cn/release/download_crawler_static/88015581/bg3.jpg)
4、并发清除清除 GC Roots 不可达对象,和用户线程一起工作,不需要暂停工作线程。由于耗时最
长的并发标记和并发清除过程中,垃圾收集线程可以和用户线程一起并发工作,所以总体上来看
CMS 收集器的内存回收和用户线程是一起并发地执行。
说说 G1 垃圾收集器的工作原理
优点:指定最大停顿时间、分 Region 的内存布局、按收益动态确定回收集
1、G1 开创的基于 Region 的堆内存布局是它能够实现这个目标的关键。虽然 G1 也仍是遵循分代收
集理论设计的,但其堆内存的布局与其他收集器有非常明显的差异:G1 不再坚持固定大小以及固
定数量的分代区域划分,而是把连续的 Java 堆划分为多个大小相等的独立区域(Region),每一个
Region都可以根据需要,扮演新生代的 Eden空间、Survivor空间,或者老年代空间。收集器能够对
扮演不同角色的 Region 采用不同的策略去处理,这样无论是新创建的对象还是已经存活了一段时
间、熬过多次收集的旧对象都能获取很好的收集效果。
2、虽然 G1 仍然保留新生代和老年代的概念,但新生代和老年代不再是固定的了。它们都是一系
列区域(不需要连续)的动态集合。G1 收集器之所以能建立可预测的停顿时间模型,是因为它将
Region 作为单次回收的最小单元,即每次收集到的内存空间都是 Region 大小的整数倍,这样可以
有计划地避免在整个 Java 堆中进行全区域的垃圾收集。更具体的处理思路是让 G1 收集器去跟踪各
个 Region 里面的垃圾堆积的“价值”大小,价值即回收所获得的空间大小以及回收所需时间的经验
值,然后在 后 台 维 护一个优先级列 表 , 每 次根据用户设定允 许 的 收集停顿时间( 使 用 参 数-
XX:MaxGCPauseMillis 指定,默认值是 200 毫秒),优先处理回收价值收益最大的那些 Region,这也就是
“Garbage First”名字的由来。这种使用 Region 划分内存空间,以及具有优先级的区域回收方式,保
证了 G1 收集器在有限的时间内获取尽可能高的收集效率。
3、G1 收集器的运作过程大致可划分为以下四个步骤:·初始标记 (Initial Marking):仅仅只是标记
一下 GC Roots 能直接关联到的对象,并且修改 TAMS 指针的值,让下一阶段用户线程并发运行时,
能正确地在可用的 Region 中分配新对象。这个阶段需要停顿线程,但耗时很短,而且是借用进行
Minor GC 的时候同步完成的,所以 G1 收集器在这个阶段实际并没有额外的停顿。·并发标记
(Concurrent Marking):从 GC Root 开始对堆中对象进行可达性分析,递归扫描整个堆里的对象图,找
出要回收的对象,这阶段耗时较长,但可与用户程序并发执行。当对象图扫描完成以后,还要重
新处理 SATB 记录下的在并发时有引用变动的对象。·最终标记 (Final Marking):对用户线程做另
一个短暂的暂停,用于处理并发阶段结束后仍遗留下来的最后那少量的 SATB 记录。筛选回收
(Live Data Counting and Evacuation):负责更新 Region 的统计数据,对各个 Region 的回收价值和成本进
行排序,根据用户所期望的停顿时间来制定回收计划,可以自由选择任意多个 Region 构成回收集,
然后把决定回收的那一部分 Region 的存活对象复制到空的 Region 中,再清理掉整个旧 Region 的全
部空间。这里的操作涉及存活对象的移动,是必须暂停用户线程,由多条收集器线程并行完成的。
从上述阶段的描述可以看出,G1 收集器除了并发标记外,其余阶段也是要完全暂停用户线程的
说说 ZGC 垃圾收集器的工作原理
内存布局·小型 Region(Small Region):容量固定为 2MB, 用于放置小于 256KB 的小对象。中型
Region(Medium Region):容量固定为 32MB,用于放置大于等于 256KB 但小于 4MB 的对象。·大型
Region(Large Region):容量不固定,可以动态变化,但必须为 2MB的整数倍,用于放置 4MB或以上
的大对象。每个大型 Region 中只会存放一个大对象,这也预示着虽然名字叫作“大型 Region”,但
它的实际容量完全有可能小于中型 Region,最小容量可低至 4MB。大型 Region 在 ZGC 的实现中是
不会被重分配(重分配是 ZGC 的一种处理动作,用于复制对象的收集器阶段,稍后会介绍到)的,因
为复制一个大对象的代价非常高昂。