:::warning
G1的最大特点是什么?
:::
建立了可预测停顿时间的收集模型。
同时G1可以根据用户设置的暂停时间目标自动调整年轻代和总堆大小,暂停目标越短年轻代空间越小、总空间就越大;
:::warning
G1的机制?
:::
- G1的设计原则是”首先收集尽可能多的垃圾(Garbage First)”。因此,G1并不会等内存耗尽(串行、并行)或者快耗尽(CMS)的时候开始垃圾收集,而是在内部采用了启发式算法,在老年代找出具有高收集收益的分区进行收集。同时G1可以根据用户设置的暂停时间目标自动调整年轻代和总堆大小,暂停目标越短年轻代空间越小、总空间就越大;
- G1采用内存分区(Region)的思路,将内存划分为一个个相等大小的内存分区,回收时则以分区为单位进行回收,存活的对象复制到另一个空闲分区中。由于都是以相等大小的分区为单位进行操作,因此G1天然就是一种压缩方案(局部压缩);
- G1虽然也是分代收集器,但整个内存分区不存在物理上的年轻代与老年代的区别,也不需要完全独立的survivor(to space)堆做复制准备。G1只有逻辑上的分代概念,或者说每个分区都可能随G1的运行在不同代之间前后切换;
- G1的收集都是STW的,但年轻代和老年代的收集界限比较模糊,采用了混合(mixed)收集的方式。即每次收集既可能只收集年轻代分区(年轻代收集),也可能在收集年轻代的同时,包含部分老年代分区(混合收集),这样即使堆内存很大时,也可以限制收集范围,从而降低停顿。
:::warning
分区的概念?
:::
G1将内存划分为若干不等(4M一块-XX:G1HeapRegionSize=n)的region。每个分区不需要保证物理连续。
每个分区不一定被区分为年轻代或年老代,有可能在实际分配过程中被相互切换。
分区内部已512byte划分为卡片,卡片是最小GC处理单位,也是最小对象分配空间,一个对象可能占用多个卡片。
每一个年老代分区都对应一个remember set,记录了分区中被外部引用的卡片索引。这样就不需要进行可达性扫描。就可以进行分区中的对象区分。
GC时,通过将Rset中的有效对象移动到另外一个分区(复制算法)即可。