G1收集器

G1收集器是在JDK1.7开始可以设置使用,在JDK1.9时设置为默认垃圾收集器。G1收集器和其他收集器相比有以下特点

  • 并行与并发:G1能充分利用多CPU、多核的硬件优势,来缩短Stop-The-World停顿时间
  • 分代收集:和其他收集器相同,分代概念依然保留。G1收集器不需要其他收集器的配合就可以管理整个堆,可以根据不同的方式去处理新创建的对象、存活了一段时间的对象和熬过多次GC的对象。
  • 空间整合:不同于CMS的标记-清理,G1采用的是标记-整理的方式来处理碎片化的空间。这种方式意味着G1收集器运作期间不会产生内存空间碎片,收集后提供规整的可用空间
  • 可预测的停顿:G1相对于CMS另外一个更大的优势,就是可以设置可预测的停顿模型,能够使开发者明确指定在长度为M毫秒的时间片段内,消耗在垃圾收集器上的时间不能超过M毫秒。

    G1提供了三种模式的垃圾回收

    1、Minor GC 2、Mixed GC 3、Full GC

     在G1当中把堆内存分成了一个个Region,新生代,老年代不再是物理上面的分割,而是逻辑上的分割

     

       Minor GC

       当eden区满的时候,会触发一次Minor GC,这种触发机制和之前的其他垃圾收集器差不多,都是将Eden区和其中一个Survivor区的存活对象拷贝到另外一个Survivor区或者晋升到Old 区域,然后清空Eden区和Survivor区。

       Mixed GC

        当越来越多的年轻代中的对象晋升到老年代,会触发一次混合的垃圾收集器。也就是除了回收老年代,也会回收年轻代。这里是一部分老年代,可以选择哪些老年代的对象需要收集。

      Full GC

       如果对象内存分配的过快,mixed gc来不及回收,老年代被填满,就会触发Full GC.G1的Full GC就是Serial Old gc, 会暂停工作线程。

   G1收集器的大概的工作过程

    1、初始标记,整个过程STW,标记了从GC Roots 的可达对象

    2、并发标记 ,真个过程用户线程的垃圾回收线程共同执行,标记出GC Roots可达对象的关联对象,收集整个Region的存活对象。

    3、最终标记,整个过程STW,标记出并发标记遗漏的,以及引用关系发生变化的存活对象。

    4、筛选回收,垃圾清理过程,如果整个Region没有存活对象,将Region加入到存活列表当中。

 

你可能感兴趣的:(jvm)