Apache Ignite 2.10.0升级后堆内存耗尽频繁触发Full GC问题咨询
Apache Ignite 2.7.1升级2.10.0后频繁Full GC问题解答
该问题并非堆内存不足导致,而是Apache Ignite 2.10.0版本存在的已知BUG与你当前配置叠加引发的内存泄漏问题,具体说明如下:
问题根源
- 你配置了
UriDeploymentSpi每5秒扫描部署目录更新,Apache Ignite 2.8~2.10版本存在该组件的类加载器内存泄漏BUG:扫描过程中重复生成的类加载器实例无法被GC回收,会在堆中持续堆积类元数据、临时对象,随着运行时间增长最终触发频繁Full GC,调大堆内存只会延后问题爆发时间,无法彻底解决。 - 你当前的G1GC配置未开启类卸载功能,进一步加剧了泄漏类对象的堆积速度。
验证方式
你可以通过以下操作快速确认问题:
- 执行
jmap -histo:live <节点进程ID> | grep UriDeploymentSpi,观察该类实例数是否随运行时间持续上涨,远高于1 - 执行
jstat -class <节点进程ID>,观察已加载类数量是否持续上升,无稳定阈值
修复方案
- 优先选择升级到Apache Ignite 2.11.0及以上版本,该类加载泄漏BUG已在2.11版本被官方修复
- 若暂时无法升级版本,可先关闭
UriDeploymentSpi的自动扫描,改为手动触发部署更新,同时在JVM参数中添加-XX:+ClassUnloading -XX:+ClassUnloadingWithConcurrentMark开启G1GC的类卸载能力,缓解泄漏速度 - 额外优化:你当前配置的各类线程池大小(128)过高,可根据节点CPU核心数调整为核心数*2~4的范围,减少不必要的线程对象开销
堆内存评估
你当前配置的12G堆内存对于开启原生持久化的Ignite节点完全足够,除非存在大量大结果集SQL查询、大规模批量写入场景,否则不需要继续调大堆内存。
内容的提问来源于stack exchange,提问作者ibrahim halil altun
相关产品推荐
相关产品推荐

