JVM之GC调优原理(六)

1     G1(Garbage-First)收集器

G1是JDK新版本的默认GC收集器,本章节主要论述其运行机制。

1.1   总体概述

G1收集器设计的目标是面向拥有大规模内存容量以及多处理器的主机系统,目的是满足更短的GC暂停时间目标以及获得更高的吞吐率目标,而只需要很少的参数配置,另外,G1也能在延迟性以及吞吐率两者之间提供最好的平衡,其适合的使用场景是:

  • 拥有几十GB或以上的堆空间大小,大于50%的堆空间被存活对象占用

  • 新建对象与增长对象(年龄代增长)的比率,随着时间的变化非常显著

  • 堆空间有大量的内存碎片

  • GC最大暂停时间为几百毫秒

由前面章节的论述可知,基于并行收集器的原理,G1收集器GC操作的部分工作负载是与应用并行执行(not stop the world),部分工作负载是在应用暂停的情况下执行(stop the world),使用并发编程模型的目的是既能不影响应用的正常运行也能有效降低GC的暂停时间。

相对于前面章节描述的收集器类型,G1收集器的GC暂停时间能大幅度地降低,但是由于与应用并行地执行GC收集操作,所以其吞吐率会受到轻微的影响而有所降低。

1.2   启动参数

用户可以使用-XX:+UseG1GC命令行参数显式地指定使用G1收集器,当然,如果不指定则JVM默认使用G1收集器(JDK新版本)。

1.3   基本概念

类似于前面所述的收集器,G1的堆空间也是基于分年龄代的实现原理,但是,G1的不同之处是其年龄代只是从逻辑上划分(虚拟的),并没有从堆空间的物理位置上划分,所以其存取对象的方式比前面所述的收集器的方式更加灵活、更加高效。也就是说,G1收集器大部分的工作负载是专注于高效地处理年轻代存活对象的空间存储问题,而只是偶尔地处理老年代非存活对象的空间释放问题。

G1为了提升应用系统的吞吐率,分配部分GC工作负载在GC的暂停阶段执行。同样地,G1为了缩短GC暂停时间,分配部分工作负载与应用并发地执行,例如标记全局堆区的操作、增量式分步骤地释放老年代堆区的非存活对象占用空间的操作。另外,G1持续不断地收集应用运行的数据信息、GC操作的数据信息,并且对这些数据信息进行全面综合的预测分析,以求更准确地估算出GC工作负载的执行优先级(能大幅度地提升运行效能的优先级更高),然后优先处理这部分GC工作负载,例如,应优先释放回收占据大部分非存活对象的那部分堆空间。

G1根据其堆空间的布局特点(将在后面章节论述),使用了一种更加高效的释放堆空间的方式(腾挪式):把存活对象从旧堆区压缩后复制到新堆区,然后释放旧堆区的空间给应用新建的存活对象使用。

G1只是部分工作负载实现并行化,并非一个完全的实时收集器,G1是在应用长时间的运作下维护一个平均的更低的GC暂停时间,而不是一个固定不变的GC暂停时间。

由以上的分析可知,G1收集器是一个通用的、增量式的、并行的、大部分收集工作负载是并发地执行的、部分收集工作负载是在GC暂停下执行的、腾挪式释放堆空间的、随时监控GC暂停目标的GC收集器。

1.3.1 堆区布局

G1收集器的内存布局如下图1所示:

图1

G1堆空间被划分为很多大小相同的区域(如上图1所示的灰色小堆区),每个区域作为一块连续的虚拟内存空间,被划分的区域作为内存申请与内存释放的GC操作单元。JVM刚启动时,这些区域都是空的,G1根据应用的请求分配给年轻代或者老年代,分配完成之后应用可以在指定的区域内为存活对象申请堆空间。

如上图1所示,年轻代包括Eden区域(不带S标识的红色区)以及Survivor区域(带S标识的红色区),这些区域实现的功能与前面所述的收集器类型一样,不同之处是,其他收集器类型的堆区分布从逻辑上与物理上都是连续的区域,但是G1收集器在逻辑上与物理上都是不连续的(使用区域标识)。

如上图1所示,老年代包括普通区域(不带H标识的浅蓝色区域)以及大堆区域(带H标识的浅蓝色大区域),大堆区域是由上述的多个区域单元构成。

一般情况下新建的存活对象都是在年轻代区域中申请堆空间,但是对于新建的大对象(大数据集的对象)则直接在上述老年代的大堆区域中申请堆空间。

(未完待续)

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

wangys2006

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

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

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

打赏作者

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

抵扣说明:

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

余额充值