为办理CMS算法发生空间碎片和其它一系列的问题缺陷,HotSpot提供了别的一种垃圾接纳计策,G1(Garbage First)算法,通过参数-XX:+UseG1GC
来启用,该算法在JDK 7u4版本被正式推出,官网对此描写如下:
The Garbage-First (G1) collector is a server-style garbage collector, targeted for multi-processor machines with large memories. It meets garbage collection (GC) pause time goals with a high probability, while achieving high throughput. The G1 garbage collector is fully supported in Oracle JDK 7 update 4 and later releases. The G1 collector is designed for applications that:
G1垃圾收集算法主要应用在多CPU大内存的处事中,在满意高吞吐量的同时,竟大概的满意垃圾接纳时的暂停时间,该设计主要针对如下应用场景:
堆内存布局
1、以往的垃圾接纳算法,如CMS,利用的堆内存布局如下:
这些space必需是地点持续的空间。
2、在G1算法中,回收了别的一种完全差异的方法组织堆内存,堆内存被分别为多个巨细相等的内存块(Region),每个Region是逻辑持续的一段内存,布局如下:
每个Region被标志了E、S、O和H,说明每个Region在运行时都充当了一种脚色,个中H是以往算法中没有的,它代表Humongous,昆山软件开发,这暗示这些Region存储的是巨型工具(humongous object,H-obj),当新建工具巨细高出Region巨细一半时,直接在新的一个或多个持续Region中分派,并标志为H。
Region
堆内存中一个Region的巨细可以通过-XX:G1HeapRegionSize
参数指定,巨细区间只能是1M、2M、4M、8M、16M和32M,总之是2的幂次方,假如G1HeapRegionSize为默认值,则在堆初始化时计较Region的实践巨细,详细实现如下:
默认把堆内存凭据2048份均分,最后获得一个公道的巨细。
GC模式
G1中提供了三种模式垃圾接纳模式,young gc、mixed gc 和 full gc,在差异的条件下被触发。
young gc
产生在年青代的GC算法,一般工具(除了巨型工具)都是在eden region中分派内存,当所有eden region被耗尽无法申请内存时,就会触发一次young gc,劳务派遣管理系统,这种触发机制和之前的young gc差不多,执行完一次young gc,活泼工具会被拷贝到survivor region可能提升到old region中,空闲的region会被放入空闲列表中,期待下次被利用。
参数 | 寄义 |
---|---|
-XX:MaxGCPauseMillis | 配置G1收集进程方针时间,默认值200ms |
-XX:G1NewSizePercent | 新生代最小值,默认值5% |
-XX:G1MaxNewSizePercent | 新生代最大值,默认值60% |
mixed gc
当越来越多的工具提升到暮年月old region时,为了制止堆内存被耗尽,虚拟时机触发一个殽杂的垃圾收集器,即mixed gc,昆山软件公司,该算法并不是一个old gc,除了接纳整个young region,还会接纳一部门的old region,这里需要留意:是一部门暮年月,而不是全部暮年月,可以选择哪些old region举办收集,从而可以对垃圾接纳的耗时时间举办节制。
那么mixed gc什么时候被触发?
先回首一下cms的触发机制,假如添加了以下参数:
-XX:CMSInitiatingOccupancyFraction=80 -XX:+UseCMSInitiatingOccupancyOnly