Solr内存不足异常

时间:2012-03-15 05:35:15

标签: java tomcat solr lucene

Solr发出内存异常。索引大小约为30GB左右。完整索引已经完成。稍后搜索时可能会尝试将结果加载到内存中,它会开始提供此异常。虽然将相同的内存分配给Tomcat,并且在另一台服务器上使用完全相同的solr配置副本,但它工作得非常好。我正在研究64位软件,包括Java& Windows上的Tomcat。索引尺寸越小,工作就越好。我正在考虑增加分配的tomcat堆空间,但是如何在具有完全相同的系统和solr配置的不同服务器上运行正常呢? 任何帮助将不胜感激。

以下是日志:

服务器遇到内部错误(solr配置中出现严重错误。请检查日志文件以获取有关可能出错的更多详细信息。如果您希望solr在配置错误后继续,请更改:false in null ----- -------------------------------------------------- ------ java.lang.RuntimeException:java.lang.OutOfMemoryError:org.apache.solr.core.SolrCore上org.apache.solr.core.SolrCore.getSearcher(SolrCore.java:1068)的Java堆空间。(SolrCore.java:579)org.apache.solr.core.CoreContainer $ Initializer.initialize(CoreContainer.java:137)org.apache.solr.servlet.SolrDispatchFilter.init(SolrDispatchFilter.java:83)at org .apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:295)位于org.apache.catalina.core.ApplicationFilterConfig的org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:422)。(ApplicationFilterConfig。 java:115)at org.apache.catalina.core.StandardContext.filterStart(StandardCont) ext.java:4072)org.apache.catalina.core.StandardContext.start(StandardContext.java:4726)org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:799)atg.apache.catalina .core.ContainerBase.addChild(ContainerBase.java:779)org.apache.catalina.core.StandardHost.addChild(StandardHost.java:601)org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:943) )org.apache.catalina.startup.HostConfig.deployWARs(HostConfig.java:778)org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:504)org.apache.catalina.startup.HostConfig。在Org.apache上的org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:324)的org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:142)上启动(HostConfig.java:1317) .catalina.core.ContainerBase.start(ContainerBase.java:1065)org.apache.catalina.core.StandardHost.start(StandardHost.java:840)at org.apache.catalina.core.ContainerBase.start(ContainerBase.java) :1057)a t org.apache.catalina.core.StandardEngine.start(StandardEngine.java:463)位于org.apache.catalina.core.StandardServer.start的org.apache.catalina.core.StandardService.start(StandardService.java:525) (StandardServer.java:754)org.apache.catalina.startup.Catalina.start(Catalina.java:595)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)在atg.apache的org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)的java.lang.reflect.Method.invoke(未知来源)的sun.reflect.DelegatingMethodAccessorImpl.invoke(未知来源)。 catalina.startup.Bootstrap.main(Bootstrap.java:414)引起:java.lang.OutOfMemoryError:org.apache中org.apache.lucene.index.SegmentTermEnum.termInfo(SegmentTermEnum.java:180)中的Java堆空间。 lucene.index.TermInfosReader。(TermInfosReader.java:91)org.apache.lucene.index.SegmentReader $ CoreReaders。(SegmentReader.java:122)at org.apache.lucene.index.SegmentReader.get(SegmentRea) der.java:652)org.apache.lucene.index.SegmentReader.get(SegmentReader.java:613)位于org.apache.lucene的org.apache.lucene.index.DirectoryReader。(DirectoryReader.java:104)。 org.apache.lucene.index.DirectoryReader $ 1.doBody(DirectoryReader.java:74)中的index.ReadOnlyDirectoryReader。(ReadOnlyDirectoryReader.java:27)org.apache.lucene.index.SegmentInfos $ FindSegmentsFile.run(SegmentInfos.java: 683)org.apache.lucene.index.DirectoryReader.open(DirectoryReader.java:69)org.apache.lucene.index.IndexReader.open(IndexReader.java:476)atg.apache.lucene.index.IndexReader .open(IndexReader.java:403)org.apache.solr.core.StandardIndexReaderFactory.newReader(StandardIndexReaderFactory.java:38)org.apache.solr.core.SolrCore.getSearcher(SolrCore.java:1057)at org。 apache.solr.core.SolrCore。(SolrCore.java:579)org.apache.solr.core.CoreContainer $ Initializer.initialize(CoreContainer.java:137)org.apache.solr.servlet.SolrDispatchFilter.init(SolrDispatchFilter) .java:83)在org.apache.cat alina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:295)位于org.apache.catalina.core.ApplicationFilterConfig的org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:422)。(ApplicationFilterConfig.java:115 )org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4072)org.apache.catalina.core.StandardContext.start(StandardContext.java:4726)org.apache.catalina.core.ContainerBase。 addChildInternal(ContainerBase.java:799)org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:779)org.apache。在一个org.apache上的org.apache.catalina.core.StandardHost.addChild(StandardHost.java:601)位于org.apache.catalina.startup.HostConfig.deployWARs(HostConfig.java:778)的.catalina.startup.HostConfig.deployWAR(HostConfig.java:943)org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java) :504)org.apache.catalina.startup.HostConfig.start(HostConfig.java:1317)org.apache.catalina.startup.HostConfig.lifecycleEv位于org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:142)的org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1065)中的ent(HostConfig.java:324)阻止了它完成此请求。

4 个答案:

答案 0 :(得分:2)

我认为你应该像对待任何其他OOME问题一样对待它:

  • 可能是您的应用程序只需要更多内存 - 修复:使用JVM -Xmx选项增加最大堆大小。

  • 可能是您的应用程序存在内存泄漏。 (可能在Solr中,或者可能在您的代码中。) - 修复:使用内存分析器识别泄漏并修复它。


  

...但是那么如何在具有完全相同的系统和solr配置的不同服务器上运行正常呢?

显然它们不一样。有些东西是不同的,但你无法弄清楚它是什么。 (但我不认为找出差异是解决问题的好方法。)

答案 1 :(得分:1)

当我将Tomcat作为服务运行时,它不会以某种方式将CATALINA_OPTS设置为环境变量,但是如果我使用startup.bat在控制台/命令行上运行tomcat,那么一切都很好。 我已针对随后的问题发布了另一个问题:Tomcat as a service v/s Tomcat on console for 64 bit Windows

答案 2 :(得分:0)

你在那台服务器上有多少30G的RAM?

无论如何,您是否在top中检查了SOLR流程的RSS?运行top命令,然后按M(大写M)按内存使用对进程进行排序。观察Resident Set列以查看SOLR在您加载数据时实际使用了多少,尝试各种查询,并为maxSegments运行带有各种数字的optimize。从较大的数字开始,一次向下工作大约一半或三分之一。如果你可以将它归结为3个在经常获得新更新的数据库中合理的段。

有关优化的更多详细信息:http://wiki.apache.org/solr/UpdateXmlMessages#A.22commit.22_and_.22optimize.22

答案 3 :(得分:0)

两台服务器是否具有相同的应用程序重启配置文件?

我最近遇到一个问题,即使用SOLR的客户端应用程序在应用程序重新启动时泄漏了类加载器,因为SOLR客户端库中的MultiThreadedHttpClientManager启动了一个ReferenceQueueThread,除非明确关闭,否则应用程序类加载器将被固定,从而阻止它在重新启动时被收回。

此条件的解决方法是添加一个ServletContextListener,在销毁时调用MultiThreadedHttpClientManager.shutdownAll()。