如何确保Solr/Lucene获胜';你不会死在java.lang.OutOfMemoryError里吗?
我真的很纳闷,为什么它在索引过程中总是因为java.lang.OutOfMemoryError而消亡,即使它有几GB的内存 它需要手动调整配置文件/jvm参数,而不是仅仅计算出可用的内存量并将其自身限制在这一范围内,这有什么根本原因吗?除了Solr,没有其他程序有过这种问题 是的,每次发生这样的崩溃时,我都可以不断调整JVM堆大小,但这一切都太落后了 以下是最新此类崩溃的堆栈跟踪,以防相关:如何确保Solr/Lucene获胜';你不会死在java.lang.OutOfMemoryError里吗?,lucene,jvm,solr,Lucene,Jvm,Solr,我真的很纳闷,为什么它在索引过程中总是因为java.lang.OutOfMemoryError而消亡,即使它有几GB的内存 它需要手动调整配置文件/jvm参数,而不是仅仅计算出可用的内存量并将其自身限制在这一范围内,这有什么根本原因吗?除了Solr,没有其他程序有过这种问题 是的,每次发生这样的崩溃时,我都可以不断调整JVM堆大小,但这一切都太落后了 以下是最新此类崩溃的堆栈跟踪,以防相关: SEVERE: java.lang.OutOfMemoryError: Java heap space
SEVERE: java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOfRange(Arrays.java:3209)
at java.lang.String.<init>(String.java:216)
at org.apache.lucene.index.TermBuffer.toTerm(TermBuffer.java:122)
at org.apache.lucene.index.SegmentTermEnum.term(SegmentTermEnum.java:169)
at org.apache.lucene.search.FieldCacheImpl$StringIndexCache.createValue(FieldCacheImpl.java:701)
at org.apache.lucene.search.FieldCacheImpl$Cache.get(FieldCacheImpl.java:208)
at org.apache.lucene.search.FieldCacheImpl.getStringIndex(FieldCacheImpl.java:676)
at org.apache.lucene.search.FieldComparator$StringOrdValComparator.setNextReader(FieldComparator.java:667)
at org.apache.lucene.search.TopFieldCollector$OneComparatorNonScoringCollector.setNextReader(TopFieldCollector.java:94)
at org.apache.lucene.search.IndexSearcher.search(IndexSearcher.java:245)
at org.apache.lucene.search.Searcher.search(Searcher.java:171)
at org.apache.solr.search.SolrIndexSearcher.getDocListNC(SolrIndexSearcher.java:988)
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:286)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Thread.java:619)
SEVERE:java.lang.OutOfMemoryError:java堆空间
位于java.util.Arrays.copyOfRange(Arrays.java:3209)
位于java.lang.String。(String.java:216)
位于org.apache.lucene.index.TermBuffer.toTerm(TermBuffer.java:122)
位于org.apache.lucene.index.SegmentTermEnum.term(SegmentTermEnum.java:169)
在org.apache.lucene.search.FieldCacheImpl$StringIndexCache.createValue(FieldCacheImpl.java:701)
位于org.apache.lucene.search.FieldCacheImpl$Cache.get(FieldCacheImpl.java:208)
位于org.apache.lucene.search.FieldCacheImpl.getStringIndex(FieldCacheImpl.java:676)
位于org.apache.lucene.search.FieldComparator$StringOrdValComparator.SetNextrader(FieldComparator.java:667)
位于org.apache.lucene.search.TopFieldCollector$OneComparatorNonScoringCollector.setnextrader(TopFieldCollector.java:94)
位于org.apache.lucene.search.indexsearch.search(indexsearch.java:245)
在org.apache.lucene.search.Searcher.search(Searcher.java:171)上
位于org.apache.solr.search.solrindexearcher.getDocListNC(solrindexearcher.java:988)
位于org.apache.solr.search.solrindexearcher.getDocListC(solrindexearcher.java:884)
位于org.apache.solr.search.solrindexearcher.search(solrindexearcher.java:341)
位于org.apache.solr.handler.component.QueryComponent.process(QueryComponent.java:182)
位于org.apache.solr.handler.component.SearchHandler.HandlerRequestBody(SearchHandler.java:195)
位于org.apache.solr.handler.RequestHandlerBase.HandlerRequest(RequestHandlerBase.java:131)
位于org.apache.solr.core.SolrCore.execute(SolrCore.java:1316)
位于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:128)
位于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:286)
位于org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
位于org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
位于org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
运行(Thread.java:619)
查看堆栈跟踪,看起来您正在执行搜索,并按字段排序。如果需要按字段排序,Lucene内部需要将字段中所有术语的所有值加载到内存中。如果该字段包含大量数据,则很可能内存不足。胡乱猜测,正在编制索引的文档非常大
Lucene默认情况下只为文档的前10000个术语编制索引,以避免OutOfMemory错误,您可以克服此限制,请参阅
此外,您可以调用optimize()并在使用Indexwriter()完成处理后立即关闭
一个明确的方法是分析并找到瓶颈=]我不确定是否有可靠的方法确保您不会在Lucene中遇到OutOfMemoryException。您面临的问题与FieldCache的使用有关。Lucene API中的“维护术语值的缓存”。如果您的条件超过分配给JVM的内存量,您将得到异常 文档正在“org.apache.lucene.search.FieldComparator$StringOrdValComparator.setnextrader(FieldComparator.java:667)”上进行排序,这将占用存储为索引排序的术语所需的内存
您需要查看可排序字段的预计大小,并相应地调整JVM设置。您正在使用post.jar索引数据吗?我认为这个jar在solr1.2/1.3中有一个bug(但我不知道细节)。我们公司已经在内部解决了这个问题,而且应该在最新的主干solr1.4/1.5中解决。我使用的是以下Java:
$ java -version
java version "1.6.0"
OpenJDK Runtime Environment (build 1.6.0-b09)
OpenJDK 64-Bit Server VM (build 1.6.0-b09, mixed mode)
$ java -version
java version "1.6.0_24"
Java(TM) SE Runtime Environment (build 1.6.0_24-b07)
Java HotSpot(TM) 64-Bit Server VM (build 19.1-b02, mixed mode)
堆空间不足,但我升级到以下Java:
$ java -version
java version "1.6.0"
OpenJDK Runtime Environment (build 1.6.0-b09)
OpenJDK 64-Bit Server VM (build 1.6.0-b09, mixed mode)
$ java -version
java version "1.6.0_24"
Java(TM) SE Runtime Environment (build 1.6.0_24-b07)
Java HotSpot(TM) 64-Bit Server VM (build 19.1-b02, mixed mode)
现在,它在一个巨大的数据集上运行良好,有很多术语方面。对我来说,它在重启Tomcat服务器后运行良好
- 导航到C:\Bitnami\solr-4.7.2-0\apache solr\scripts
- 打开serviceinstall.bat(使用记事本++或其他程序)
- 添加或更新以下属性:-++JVM选项=-Xms1024M++JVM选项=-Xmx1024M
- 在该窗口的命令提示符下,运行serviceinstall.bat REMOVE
- 然后运行serviceinstall.bat安装
- 希望能帮上忙李>
- 字符串字段缓存比Lucene 4.0要紧凑得多。所以很多人都能适应
- 字段缓存是一种内存结构。所以不能阻止我
- 对于需要排序或刻面的字段,应该尝试DocValues来解决这个问题。DOCD值
- 这是一个老问题,但我无意中发现了: