2010-04-08 77 views
8

我開始使用Solr索引數據庫的文章,但增加了約5800萬條(和磁盤的約113 GB的大小)後,我得到以下錯誤消息在Tomcat日誌錯誤的OutOfMemoryError:Java堆空間錯誤時啓動Solr的

注1:我已經將Init內存池設置爲256MB,並且最大內存池:1400MB到tomcat服務器。
注2:我可以發佈或搜索文章,但必須等3分鐘以獲得回覆。

8-apr-2010 14:27:07 org.apache.solr.common.SolrException log 
SEVERE: java.lang.OutOfMemoryError: Java heap space 
    at org.apache.lucene.util.PriorityQueue.initialize(PriorityQueue.java:89) 
    at org.apache.lucene.search.HitQueue.<init>(HitQueue.java:67) 
    at org.apache.lucene.search.TopScoreDocCollector.<init>(TopScoreDocCollector.java:113) 
    at org.apache.lucene.search.TopScoreDocCollector.<init>(TopScoreDocCollector.java:37) 
    at org.apache.lucene.search.TopScoreDocCollector$InOrderTopScoreDocCollector.<init>(TopScoreDocCollector.java:42) 
    at org.apache.lucene.search.TopScoreDocCollector$InOrderTopScoreDocCollector.<init>(TopScoreDocCollector.java:40) 
    at org.apache.lucene.search.TopScoreDocCollector.create(TopScoreDocCollector.java:100) 
    at org.apache.solr.search.SolrIndexSearcher.getDocListNC(SolrIndexSearcher.java:979) 
    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:293) 
    at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:859) 
    at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:574) 
    at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1527) 
    at java.lang.Thread.run(Unknown Source) 

什麼問題?

有什麼建議嗎?

重要提示:爲什麼要使用堆內存?

+0

您是否嘗試附加jconsole以獲得更好的外觀發生了什麼? – 2010-04-08 13:21:38

+0

內存佔用率是否增加?你在內存中存儲索引的一部分?如果答案是否定的,我想這是內存泄漏。嘗試使用:jmap -histo 來查看哪種對象佔用堆的大部分比預期的要多。 – 2010-04-08 13:35:56

+0

感謝您的回覆。我不知道很多關於java的知識,我也能找到jmap。只在服務器上安裝YourKit java profiler。如何找到有什麼問題? – Hamid 2010-04-08 14:19:29

回答

4
  1. 如果您還沒有升級到最新的jdk 6。我在jdk 5上打了一個類似的OOME,它與6一起走了。我懷疑這是一個nio的東西。

  2. 嘗試降低solrconfig.xml中的maxPendingDeletes。

  3. 要找出的Solr的組件使用了所有的記憶,開始Solr的是這樣的:

    的java -XX:+ HeapDumpOnOutOfMemoryError -XX:HeapDumpPath = some_directory_of_your_choice罐子start.jar

然後使用來自http://www.eclipse.org/mat/的獨立MAT解析堆轉儲,並降低耗盡所有內存的相應緩存。

+0

我只是安裝Windows 64位設置更大的內存爲tomcat(solr) 和我的問題解決,因爲段非常大,無法打開低內存。 – Hamid 2010-04-28 02:51:14

0

啓用GC日誌記錄並繪製時間序列圖,這可以告訴您JVM內存分配的速度以及收集的數據量,因此您可以接近高水位標記。