G1收集器

一、Young gc(STW)

触发时机:eden空间不足时,G1触发young gc回收新生代空间。
回收对象:每次young gc会选定所有新生代region,同时根据停顿时间动态调整新生代所占region个数来控制young gc开销。如果存在大对象,默认也会回收Humongous region。
回收算法:整体来看属于标记-整理,从局部region角度来看属于复制算法。
回收过程:young gc主要过程分为:
Root扫描,RS扫描,Evacuation(对象拷贝)。

二、Mixed gc

触发时机
主要由以下三个参数控制,回收过程会详解
InitiatingHeapOccupancyPercent(设置触发并发标记周期的Java堆占用阈值,默认45)。
G1MixedGCLiveThresholdPercent (会被MixGC的Region中存活对象占比,默认85),old generation region中的存活对象的占比,只有小于此参数,才会被选入CSet,避免mixed gc大量对象复制。
G1HeapWastePercent(触发Mixed GC的可回收空间百分比,默认10),在global concurrent marking结束之后,我们可以知道old gen regions中有多少空间要被回收,在每次YGC之后和再次发生Mixed GC之前,会检查垃圾占比是否达到此参数,只有达到了,才会触发Mixed GC。
回收对象:所有新生代region和部分老年代region,G1会选择回收部分老年代region来满足MaxGCPauseMillis(最大停顿时间)。
回收算法:整体来看属于标记-整理,从局部region角度来看属于复制算法。
回收过程
mixed gc主要过程分为全局并发标记和Evacuation对象拷贝,全局并发标记结束后会触发一次Young gc,接着进行mixed gc(满足条件的情况下)。

  • 全局并发标记
    达到InitiatingHeapOccupancyPercent阈值会触发全局并发标记,该阶段又可以近一步细分成下面几个步骤:
    初始标记(initial mark,STW)。它标记了从GC Root开始直接可达的对象。初始标记阶段借用young GC的暂停,因而没有额外的、单独的暂停阶段。
    并发标记(Concurrent Marking)。这个阶段从GC Root开始对heap中的对象标记,标记线程与应用程序线程并行执行,并且收集各个Region的存活对象信息。
    最终标记(Remark,STW)。标记那些在并发标记阶段发生变化的对象,将被回收。
    清除垃圾(Cleanup,部分STW)。 清除空Region,这个阶段如果发现完全没有活对象的region就会将其整体回收到可分配region列表中。
  • Mixed gc(STW)
    达到G1HeapWastePercent阈值会触发Mixed gc,该阶段主要做Evacuation(对象拷贝)。Evacuation阶段是全暂停的。它负责把一部分region里的活对象拷贝到空region里去(并行拷贝),然后回收原本的region的空间。Evacuation阶段可以自由选择任意多个region来独立收集构成收集集合(collection set,简称CSet),CSet集合中Region的选定依赖于上文中提到的停顿预测模型和G1MixedGCLiveThresholdPercent阈值,该阶段并不evacuate所有有活对象的region,只选择收益高的少量region来evacuate,这种暂停的开销就可以(在一定范围内)可控。
    mixed gc类似CMS对老年代的major gc,在CMS中其规则为只要老年代连续空间大于新生代对象总大小或历次晋升老年代平均值就进行minor gc,否则将进行major gc。
三、Full gc(STW)

触发条件
1、metaspace(方法区)可用空间不足。
2、G1在对象复制/转移失败或者没法分配足够内存(比如巨型对象没有足够的连续分区分配)时,会触发FullGC。full gc指退化为使用serial old收集器回收的情况,其为单线程STW型收集器,停顿时间可达秒级,对性能影响极大。但在jdk10版本的G1 GC会有很多优化,Full CG方面,将提供并发标记的Full GC方案:Parallelize Mark-Sweep-Compact。

四、其它

对象分配:
TLAB:本地线程分配缓冲,server端默认启用,位于Eden区。当多线程分配内存区块时,因为内存分配和初始化数据是不同的步骤,所以在分配时需要对内存区块上锁,由此会引发区块锁竞争问题。此参数会让线程预先分配一块属于自己的空间(64K-1M),分配时先在自己的空间上分配,不足时再申请,这样就不存在内存区块锁的竞争,提高分配效率。
Eden:正常对象分配位置。
Humongous region:大于G1HeapRegionSize阈值(region大小)的一半,会将对象分配到一个或多个连续的Humongous region。
参考:
https://www.redhat.com/en/blog/collecting-and-reading-g1-garbage-collector-logs-part-2#
https://blog.csdn.net/qq_27529917/article/details/86664677
https://www.jianshu.com/p/548c67aa1bc0

你可能感兴趣的:(G1收集器)