2012-03-15 150 views
2

Solr發生內存異常。索引大小約爲30GB左右。全部索引完成正常。稍後在搜索時可能會嘗試將結果加載到內存中,它開始提供此異常。儘管分配給Tomcat的內存和另一臺服務器上的完全相同的solr配置副本相同,但它工作得很好。我正在研究64位軟件,包括Windows上的Java & Tomcat。隨着更小的索引尺寸,它工作得很好。我正在考慮增加分配的tomcat堆空間,但是接下來如何使用完全相同的系統和solr配置的不同服務器上工作正常? 任何幫助,將不勝感激。Solr內存不足異常

下面是日誌:。

服務器Solr中配置遇到一個內部錯誤(嚴重錯誤,請檢查你的日誌文件在什麼可能是錯誤的更多詳細信息,如果您想配置錯誤後,Solr的繼續,在null中更改:false --------------------------------------------- ---------------- java.lang.RuntimeException:java.lang.OutOfMemoryError:org.apache.solr.core.SolrCore.getSearcher(SolrCore.java:1068)上的Java堆空間org.apache.solr.core.SolrCore。(SolrCore.java:579)at org.apache.solr.core.CoreContainer $ Initializer.initialize(CoreContainer.java:137)at org.apache.solr.servlet.SolrDispatchFilter。 init(SolrDispatchFilter.java:83)at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java :295)在org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:422)在org.apache.catalina.core.ApplicationFilterConfig(ApplicationFilterConfig.java:115)在org.apache.catalina.core.StandardContext。 。org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:799)org.apache.catalina.core.StandardContext.start(StandardContext.java:4726).filterStart(StandardContext.java:4072)。 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)at org.apache.catalina.startup .HostConfig.start(HostConfig.java:1317)位於org.apache.catalina.util.LifecycleSupport.fir的org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:324)。 eLifecycleEvent(LifecycleSupport.java:142)at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1065)at org.apache.catalina.core.StandardHost.start(StandardHost.java:840)at org.apache .catalina.core.ContainerBase.start(ContainerBase.java:1057)at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:463)at org.apache.catalina.core.StandardService.start(StandardService.java :525)at org.apache.catalina.core.StandardServer.start(StandardServer.java:754)at org.apache.catalina.startup.Catalina.start(Catalina.java:595)at sun.reflect.NativeMethodAccessorImpl.invoke0(本地方法)在sun.reflect.NativeMethodAccessorImpl.invoke(未知源)在sun.reflect.DelegatingMethodAccessorImpl.invoke(未知源)在java.lang.reflect.Method.invoke(未知源)在org.apache.catalina.startup。 Bootstrap.start(Bootstrap.java:289)at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)導致:java.lang.OutOfMemoryError:org.apache.lucene上的Java堆空間.index.SegmentTermEnum.termInfo(SegmentTermEnum.java:180)在org.apache.lucene.index.TermInfosReader。(TermInfosReader.java:91)在org.apache.lucene.index.SegmentReader $ CoreReaders。(SegmentReader.java:122 )位於org.apache.lucene.index.SegmentReader.get(SegmentReader.java:652)處,位於org.apache.lucene.index.SegmentReader.get(SegmentReader.java:613)處,位於org.apache.lucene.index.DirectoryReader。 (DirectoryReader.java:104)在org.apache.lucene.index.ReadOnlyDirectoryReader。(ReadOnlyDirectoryReader.java:27)在org.apache.lucene.index.DirectoryReader $ 1.doBody(DirectoryReader.java:74)在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)在org.apache.lucene.index.IndexReader.open(IndexReader.java:403)在org.apache.solr.core.StandardIndexReaderFactory.newReader(StandardIndexReaderFactory.java:38)在org.apache.solr.core .SolrCore.getSea rcher(SolrCore.java:1057)在org.apache.solr.core.SolrCore。(SolrCore.java:579)at org.apache.solr.core.CoreContainer $ Initializer。在org.apache的org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:295)處的org.apache.solr.servlet.SolrDispatchFilter.init(SolrDispatchFilter.java:83)處初始化(CoreContainer.java:137) .orgalpha.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:422)at org.apache.catalina.core.ApplicationFilterConfig。(ApplicationFilterConfig.java:115)at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java: 4072)at org.apache.catalina.core.ContainerBase org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:799)org.apache.catalina.core.StandardContext.start(StandardContext.java:4726) 。org.apache.catalina.core.StandardHost.addChild(StandardHost.java:601)上的.addChild(ContainerBase.java:779)位於org處的org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:943)。 apache.catalina.startup.HostConfig.deployWARs(HostConfig.java:778)at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.ja va:504)在org.apache.catalina.startup.HostConfig.start(HostConfig.java:1317)位於org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:324)的org.apache.catalina.util .LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:142)at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1065)),它阻止它履行這個請求。

回答

2

我想你應該處理這同任何其他OOME問題:

  • 這可能是因爲你的應用程序只需要一些更多的內存 - 修復:使用JVM -Xmx增加最大堆大小選項。

  • 這可能是你的應用程序有內存泄漏。 (可能在Solr中,或可能在你的代碼中。) - 修復:使用內存分析器來識別泄漏並修復它。


... but then how come on a different server with exactly same system and solr configuration it is working fine?

顯然,他們是不一樣的。有些不同,但你不知道它是什麼。 (但我不認爲找出有什麼區別是解決問題的好方法)

+0

謝謝斯蒂芬。其實這個問題與運行Tomcat即服務有關。我會爲此發佈另一個問題。 – Yavar 2012-03-16 06:33:08

0

你在該服務器上有多大的30G內存?

在任何情況下,您是否在top中檢查過SOLR流程的RSS?運行top命令,然後按M(大寫M)按內存使用排序進程。觀察Resident Set列以查看加載數據時實際使用的SOLR數量,嘗試各種查詢,並使用maxSegments的各種數字運行optimize。從更大的數字開始,一次減少大約一半或三分之一的工作量。如果你可以把它歸結爲3個在合理的數據庫中定期獲得新的更新。在這裏優化

更多細節:http://wiki.apache.org/solr/UpdateXmlMessages#A.22commit.22_and_.22optimize.22

0

做兩臺服務器具有相同的應用程序重新啓動的個人資料?

我最近碰到哪裏該用SOLR客戶端應用程序漏水跨應用程序重新啓動類加載器的一個問題就來了,因爲MultiThreadedHttpClientManager在SOLR客戶端庫開始ReferenceQueueThread,除非這是明確地關閉,應用程序類加載器將被固定,防止它在重新啓動時被收回。

此情況的解決方法是添加一個在銷燬時調用MultiThreadedHttpClientManager.shutdownAll()的ServletContextListener。