1. 分区region-卡片card

G1堆的大小:依然采用-Xms/-Xmx来指定堆空间大小。
堆的切割:堆内存被切割为多个大小固定的区域(Region),而且每个Region是连续的虚拟内存。
堆默认把内存分为2048个Region,每个Region大小固定,每个Region的取值返回[1m-32m],是2的幂次方。
参数:
-XX: G1HeapRegionSize,自定义region的大小
1652370713.png
Card(卡片)
G1对内存的分配以分区(Region)为单位,而对象的分配则以卡片(Card)为单位。
每个Region都会被切割为均匀的card,每个card的大小为512Byte,card是堆内存最小粒度。
所有分区Region的卡片将会记录在全局卡片表(Global Card Table)中。

2. HumongousObject

一个大小达到甚至超过分区Region 50%以上的对象称为巨型对象(Humongous Object)。
巨型对象会独占一个、或多个连续分区。如下图
1652628184(1).png
Humongous Object有以下特点:

  1. Humongous Object直接分配到了老年代,防止反复拷贝移动。

当线程为巨型分配空间时,不能简单在TLAB进行分配,因为巨型对象的移动成本很高,而且有可能一个分区不能容纳巨型对象。因此,对象对象会直接在老年代分配,所占的连续空间称为巨型分区(Humongous Region)。

  1. 大对象的回收阶段

大对象的回收并不是在young gc或mixed gc阶段。
humongous object在3个阶段回收

  1. 全局并发标记(Global Concurrent Marking)阶段的Cleanup
  2. FGC阶段 ```java public class YoungGCTest { /** -verbose:gc -Xms10m -Xmx10m -XX:+UseG1GC -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:MaxGCPauseMillis=200m
  1. 一个region 1M(日志最后的region size 1024K
  2. 一个大小达到甚至超过分区Region 50%以上的对象称为巨型对象(Humongous Object)
  3. 故,低于512young gc,大于512G1 Humongous Allocation
  4. 触发young gc的条件,超过60%堆,即,超过6M
  5. */
  6. static int size=1024*512;
  7. public static void main(String[] args) {
  8. List list=new ArrayList();
  9. for (int i=1;i<10;i++){
  10. System.out.println("-------------"+i+"---------------");
  11. byte[] array=new byte[size];
  12. list.add(array);
  13. }
  14. }

} ```