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

相关推荐
q***46521 天前
基于SpringBoot和PostGIS的各省与地级市空间距离分析
java·spring boot·spring
狂团商城小师妹1 天前
JAVA国际版同城服务同城信息同城任务发布平台APP源码Android + IOS
android·java·ios
后端小张1 天前
【JAVA 进阶】Spring Boot 自动配置原理与自定义 Starter 实战
java·spring boot·后端·spring·spring cloud·自定义·原理
q***18841 天前
搭建Golang gRPC环境:protoc、protoc-gen-go 和 protoc-gen-go-grpc 工具安装教程
开发语言·后端·golang
Zzzzmo_1 天前
Java数据结构:二叉树
java·数据结构·算法
多多*1 天前
一个有 IP 的服务端监听了某个端口,那么他的 TCP 最大链接数是多少
java·开发语言·网络·网络协议·tcp/ip·缓存·mybatis
Kay_Liang1 天前
Spring IOC核心原理与实战技巧
java·开发语言·spring boot·spring·ioc·依赖注入·控制反转
不惑_1 天前
[特殊字符] 在 Linux 上设置 SQLite
linux·jvm·sqlite
xcLeigh1 天前
Rust入门:基础语法应用
开发语言·rust·编程·教程·基础语法
Mr.wangh1 天前
单例模式&阻塞队列详解
java·开发语言·单例模式·多线程·阻塞队列