Java堆空间崩溃Solr查询

时间:2012-09-17 14:11:37

标签: java solr lucene

我不是Java人,而是使用Solr进行搜索,但在搜索了这个问题之后,我无法找到原因。

我有一个3000万条记录索引,没有排序和我能做的最轻的设置,但在几次查询后我有以下异常:

  

SEVERE:java.lang.OutOfMemoryError:Java堆空间at   org.apache.lucene.index.SegmentReader.createFakeNorms(SegmentReader.java:1117)     在   org.apache.lucene.index.SegmentReader.fakeNorms(SegmentReader.java:1125)     在   org.apache.lucene.index.SegmentReader.norms(SegmentReader.java:1140)     在   org.apache.solr.search.SolrIndexReader.norms(SolrIndexReader.java:282)     在   org.apache.lucene.search.TermQuery $ TermWeight.scorer(TermQuery.java:72)     在   org.apache.lucene.search.IndexSearcher.search(IndexSearcher.java:250)     在org.apache.lucene.search.Searcher.search(Searcher.java:171)at   org.apache.solr.search.SolrIndexSearcher.getDocListNC(SolrIndexSearcher.java:988)     在   org.apache.solr.search.SolrIndexSearcher.getDocListC(SolrIndexSearcher.java:884)     在   org.apache.solr.search.SolrIndexSearcher.search(SolrIndexSearcher.java:341)     在   org.apache.solr.handler.component.QueryComponent.process(QueryComponent.java:182)     在   org.apache.solr.handler.component.SearchHandler.handleRequestBody(SearchHandler.java:195)     在   org.apache.solr.handler.RequestHandlerBase.handleRequest(RequestHandlerBase.java:131)     在org.apache.solr.core.SolrCore.execute(SolrCore.java:1317)at   org.apache.solr.servlet.SolrDispatchFilter.execute(SolrDispatchFilter.java:338)     在   org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:241)     在   org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)     在   org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)     在   org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)     在   org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)     在   org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)     在   org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)     在   org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)     在   org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)     在   org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)     在   org.apache.coyote.http11.Http11Protocol $ Http11ConnectionHandler.process(Http11Protocol.java:602)     在   org.apache.tomcat.util.net.JIoEndpoint $ Worker.run(JIoEndpoint.java:489)     在java.lang.Thread.run(Thread.java:679)

然后我重新启动tomcat,它会重新开始工作,直到有几个请求再次崩溃。

我不是在排序(甚至是我希望它),而且大部分时间都是通过特定的索引字段进行搜索(不是针对所有字段)。

你可以帮帮我吗?在此先感谢:)

2 个答案:

答案 0 :(得分:6)

对于具有几百万条记录的Solr部署,128 MB似乎很低。您确实可以使用-Xmx增加JVM的最大大小。 -XX:MinHeapFreeRatio只是更改了调整堆大小的点,但您也可以使用与-Xms具有相同值的-Xmx来直接分配最大大小并避免任何调整大小。

但是,您可能希望尝试确定堆的更精确值,而不是盲目地投入更多内存,因为太多内存可能会产生延迟的延迟,因为垃圾收集期间的暂停时间较长。在命令行中使用JVisualVM(甚至更好,使用VisualGC插件)或jstat,您可以看到Solr在启动后使用了多少内存,在请求后使用了多少内存,以及在典型情况下它的堆如何变化的使用。

例如,使用jstat -gcutil <PID>,您可以看到JVM中的年轻人(E,如Eden)和旧的(O)代人是多么充实(旧一代是你应该看到的,在第一)。或者使用jstat -gc <PID>,您将获得值而不是百分比(C列是容量,即最大值,U列是实际使用量)。 Solr的工作集需要足够的内存以及处理请求所需的内存。使用这些信息,您可以更精确地调整所需的信息。

答案 1 :(得分:0)

您的代码中似乎有内存泄漏。您可能需要进行堆转储以查看哪些对象占用了内存。

(或)

正如布莱恩所说,你可能会以较少的内存配置启动tomcat。使用-Xms和-Xmx命令检查为tomcat分配的内存量。