启动solr时出现了OutOfMemoryError: Java heap space错误

9
我开始使用Solr索引数据库文章,但在添加了大约5800万篇文章(磁盘大小约为113 GB)后,在Tomcat日志错误中收到以下错误消息:
注意1:我已经将初始化内存池设置为256MB,并将最大内存池设置为1400MB以供Tomcat服务器使用。 注意2:我可以发布或搜索文章,但必须等待超过3分钟才能获得响应。
8-apr-2010 14:27:07 org.apache.solr.common.SolrException log
SEVERE: java.lang.OutOfMemoryError: Java heap space
    at org.apache.lucene.util.PriorityQueue.initialize(PriorityQueue.java:89)
    at org.apache.lucene.search.HitQueue.<init>(HitQueue.java:67)
    at org.apache.lucene.search.TopScoreDocCollector.<init>(TopScoreDocCollector.java:113)
    at org.apache.lucene.search.TopScoreDocCollector.<init>(TopScoreDocCollector.java:37)
    at org.apache.lucene.search.TopScoreDocCollector$InOrderTopScoreDocCollector.<init>(TopScoreDocCollector.java:42)
    at org.apache.lucene.search.TopScoreDocCollector$InOrderTopScoreDocCollector.<init>(TopScoreDocCollector.java:40)
    at org.apache.lucene.search.TopScoreDocCollector.create(TopScoreDocCollector.java:100)
    at org.apache.solr.search.SolrIndexSearcher.getDocListNC(SolrIndexSearcher.java:979)
    at org.apache.solr.search.SolrIndexSearcher.getDocListC(SolrIndexSearcher.java:884)
    at org.apache.solr.search.SolrIndexSearcher.search(SolrIndexSearcher.java:341)
    at org.apache.solr.handler.component.QueryComponent.process(QueryComponent.java:182)
    at org.apache.solr.handler.component.SearchHandler.handleRequestBody(SearchHandler.java:195)
    at org.apache.solr.handler.RequestHandlerBase.handleRequest(RequestHandlerBase.java:131)
    at org.apache.solr.core.SolrCore.execute(SolrCore.java:1316)
    at org.apache.solr.servlet.SolrDispatchFilter.execute(SolrDispatchFilter.java:338)
    at org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
    at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:859)
    at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:574)
    at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1527)
    at java.lang.Thread.run(Unknown Source)

有什么问题吗?

有什么建议吗?

重要问题:为什么Solr使用堆内存?


你尝试过使用jconsole来更好地查看正在发生的情况吗? - Patrick Cornelissen
内存占用增加会有问题吗?你是否将索引的某些部分存储在内存中?如果否,则可能是内存泄漏。尝试使用:jmap -histo <process id>查看哪些对象占用堆的比例大于预期。 - Eyal Schneider
谢谢回复。我对Java不是很了解,也找不到jmap。我只在服务器上安装了YourKit Java Profiler。如何找出问题所在? - Hamid
你正在使用什么工具对文档进行索引?是 DataImportHandler 吗? - Mauricio Scheffer
256到1.4 GB的内存对于Solr来说并不算很多。 - Tim Mahy
Mauricio,我正在使用来自.NET的XmlImportHandler方法,我已经转换了8700万篇文章并将其移动到其他Solr服务器上,没有任何问题(到目前为止,我总共有1.7亿篇文章)。我不知道为什么会出现这个错误。 - Hamid
2个回答

5
  1. 如果您还没有升级到最新的jdk 6,请尽快升级。我曾在jdk 5上遇到类似的OOME问题,但在jdk 6上解决了。我怀疑这是一个nio问题。

  2. 尝试在solrconfig.xml中降低maxPendingDeletes的值。

  3. 要找出solr中哪个组件使用了所有内存,请按以下方式启动solr:

    java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=some_directory_of_your_choice -jar start.jar

然后使用来自http://www.eclipse.org/mat/的独立MAT解析堆转储,并降低相应的缓存以释放内存。


我刚刚安装了64位的Windows系统,以便为Tomcat(Solr)设置更大的内存,我的问题得到了解决,因为分段非常大,低内存无法打开。 - Hamid

1

启用GC日志记录并绘制时间序列图,这可以告诉您JVM内存分配的速度以及是否正在收集多少内存,从而可以近似地确定高水位线。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接