降低85%的gc发生率:ES的GC调优实践!

#大数据/ES #经验 #性能

ES的服务日志出现一些gc overhead现象,经过调优对比,gc发生率显著下降了85%,分享参数如下:

ES的G1GC参数(多实例)

-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-XX:InitiatingHeapOccupancyPercent=40
-XX:+ParallelRefProcEnabled
-XX:+ExplicitGCInvokesConcurrent
-XX:ParallelGCThreads=8

切记!注意行尾不能带任何空格或者乱七八糟的换行符!

否则可能遇到如下启动失败报错(行尾有空格,没注意到):

Unrecognized VM option 'UseG1GC  '
Did you mean '(+/-)UseG1GC'?

参数介绍:

  • -XX:+UseG1GC:启用G1垃圾收集器。

  • -XX:MaxGCPauseMillis=200:设置最大GC暂停时间为200毫秒。这个值可以根据实际情况进行调整,以实现更好的系统性能。

  • -XX:InitiatingHeapOccupancyPercent=35:当堆的使用率达到35%时,G1垃圾收集器将启动混合收集。这个值也可以根据实际情况进行调整。

  • -XX:+ParallelRefProcEnabled:启用并行引用处理。

  • -XX:+ExplicitGCInvokesConcurrent:显式GC调用并发处理。

G1GC的参数介绍

JVM G1GC(Garbage-First Garbage Collector)是Java虚拟机中的一种垃圾收集器,它以高吞吐量和可预测的停顿时间为目标,特别适合需要大内存和多核处理器的服务器应用。针对G1GC的设置,以下是一些建议的最佳实践方案:

  1. 初始堆大小(-Xms)和最大堆大小(-Xmx)

    • 根据应用的内存需求设定这两个值,以确保应用在启动和运行过程中有足够的内存资源。

    • 通常建议将-Xms和-Xmx设置为相同的值,以减少运行时堆内存的动态调整,从而降低额外的性能开销。

    • 具体数值依赖于应用的具体需求,可以通过性能测试来确定合适的值。

  2. 新生代大小

    • G1GC中新生代的大小是动态调整的,不需要显式设置。

    • 但可以通过调整-XX:G1NewSizePercent(新生代最小占比)和-XX:G1MaxNewSizePercent(新生代最大占比)来控制新生代大小的上下限。

    • 默认情况下,G1GC会根据应用的运行情况自动调整新生代的大小。

  3. 老年代大小

    • G1GC中老年代的大小也是动态调整的。

    • 老年代的大小主要受到总堆大小和新生代大小的影响,不需要显式设置。

  4. 垃圾收集线程数(-XX:ParallelGCThreads)

    • 这个参数设置并行垃圾收集时使用的线程数。

    • 默认情况下,G1GC会根据系统的逻辑处理器数量自动调整垃圾收集线程数。

    • 通常情况下,不需要手动设置这个参数,除非有特定的性能调优需求。

  5. 其他相关参数

    • -XX:+UseG1GC:启用G1GC垃圾收集器。

    • -XX:MaxGCPauseMillis:设置G1GC的目标停顿时间,即每次垃圾收集过程中应用线程的最大停顿时间。这个参数对G1GC的性能有很大的影响,需要根据应用的需求和性能测试结果来设定。

    • -XX:InitiatingHeapOccupancyPercent(简称IHOP):设置触发并发GC周期的Java堆占用的百分比阈值。当老年代的使用率达到这个阈值时,G1GC会触发一次混合收集(Mixed GC),以清理老年代和新生代的垃圾对象。

具体推荐配置值

由于具体的应用场景和需求差异较大,很难给出适用于所有情况的推荐配置值。建议根据应用的具体需求和性能测试结果来调整上述参数。例如,可以先使用默认配置进行性能测试,然后根据性能测试结果逐步调整-Xmx-XX:MaxGCPauseMillis-XX:InitiatingHeapOccupancyPercent等关键参数,以达到最佳的性能表现。

G1GC的配置是一个复杂的过程,需要综合考虑应用的需求、硬件资源、性能目标等多个因素。在实际操作中,建议结合官方文档、性能测试结果和社区经验来进行配置和优化。

相关推荐
zwjapple3 分钟前
typescript里面正则的使用
开发语言·javascript·正则表达式
小五Five4 分钟前
TypeScript项目中Axios的封装
开发语言·前端·javascript
小曲程序4 分钟前
vue3 封装request请求
java·前端·typescript·vue
前端每日三省6 分钟前
面试题-TS(八):什么是装饰器(decorators)?如何在 TypeScript 中使用它们?
开发语言·前端·javascript
凡人的AI工具箱19 分钟前
15分钟学 Go 第 60 天 :综合项目展示 - 构建微服务电商平台(完整示例25000字)
开发语言·后端·微服务·架构·golang
陈王卜22 分钟前
django+boostrap实现发布博客权限控制
java·前端·django
小码的头发丝、22 分钟前
Spring Boot 注解
java·spring boot
java亮小白199727 分钟前
Spring循环依赖如何解决的?
java·后端·spring
飞滕人生TYF33 分钟前
java Queue 详解
java·队列
chnming198735 分钟前
STL关联式容器之map
开发语言·c++