概述
G1收集器与其他收集器都不相同,G1引入了Region的概念,新生代和老年代都采用标记复制算法,标记采用三色标记算法。
JDK9后默认为G1收集器
启动参数:-XX:UseG1GC
内存格局

G1将堆划分为2048个左右的Region内存块,每个Region大小在1-32MB之间,具体多大取决于堆的大小。G1除了普通收集器的Eden,Survivor,Old区外还额外加了Humongous这个区域,Humongous的作用是存放大对象(大对象的判断方式是大于Region的50%),Humongous跟随老年代Full GC清理。
执行流程

1.初始标记,STW单线程执行,从GC Root出发标记首层引用。
2.并发标记,并发执行,从首层标记出发向下标记引用对象。
3.最终标记,STW执行,重新对对象进行一次标记,避免未标记到的情况。
4.筛选回收,STW执行,将未标记到的对象复制到新的Region中,并不一定将所有的辣鸡一次性回收,可能会估算时间分多次回收垃圾(可通过过-XX:MaxGCPauseMillis来配置最大停留时间来制定回收计划)
详解
核心参数
G1的核心配置参数是-XX:MaxGCPauseMillis,此参数作用是设定一个最大的GC STW的时间
Young GC
G1收集器年轻代默认初始内存占比是5%,可通过-XX:G1NewSizePercent设置初始占比。每次Eden区满了G1都会判断与核心参数停留时间的差额。如果远小于设置的时间,G1不会进行YoungGC,而是会不断地扩大Eden区的Region占比,当然这也有参数可以对最大的占比进行限制(-XX:G1MaxNewSizePercent)
核心不同
1.G1将堆划分为2048个左右的Region内存块,每个Region大小在1-32MB之间,具体多大取决于堆的大小。
2.G1除了普通收集器的Eden,Survivor,Old区外还额外加了Humongous这个区域,Humongous的作用是存放大对象(大对象的判断方式是大于Region的50%),Humongous跟随老年代Full GC清理。
3.Region的分区并非固定的而是动态的,也就是说在下一次复制清除后就可能被分为其他分区。
4.G1加入了Mixed GC,如果老年代占据的空间大于(-XX:InitiatingHeapOccupancyPercent 默认45%)则执行Mixed GC,也就是Young GC加Full GC一起混合执行。
5.Mixed GC并非要完全执行完才会停止,可通过(-XX:G1HeapWasteParcent 默认5%)配置堆中Region空闲比例,达到这个比例的时候就会暂停Mixed GC。
6.G1也提供了对标记复制算法的优化配置(-XX:G1MixedGCLiveThresholdPercent 默认值85%),在对Region进行复制回收时,会对Region中的剩余对象进行判定,如果剩余对象大小比例大于设定值,就不会对Region进行复制回收。
7.可对筛选回收这一步单独设置每次回收拆分成多少次执行,由于筛选回收时STW执行的,对这步的拆分意义很明显,就是为了降低系统的单次执行时间,设置方式为:-XX:G1MixedGCCountTarget(默认8次)。
G1收集器的优势与劣势
优势
1.可根据配置动态变化分区大小。
2.并发执行,并且可将STW时间分多次执行,大大的提升了系统的吞吐量,降低了单次执行时间。
劣势
1.G1的问题是很明显的,由于引入了Region的概念,并且整体采用了复制算法,所以如果内存过小的时候会严重影响使用(平衡点6-8G)。