:::warning G1的最大特点是什么? ::: 建立了可预测停顿时间的收集模型。
    同时G1可以根据用户设置的暂停时间目标自动调整年轻代和总堆大小,暂停目标越短年轻代空间越小、总空间就越大;

    :::warning G1的机制? :::

    1. G1的设计原则是”首先收集尽可能多的垃圾(Garbage First)”。因此,G1并不会等内存耗尽(串行、并行)或者快耗尽(CMS)的时候开始垃圾收集,而是在内部采用了启发式算法,在老年代找出具有高收集收益的分区进行收集。同时G1可以根据用户设置的暂停时间目标自动调整年轻代和总堆大小,暂停目标越短年轻代空间越小、总空间就越大;
    2. G1采用内存分区(Region)的思路,将内存划分为一个个相等大小的内存分区,回收时则以分区为单位进行回收,存活的对象复制到另一个空闲分区中。由于都是以相等大小的分区为单位进行操作,因此G1天然就是一种压缩方案(局部压缩);
    3. G1虽然也是分代收集器,但整个内存分区不存在物理上的年轻代与老年代的区别,也不需要完全独立的survivor(to space)堆做复制准备。G1只有逻辑上的分代概念,或者说每个分区都可能随G1的运行在不同代之间前后切换;
    4. G1的收集都是STW的,但年轻代和老年代的收集界限比较模糊,采用了混合(mixed)收集的方式。即每次收集既可能只收集年轻代分区(年轻代收集),也可能在收集年轻代的同时,包含部分老年代分区(混合收集),这样即使堆内存很大时,也可以限制收集范围,从而降低停顿。

    :::warning 分区的概念? ::: G1将内存划分为若干不等(4M一块-XX:G1HeapRegionSize=n)的region。每个分区不需要保证物理连续。
    每个分区不一定被区分为年轻代或年老代,有可能在实际分配过程中被相互切换。
    分区内部已512byte划分为卡片,卡片是最小GC处理单位,也是最小对象分配空间,一个对象可能占用多个卡片。
    每一个年老代分区都对应一个remember set,记录了分区中被外部引用的卡片索引。这样就不需要进行可达性扫描。就可以进行分区中的对象区分。
    GC时,通过将Rset中的有效对象移动到另外一个分区(复制算法)即可。