JVM之GC调优原理(七)

1     G1(Garbage-First)收集器

1.1   总体概述

1.2   启动参数

1.3   基本概念

1.3.1 堆区布局

1.3.2 GC周期

图1

如上图1所示,GC周期抽象成一个圆圈,包括两个阶段,上半圈阶段定义为仅年轻代收集阶段(Young-only),下半圈阶段定义为空间回收阶段(Space Reclamation),两个阶段以顺时针的方向持续变换,从而实现了G1的GC周期,下面详细论述这两个阶段的运行机制。

仅年轻代收集阶段(Young-only):上半圈开始时,执行普通式年轻代收集操作(类似于前面收集器类型中所述的minor collection,GC操作时间较短,上半圈中较小的蓝色实点),其主要任务是不断增长年轻代堆区的存活对象并最终将其复制到老年代堆区中。当老年代堆区被占用的空间大于设定的临界值,则触发并发标记过程,该过程从以下几个方面来说明:

  • 并发开始(Concurrent Start),该时刻表示并发标记过程的开始,紧接着执行并发标记(上半圈中较大的蓝色实点)操作以及一些普通型年轻代收集操作。并发标记操作的任务是确定当前老年代堆区中所有可达的存活对象,供给紧接着的下一阶段(下半圈的空间回收阶段)使用。因为是并行操作,所以普通型年轻代收集操作也会同时并发地执行。当重新标记操作(Remark,上半圈中较大的黄色实点)与清除操作(Cleanup,上半圈中较大的黄色实点)完成的时候,则并发标记过程结束。

    由前面章节的论述可知,JVM使用启发式的行为分析方法优化其GC操作,在上述并发标记开始的时候,JVM会不断收集并分析应用与GC的行为数据,从而确定是否需要执行后续的Remark与Cleanup操作,如果不需要,则JVM执行一个短时间的并发标记重做操作,然后往顺时针方向继续执行。

  • 重新标记(Remark),这是一个在GC暂停下的标记操作,与前面所述的并发标记操作形成一个完整的标记过程。重新标记主要处理对象的引用关系、卸载类、回收空区域以及清空内部数据结构。在Remark与CleanUp之间存在一个并发的普通型年轻代GC操作,其作用是为后续的CleanUp操作提供数据计算与数据分析的信息,该信息包括即将被回收的老年代堆区域空间。

  • 清除(CleanUp),这是一个在GC暂停下的清除操作,回收前面步骤提供的待清除的老年代堆空间。同时,该操作也通过计算确定是否需要开始下一阶段(Space Reclamation)的操作,如果需要,则为下一阶段做些简单的准备,如果不需要,则重新开始执行Young-only阶段。

空间回收阶段(Space Reclamation):下半圈包括很多大小相同的粉红色实点,其大小与前一阶段所示的普通式年轻代收集操作的实点大小一样,但颜色不同,其表示的意义是,这是一种混合式年轻代收集操作,其混合的操作包括普通式年轻代操作、腾挪式地复制老年代堆空间的存活对象到新老年代堆空间中从而回收旧老年代堆空间的操作(压缩存储存活对象),经过多次的混合式操作之后,当G1确定已经腾出并回收足够多的空闲堆空间,则该阶段结束,紧接着开启下一次新的Young-only阶段。

由以上的分析可知,在Space Reclamation阶段中,JVM提供异常流程,如果应用的内存空间不足,则触发完全GC操作(Full GC),完全GC是针对全局内存堆区的GC操作,耗时够长,对应用的吞吐率影响非常明显,所以尽量避免完全GC的发生。当完全GC操作也不能解决问题,则JVM会抛出OutOfMemoryException的异常信息,说明GC总暂停时间已经占用应用总运行时间的98%以上。

(未完待续)

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wangys2006

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值