2012-09-17 81 views
3

我不是一個Java的傢伙,但使用Solr進行搜索,但在搜索這個問題後,我找不到它爲什麼會發生。Java堆空間崩潰Solr查詢

我有3000萬條記錄,指數沒有排序,我可以做最輕的設置,但我有幾個疑問後,以下情況除外:

SEVERE: java.lang.OutOfMemoryError: Java heap space at org.apache.lucene.index.SegmentReader.createFakeNorms(SegmentReader.java:1117) at org.apache.lucene.index.SegmentReader.fakeNorms(SegmentReader.java:1125) at org.apache.lucene.index.SegmentReader.norms(SegmentReader.java:1140) at org.apache.solr.search.SolrIndexReader.norms(SolrIndexReader.java:282) at org.apache.lucene.search.TermQuery$TermWeight.scorer(TermQuery.java:72) at org.apache.lucene.search.IndexSearcher.search(IndexSearcher.java:250) 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:1317) 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:127) 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:293) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) at java.lang.Thread.run(Thread.java:679)

然後我重新啓動Tomcat和它得到重新開始工作,直到有幾次再次摔倒。

我沒有排序(即使我希望它)和搜索操作系統大多數時間由特定的索引字段(而不是所有的)。

你能幫我嗎?在此先感謝:)

+0

[如何確保Solr/Lucene不會死於java.lang.OutOfMemoryError?](http://stackoverflow.com/questions/2391758/how-to-make-sure-solr-lucene -wont-die-with-java-lang-outofmemoryerror) –

+0

我看到了該主題並閱讀了它,但答案主要集中在FieldCache和FieldComparator類中進行排序,這不是我的情況。我使用Ubuntu的默認配置來啓動守護進程,因此,我試圖找出增加內存限制,術語限制等的最佳方式。我手動完成了它,並且最初沒有更好的結果。 –

+0

您需要提供更多信息,以便我們給出提示,至少:JVM的版本,JVM參數(特別是內存參數,例如'-Xmx','-XX:* Size'和垃圾收集器參數等作爲'-XX:* GC')。 –

回答

6

對於具有幾百萬條記錄的Solr部署,128 MB似乎很低。您確實可以使用-Xmx來增加JVM的最大大小。 -XX:MinHeapFreeRatio只是改變堆大小的點,但也可以使用與-Xmx相同的值-Xms直接分配最大大小並避免任何大小調整。

但是,您可能希望嘗試爲堆確定更精確的值,而不是盲目地拋出更多內存,因爲太多的內存可能會造成反向延遲,因爲垃圾回收期間的停頓時間較長。在命令行上使用JVisualVM(甚至更好,使用VisualGC插件)或jstat,您可以看到Solr啓動後使用了多少內存,請求後使用了多少內存,以及在典型使用情況下它的堆大小如何變化。

例如,使用jstat -gcutil <PID>,您可以看到JVM的年輕人(E,如Eden)和老年人(O)的年代(起初是您應該關注的老一代)。或者使用jstat -gc <PID>,您將得到值而不是百分比(C列是容量,即最大值,U列是實際使用量)。您需要足夠的內存用於Solr的工作集以及處理請求所需的內容。使用這些信息,您可以更精確地調整需要的內容。

+0

非常感謝,這澄清了非java dev的場景背後的邏輯:) –

0

看來你有代碼中的內存泄漏。您可能需要使用堆轉儲來查看哪些對象正在消耗內存。

(或)

正如布賴恩說,你可能會起tomcat用更少的內存配置。使用-Xms和-Xmx命令檢查爲tomcat分配了多少內存。

+0

它是一個泄漏嗎?也許它只是需要比JVM配置更多的內存? –

+0

@BrianAgnew:這是非常有效的點,其實我們應該首先檢查內存配置才決定它是內存泄漏。 – kosa

+0

請看看我的評論以上:) –