Java堆空间崩溃Solr查询

Mar*_*dão 3 java lucene solr

我不是一个Java人,而是使用Solr进行搜索,但在搜索了这个问题后,我无法找到它为什么会发生.

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

重度:java.lang.OutOfMemoryError:Java堆在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.lucene.search.TermQuery $ TermWeight的org.apache.solr.search.SolrIndexReader.norms(SolrIndexReader.java:282).得分者(TermQuery.java:72)org.apache.lucene.search.IndexSearcher.search(IndexSearcher.java:250)org.apache.lucene.search.Searcher.search(Searcher.java:171)atg.apache位于org.apache.solr.search.SolrIndexSearcher.search(SolrIndexSearcher.java)的org.apache.solr.search.SolrIndexSearcher.getDocListC(SolrIndexSearcher.java:884)中的.solr.search.SolrIndexSearcher.getDocListNC(SolrIndexSearcher.java:988) :341)org.apache.solr.handler.component.QueryComponent.process(QueryComponent.java:182)org.apache.solr.handler.component.andHandler.handleRequestBody(SearchHandler.java:195)at org.apache.solr.handler.RequestHandlerBase.handleRequest(RequestHandlerBase.java:131)在org.apache.solr.core.SolrCore.execute(SolrCore.java:1317)在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:2 93)在org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)在org.apache.coyote.http11.Http11Protocol $ Http11ConnectionHandler.process(Http11Protocol.java:602)在org.apache.tomcat.util java.lang.Thread.run.(.dava :679)

然后我重新启动tomcat,它重新开始工作,直到再次发出请求.

我没有排序(甚至我希望它)和搜索os大多数情况下由特定的索引字段(不是所有的).

你可以帮帮我吗?提前致谢 :)

Fra*_*eau 6

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

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

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