Solr重新索引时含Address Code字段引发堆内存溢出问题排查
针对你添加ADDRESS CODE字段后触发堆溢出的问题,除了调整堆内存,还可以从以下几个方向排查处理:
检查ADDRESS CODE字段的类型与配置
若该字段仅需精确匹配(无需分词查询),将其字段类型从text改为string,避免复杂分词器对每条数据的额外内存消耗。同时检查字段的indexed/stored属性:如果不需要存储原始值,设置stored=false;如果仅需存储无需索引,设置indexed=false,减少内存占用。分批导入数据
不要一次性加载1700万条数据,拆分数据为小批次(如每10万条一个文件),或在DataImportHandler(DIH)的data-config.xml中设置batchSize="100000",每导入一批手动提交一次。这样能避免大量数据同时驻留内存,降低GC压力。优化JVM参数细节
除了Xms4g -Xmx8g,补充调整以下参数:- 使用G1垃圾收集器:添加
-XX:+UseG1GC,G1对大内存场景下的大量短期对象处理更高效 - 调整新生代比例:设置
-XX:NewRatio=1,让新生代与老年代内存占比1:1,减少老年代对象堆积 - 用
jps -v命令查看Solr进程的实际JVM参数,确认-Xmx是否真的生效(避免启动参数被配置文件覆盖)
- 使用G1垃圾收集器:添加
关闭不必要的缓存与功能
若使用DIH导入,设置cacheRows=false,禁用行缓存(默认开启会缓存所有导入数据);导入期间关闭实时查询功能(设置rt=false),关闭自动提交改为手动提交,减少提交时的内存开销。排查数据质量问题
抽样检查ADDRESS CODE字段的异常数据:是否存在超长值(超过预期长度)、特殊字符导致分词器处理异常?可以先导入10万条带该字段的数据测试,若正常则逐步扩大范围,定位异常数据行并过滤。调整索引段合并策略
导入期间临时调大mergeFactor参数(如设为32),减少索引段合并的频率,降低合并过程中的内存消耗。导入完成后再改回默认值。
内容的提问来源于stack exchange,提问作者user2260040

