G1垃圾收集器

1.G1的设计原则就是简化JVM性能调优,开发人员只需要简单的三步即可完成调优:

  第一步,开启G1垃圾收集器;

  第二步,设置堆的最大内存;

  第三步,设置最大的停顿时间

  G1中提供了三种模式垃圾回收模式,Young GC、Mixed GC 和 Full GC,在不同的条件 下被触发

2.原理

  G1垃圾收集器相对比其他收集器而言,最大的区别在于它取消了年轻代、老年代的物理 划分,取而代之的是将堆划分为若干个区域(Region),这些区域中包含了有逻辑上的 年轻代、老年代区域。这样做的好处就是,我们再也不用单独的空间对每个代进行设置了,不用担心每个代内 存是否足够。在G1划分的区域中,年轻代的垃圾收集依然采用暂停所有应用线程的方式,将存活对象拷贝到老年代或者Survivor空间,G1收集器通过将对象从一个区域复制到另外一个区 域,完成了清理工作。

  在G1中,有一种特殊的区域,叫Humongous区域:如果一个对象占用的空间超过了分区容量50%以上,G1收集器就认为这是一个巨型对象;这些巨型对象,默认直接会被分配在老年代,但是如果它是一个短期存在的巨型对象,就会对垃圾收集器造成负面影响;为了解决这个问题,G1划分了一个Humongous区,它用来专门存放巨型对象。如果 一个H区装不下一个巨型对象,那么G1会寻找连续的H分区来存储。为了能找到连续的H区,有时候不得不启动Full GC。

3.Young GC

  Young GC主要是对Eden区进行GC,它在Eden空间耗尽时会被触发。

  Eden空间的数据移动到Survivor空间中,如果Survivor空间不够,Eden空间的部分 数据会直接晋升到年老代空间;Survivor区的数据移动到新的Survivor区中,也有部分数据晋升到老年代空间中;最终Eden空间的数据为空,GC停止工作,应用线程继续执行

4.Mixed GC

  当越来越多的对象晋升到老年代old region时,为了避免堆内存被耗尽,虚拟机会触发一 个混合的垃圾收集器,即Mixed GC,该算法并不是一个Old GC,除了回收整个Young Region,还会回收一部分的Old Region,这里需要注意:是一部分老年代,而不是全部 老年代,可以选择哪些old region进行收集,从而可以对垃圾回收的耗时时间进行控制。 也要注意的是Mixed GC 并不是 Full GC。

  MixedGC什么时候触发? 由参数 -XX:InitiatingHeapOccupancyPercent=n 决定。默 认:45%,该参数的意思是:当老年代大小占整个堆大小百分比达到该阀值时触发。

  它的GC步骤分2步:全局并发标记(global concurrent marking);拷贝存活对象(evacuation)

原文地址:https://www.cnblogs.com/Life-is-Demo/p/13644652.html