Solr7.7升级后堆内存100%占用崩溃,同配置Solr6.6无GC问题,求故障诱因
Solr 6.6升级7.7 GC异常崩溃可能原因
堆内存快照中
Term、BytesRef、PhraseQuery三类实例合计占用超过7G堆内存,是GC异常的直接诱因,对应根因如下:
- 缓存策略版本不兼容:Solr 7.7使用的Lucene 7.x内核重构了查询缓存实现,默认会缓存全量Term关联的查询对象,6.6版本的缓存配置(
queryCache、filterCache的大小、条目上限)直接复用会导致缓存溢出,大量实例长期驻留老年代,无法被年轻代GC回收,最终触发长时间STW的Full GC。 - 短语查询处理逻辑变更:Solr 7.x对多词短语查询的分词匹配逻辑做了调整,相同查询语句会生成数倍于6.6版本的Term实例,旧配置中没有限制短语查询的最大词数,大量临时生成的Term、BytesRef对象来不及被GC回收就晋升到老年代,快速占满老年代空间。
- 默认参数适配问题:Solr 7.7默认开启的查询缓存预热、排序查询自动转过滤器逻辑,会重复生成大量BooleanClause实例;同时7.x版本的更新日志默认配置的VersionBucket数量是6.6的3倍以上,堆快照中137万+VersionBucket实例额外占用大量老年代内存,进一步加剧内存紧张。
- JVM参数适配问题:使用的JDK 11.0.5默认G1GC配置对Solr这类短生命周期大对象密集的场景适配不佳,对象晋升老年代的阈值过低,本应在年轻代回收的临时查询对象直接进入老年代,加速老年代内存耗尽。
快速验证调整建议
- 替换缓存配置为Solr 7.7官方默认的缓存参数,将
queryCache、filterCache的最大条目数下调为原有配置的60%,重启后观察GC指标 - 开启慢查询日志,限制单条查询的短语最大长度,避免超长短语查询生成海量Term实例
- 调整JVM参数,将
-XX:MaxTenuringThreshold调整为15,年轻代内存占比提升至总堆的40%,减少临时对象进入老年代的概率
内容的提问来源于stack exchange,提问作者arjunsv3691
相关产品推荐
相关产品推荐

