6、G1

G1内存模型

6、G1_第1张图片
1、内存布局:
没有了原来的物理隔离,只是把堆分成了2048个Region区(每个区1MB~32MB不等),所以堆空间的上限是64G
新生代的大小范围是 5%~60%。是根据用户配置的可暂停时间来动态分配的。
2、分区:Eden(年轻代),Servivor(幸存者),old(老年代),Humongous(巨行分区,属于老年代)
CMS收集器分区:年轻代:eden+servivor+servivor
G1收集器分区:年轻代:eden,年轻代集合中没有了servivor区,但是每次YoungGC都会扫描servivor,然后分配到新的servivor或者是old
CMS收集器老年代:old
G1收集器老年代:old+Humongous ,但是G1一旦意识到Humongos没有引用,会随着Young GC 一起回收
Houmongous 条件:大于分区大小的50%

card&Rset

1、card:每个区会分成若干个 card,每个card的大小 512 Byte,记录着对象,也记录着其他对象的引用
2、Global Card Table 全局card表,会把整个堆中,所有的card的索引记录在表中
3、Rset remember set (每个Region中1个),记忆集合。Rset中记录了谁(只记录老年代的引用)引用了本Region的对象,并把该区被引用的card索引记录到Rset中

触发GC条件

1、年轻代收集:年轻代的分配是根据用户配置的可停顿时间分配的大小。所以,当eden区满了以后,会触发Young GC ,触发Youngc的时候是全区静止。但是Young gc的时候时间特别快
CMS是维护了一个OopMap, 而G1是一个Rset
2、Humongous收集:只要大对象没有引用,会伴随着Young GC 一起回收
2、混合收集:当老年代的占比为45%(默认,可配置)时,会启动一次混合收集,但并不会收集所有老年代的垃圾,根据启发式算法,根据用户配置的可暂停时间,来回收老年代回收性价比最高的区域。

据上所述每一次回收的时候,都是全区静止的。

回收步骤

1、初始标记(全区静止):就是根据GC Roots (Rset中有记录)直接引用的对象
2、并发标记
6、G1_第2张图片
并发标记的意思是:一部分用户线程在执行应用程序。一部分回收线程在根据GCroot链去筛选出垃圾
并发的过程中(不只是并发标记),每个线程会独占一个Region,用户线程会在本地缓冲区(LAB)将创建好的对象,同步(CAS)到Eden区
3、最终标记(全区静止):在并发标记的过程中,这段时间虚拟机会将这段时间的对象变化记录在Remeber Set Logs中,最终标记就是将Remeber Set Logs同步到Rset中,这段时间需要全区静止,但是可以并行执行。
4、筛选回收(全区静止):根据用户配置的暂停时间,选择回收性价比最高的一部分区域
这部分区域包括:所有的新生代区
部分老年代区(只有在老年代根据启发式算法,进行回收性价比排名)

https://www.cnblogs.com/draem0507/p/9350699.html(参考)

你可能感兴趣的:(jvm)