JVM之GC调优原理(十三)

1     G1(Garbage-First)收集器

1.1   总体概述

1.2   启动参数

1.3   基本概念

1.3.1 堆区布局

1.3.2 GC周期

1.3.3 GC暂停

1.3.4 收集集合(Collection Set)

1.3.5 记忆集合(Remembered Set)

1.3.6 收集过程

1.4   关键特性

1.4.1 堆空间分配

1.4.2 定期收集

1.4.3 确定堆初始化占比

1.4.4 标记操作

1.4.5 堆空间高负载

1.4.6 大对象存储

1.4.7 默认配置

1.4.8 收集器类型对比

2     G1(Garbage-First)收集器调优

2.1   通用的推荐设置

2.2   切换到G1收集器

2.3   G1性能优化

2.3.1 监控Full GC

2.3.2 大对象内存碎片

2.4   延迟水平优化

2.4.1 系统耗时

2.4.2 引用对象处理耗时

2.4.3 年轻代收集耗时

2.4.4 混合收集耗时

2.4.5 GC的连续性

2.4.6 堆区合并与扫描耗时

2.5   吞吐率优化

由前面的分析可知,G1收集器的默认调整策略是在吞吐率与延迟水平之间保持一种平衡。

然而,在实际的运行环境中,也有一些高吞吐率的需求,提高吞吐率的措施包括降低整体的GC暂停时间以及降低GC操作的频率。其主要的方法是提高最大的GC暂停时间(使用的命令行参数是-XX:MaxGCPauseMillis),G1会根据该调整使用启发式的行为分析方法自动调整与适应年轻代堆空间大小,年轻代堆空间的大小直接决定GC操作的频率。如果G1自动调整年轻代堆空间的大小没有获得期望的效果,则可以直接设置提升最小年轻代堆空间的大小(使用命令行参数是-XX:G1NewSizePercent),该设置可以让G1直接执行年轻代堆空间的分配,而不是自动调整。

在一些使用场景中,可以直接设置最大年轻代堆空间的大小(使用的命令行参数是-XX:G1MaxNewSizePercent),该设置可以直接限制吞吐率。用户可以使用GC日志监控G1收集的运行信息(使用的日志配置是gc+heap=info),Eden区域与Survivor区域的占用比例大概等于最大年轻代堆空间占用总堆空间的比例。因此,用户可以提升最大年轻代堆空间的大小,从而提升吞吐率。

此外,减少GC阶段中的一些并行操作的次数,也可以提升吞吐率,例如,G1对remembered set记忆集合的并发更新操作是非常消耗处理器资源的操作。但是,用户可以将这些并发操作移动到GC暂停阶段执行(使用的命令行参数是-XX:G1RSetUpdatingPauseTimePercent),如果该设置不能获得对应的期望的效果,可以直接关闭并发更新的操作(使用的命令行参数是-XX:-G1UseAdaptiveConcRefinement-XX:G1ConcRefinementGreenZone=2G -XX:G1ConcRefinementThreads=0),这些设置将最大程度地将并发更新操作移动到下一GC阶段中执行。

此外,从操作系统的角度,用户可以提升内存页面的大小(使用的命令行参数是-XX:+UseLargePages),从而提升吞吐率。该设置需要对应调整操作系统的内存页面大小的相关设置,

此外,用户可以设置最小堆空间的大小等于最大堆空间的大小(使用的命令行参数是-Xms 与-Xmx),该设置可以使G1不用启发式地自动调整堆空间的大小。用户也可以使用设置让这些配置工作在JVM启动过程中执行,而不用在业务运行的过程中执行(使用的命令行参数是XX:+AlwaysPreTouch)。

2.6   堆空间优化

G1收集与其他类型的GC收集器一样,其行为是调整堆空间的大小,从而让GC的总暂停时间保持在XX:GCTimeRatio参数设置值之内。用户也可以根据实际的需求调整该参数。

2.7   默认值优化

以下提供一些命令行参数的配置描述,其中ergo标识JVM使用启发式的行为分析方法确定该默认值,用户也可以根据实际需求自行设置。

-XX:+G1UseAdaptiveConcRefinement

-XX:G1ConcRefinementGreenZone=<ergo>

-XX:G1ConcRefinementYellowZone=<ergo>

-XX:G1ConcRefinementRedZone=<ergo>

-XX:G1ConcRefinementThreads=<ergo>

以上的设置标识,G1消耗在并发更新记忆集合(remembered set)的处理器资源,可以设置该功能使用的总线程数,以及总线程数的分布。G1将使用这些设置调整XX:G1RSetUpdatingPauseTimePercent参数值,然后确定移动到GC暂停阶段中处理所消耗的处理器资源。

这些参数设置会引起GC暂停时间的增加,需要根据实际需求确定其准确的调整值。

-XX:+ReduceInitialCardMarks

以上的参数设置,可以批量处理并发更新记忆集合,该操作主要是对新申请内存空间的对象

-XX: +ParallelRefProcEnabled

-XX:ReferencesPerThread=1000

以上参数设置,标识每个线程处理的引用对象数量,其上界值由-XX:ParallelGCThreads参数值确定,如果-XX:ReferencesPerThread=0,则-XX:ReferencesPerThread值等于-XX:ParallelGCThreads设置值。

启动该设置,也确定java.lang.Ref.*中的对象实例是否启动并发收集操作。

-XX:G1RSetUpdatingPauseTimePercent=10

以上参数设置,标识G1消耗在并发更新记忆集合的时间占用总GC时间的比例

-XX:G1SummarizeRSetStatsPeriod=0

以上参数设置,标识生成并发更新记忆集合的操作信息报告,该统计操作非常消耗系统的资源。设置等于0,标识关闭此功能,根据实际需求可以启用该统计。日志格式是gc+remset=trace

-XX:GCTimeRatio=12

以上参数设置,标识消耗的GC时间占用总应用时间的比例,使用公式1 / (1 + GCTimeRatio)计算,默认是占用8%

-XX:G1PeriodicGCInterval=0

以上的参数设置,标识是否启用周期性的GC操作,设置值等于0标识关闭此功能

-XX:+G1PeriodicGCInvokesConcurrent

以上参数设置,在启用周期性GC的情况下,标识触发一个并发标记操作或者继续执行已存在的GC操作周期,否则触发Full GC

-XX:G1PeriodicGCSystemLoadThreshold=0.0

以上参数设置,在启用周期性GC的情况下,标识G1调用getloadavg()系统方法返回当前系统的负载,从而确定是否触发一次周期性的GC操作。当该系统负载返回值大于以上设置值,则不触发一次周期性的GC操作。该设置等于0,标识不启用该检测。

(未完待续)

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
JVM参数是为了提高Java应用程序的性能和稳定性。下面是一些常见的JVM参数的思路和建议: 1. 堆内存设置: - -Xms: 初始堆大小,建议与-Xmx相同,避免堆大小的动态整。 - -Xmx: 最大堆大小,根据应用程序的需求进行设置,避免频繁的垃圾回收。 2. 垃圾回收器选择: - -XX:+UseParallelGC: 使用并行垃圾回收器,适合多核CPU和高吞吐量应用。 - -XX:+UseConcMarkSweepGC: 使用CMS垃圾回收器,适合响应时间先的应用。 - -XX:+UseG1GC: 使用G1垃圾回收器,适合大内存应用和低延迟要求。 3. 垃圾回收参数: - -XX:NewRatio: 设置新生代和老年代的比例,默认为2,可以根据应用程序的对象生命周期进行整。 - -XX:SurvivorRatio: 设置Eden区和Survivor区的比例,默认为8,可以根据对象的存活率进行整。 - -XX:MaxTenuringThreshold: 设置对象进入老年代的年龄阈值,默认为15,可以根据对象的存活率和内存情况进行整。 4. 线程相关参数: - -Xss: 设置线程栈的大小,默认为1M,可以根据应用程序的线程数量进行整。 - -XX:ParallelGCThreads: 并行垃圾回收的线程数量,默认为CPU核心数的1/8,可以根据CPU和内存情况进行整。 5. 其他常用参数: - -XX:+UseCompressedOops: 使用压缩指针,可以减少对象引用的内存消耗。 - -XX:+DisableExplicitGC: 禁用显示用System.gc()方法,避免不必要的垃圾回收。 以上是一些常见的JVM参数策略,具体的效果和最佳参数设置还需要根据应用程序的实际情况进行测试和整。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

wangys2006

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

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

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

打赏作者

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

抵扣说明:

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

余额充值