riches

一、G1垃圾收集器简介

  为什么单独写一篇文章来记录G1垃圾收集器的学习过程呢?因为上一篇文章主要都是针对8G内存以下的服务器来进行总结的,G1的特点主要是针对大内存的机器,讲道理一般的公司也基本上用不到那么大的内存,所以这篇文章先单独记录一下吧~

  简介:G1 (Garbage-First)是一款面向服务器的垃圾收集器,主要针对配备多核处理器及大容量内存的机器

  特点:STW停顿时间敏感,提升用户体验,高吞吐量,CPU利用率高。

  从上图看,G1将Java堆划分为多个大小相等的独立区域(Region),每一个小方格代表一个Region,JVM最多可以有2048个Region。

  一般Region大小等于堆大小除以2048,比如堆大小为4096M,则Region大小为2M,当然也可以用参数-XX:G1HeapRegionSize手动指定Region大小,但是推荐默认的计算方式

  G1保留了年轻代和老年代的概念,但不再是物理隔阂了,它们都是(可以不连续)Region的集合

  一个Region可能之前是年轻代,如果Region进行了垃圾回收,之后可能又会变成老年代,也就是说Region的区域功能可能会动态变化

  默认年轻代对堆内存的占比是5%,在系统运行中,JVM会不停的给年轻代增加更多的Region,但是最多新生代的占比不会超过60%。

  PS:年轻代中的Eden和Survivor对应的region也跟之前一样,默认8:1:1

Humongous区

  G1垃圾收集器对于对象什么时候会转移到老年代跟之前讲过的原则一样,唯一不同的是对大对象的处理,G1有专门分配大对象的Region叫Humongous区,而不是让大对象直接进入老年代的Region中。在G1中,大对象的判定规则就是一个大对象超过了一个Region大小的50%,比如每个Region是2M,只要一个对象超过了1M,就会被放入Humongous中,而且一个大对象如果太大,可能会横跨多个Region来存放。

  作用:Humongous区专门存放短期巨型对象,不用直接进老年代,可以节约老年代的空间,避免因为老年代空间不够的GC开销

  PS:Full GC的时候除了收集年轻代和老年代之外,也会将Humongous区一并回收。

二、G1垃圾收集器GC步骤

初始标记【STW】

  暂停所有的其他线程(STW),并记录下gc roots直接能引用的对象,速度很快。(同CMS)

并发标记

  并发标记阶段就是从GC Roots的直接关联对象开始遍历整个对象集合的过程, 这个过程耗时较长但是不需要停顿用户线程, 可以与垃圾收集线程一起并发运行。(同CMS)

重新标记/最终标记【STW】

  重新标记阶段就是为了修正并发标记期间因为用户程序继续运行而导致标记产生变动的那一部分对象的标记记录,这个阶段的停顿时间一般会比初始标记阶段的时间稍长,远远比并发标记阶段时间短。(同CMS)

筛选回收【STW】

  定义:筛选回收阶段首先对各个Region的回收价值和成本进行排序,根据用户所期望的GC停顿时间(可以用JVM参数 -XX:MaxGCPauseMillis指定)来制定回收计划

  举个

分类:

技术点:

相关文章: