Java G1收集器

概述

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)。


我的其他相关链接

Java GCParallel收集器CMS收集器G1收集器GC跨代收集问题

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容