G1
www.jianshu.com/p/0f1f5adffdc1
G1中提供了三种模式垃圾回收模式,young gc、mixed gc 和 full gc,在不同的条件下被触发
1,年轻代gc的时机
当所有eden region被耗尽无法申请内存时,就会触发一次young gc,这种触发机制和之前的young gc差不多,执行完一次young gc,活跃对象会被拷贝到survivor region或者晋升到old region中,空闲的region会被放入空闲列表中,等待下次被使用
2,mixed gc
当越来越多的对象晋升到老年代old region时,为了避免堆内存被耗尽,虚拟机会触发一个混合的垃圾收集器,即mixed gc,该算法并不是一个old gc,除了回收整个young region,还会回收一部分的old region,这里需要注意:是一部分老年代,而不是全部老年代,可以选择哪些old region进行收集,从而可以对垃圾回收的耗时时间进行控制
,mixed gc中也有一个阈值参数 -XX:InitiatingHeapOccupancyPercent(计算时机是young gc后,所以可以认为是老年代占比) 当老年代大小占整个堆大小百分比达到该阈值时,会触发一次mixed gc
3,full gc
如果对象内存分配速度过快,mixed gc来不及回收,导致老年代被填满,就会触发一次full gc,G1的full gc算法就是单线程执行的serial old gc,会导致异常长时间的暂停时间,需要进行不断的调优,尽可能的避免full gc.
同CMS一样,G1也是关注停顿时间,不过它是可控的,它被设计用来取代CMS,因为它是空间整理所以没有CMS那么严重的空间碎片问题,同时提供可控的停顿时间。 特性: 1.G1不同于之前的那些垃圾收集器分为连续的年轻代,老年代和永久代,而是分区(region),它将堆分为大大小小的区域(通常约为2048个),每个区域就是eden,survivor,old 2.一般优先回收包含垃圾最多的区域,所以叫Garbage-First(G1) 3.之前的垃圾收集器要么是新生代,要么是老年代,而G1兼顾年轻代和老年代 4.可控性:因为G1可以选择回收部分区域,所以可以做到停顿时间的可控性 G1回收过程: 1.新生代GC 区别是会动态调整新生代大小,基于历史ygc信息和-XX:MaxGCPauseMillis设置的停顿时间。 2.并发标记周期 3.混合回收 4.Full GC -XX:InitiatingHeapOccupancyPercent=45 整堆使用达到这个比例后,触发并发标记周期,默认 45%。 如果要降低晋升失败的话,通常可以调整这个数值,使得并发周期提前进行 Mixed GC不是 Full GC,它只能回收部分老年代的 Region而不是全部的Region,如果 Mixed GC实在无法跟上程序分配内存的速度,导致老年代填满无法继续进行 Mixed GC,就会退化然后使用 serial old GC( Full GC) 来收集整个 GC heap。所以本质上,G1是不提供 Full GC的。所以总的来说,G1的运行过程是这样的:会在 Young GC和Mixed GC之间不断地切换运行,同时定期地做全局并发标记,在实在赶不上对象创建速度的情况下 使用Full Gc( Serial GC) 晋升老年代时机: 对象的年龄达到了MaxTenuringThreshold(默认15)能晋升老年代; 在Survivor空间中相同年龄所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代,无须等到MaxTenuringThreshold中要求的年龄。 -XX:MaxTenuringThreshold 晋升年龄最大阈值,默认15。在新生代中对象存活次数(经过YGC的次数)后仍然存活,就会晋升到老年代 -XX:TargetSurvivorRatio 设定survivor区的目标使用率。默认50,即survivor区对象目标使用率为50%。 巨型对象会直接在老年代分配,所占用的连续空间称为巨型分区 G1内部做了一个优化,一旦发现没有引用指向巨型对象,则可直接在年轻代收集周期中被回收。
生产服务器
[Eden: 2454.0M(2454.0M)->0.0B(2454.0M) Survivors: 2048.0K->2048.0K Heap: 2570.9M(4096.0M)->117.0M(4096.0M)]
2454/4096=60%
G1 eden区动态增长,直到达到最大值
-XX:G1HeapRegionSize 默认值 2M
-XX:MaxGCPauseMillis 设置G1收集过程目标时间,默认值200ms
-XX:G1NewSizePercent 新生代最小值,默认值5%
-XX:G1MaxNewSizePercent 新生代最大值,默认值60%
G1垃圾收集算法主要应用在多CPU大内存的服务中,在满足高吞吐量的同时,竟可能的满足垃圾回收时的暂停时间,该设计主要针对如下应用场景:
垃圾收集线程和应用线程并发执行,和CMS一样
空闲内存压缩时避免冗长的暂停时间
应用需要更多可预测的GC暂停时间
不希望牺牲太多的吞吐性能
不需要很大的Java堆
-XX:G1HeapRegionSize
在G1算法中,采用了另外一种完全不同的方式组织堆内存,堆内存被划分为多个大小相等的内存块(Region),每个Region是逻辑连续的一段内存,结构如下 ,其中H是以往算法中没有的,它代表Humongous,这表示这些Region存储的是巨型对象(humongous object,H-obj),当新建对象大小超过Region大小一半时,直接在新的一个或多个连续Region中分配,并标记为H