2011-03-10 319 views
13

任何人都可以帮助我找出tomcat中的错误原因。我正在使用solr。开始它工作正常。后来我会提出这个错误。重新启动后,它工作正常。请帮我找出错误。solr - 内存不足的java堆空间

Mar 7, 2011 10:36:47 AM org.apache.solr.common.SolrException log SEVERE: java.lang.RuntimeException: java.lang.OutOfMemoryError: Java heap space at org.apache.solr.core.SolrCore.getSearcher(SolrCore.java:1068) at org.apache.solr.update.DirectUpdateHandler2.commit(DirectUpdateHandler2.java:418) at org.apache.solr.update.processor.RunUpdateProcessor.processCommit(RunUpdateProcessorFactory.java:85) at org.apache.solr.handler.XMLLoader.processUpdate(XMLLoader.java:169) at org.apache.solr.handler.XMLLoader.load(XMLLoader.java:69) at org.apache.solr.handler.ContentStreamHandlerBase.handleRequestBody(ContentStreamHandlerBase.java:54) 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:228) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:212) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:634) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:445) at java.lang.Thread.run(Unknown Source) Caused by: java.lang.OutOfMemoryError: Java heap space

+0

这是什么问题都用“C#”的标签呢? – LukeH 2011-03-10 14:05:11

+0

堆空间有多大?堆使用可能没问题,但堆可能太小了。 – Thomas 2011-03-10 14:06:45

+0

Ram的大小是15.9 GB.After增加堆的大小也会引发错误..请帮助..先谢谢... – 2011-03-30 14:27:57

回答

14

尽量增加你的记忆

任一组变量JAVA_OPTS="-Xms256m -Xmx500m"环境,这意味着堆开始大小为256 MB,最大512 MB。或编辑你的catalina.bat或.sh并在那里添加这一行。

你必须玩弄这些值,几周前我有一个SOLR索引器的工作,大约2 GB的数据,700MB的堆是必需的。

2

用-Xmx1024m或更大的值启动tomcat以给tomcat更多的堆空间。

0

你一定要考虑调整你的JVM。首先你应该改变你的JVM参数来发出一个垃圾回收日志,然后使用一个工具来分析这个日志。这个分析将帮助你为你的堆选择合理的值,并且它还可以让你判断你是否真的有内存泄漏或只是堆调整问题。看到此相关的问题对GC分析工具的一些信息:

Analyze GC logs for Sun Hotspots, JVM 6

+0

调整堆大小后,它也会引发错误 – 2011-03-30 14:27:25

+0

即时通讯16gb内存...什么堆大小可以设置为maxium – 2011-04-06 14:16:37

+1

这取决于您是否使用32位或64位jvm,以及如果您在Windows或Linux上运行。 Linux上的32位jvms通常受限于4gb进程上限,这意味着3gb就是您可以分配给堆的所有内容。这在Windows平台上进一步降低; 1.2gb是关于你所能做的32bit窗口。 64位jvms对于最大堆大小几乎是无限的,但是除非您相应地调整系统,否则对于真正的大堆,您将忍受过多的GC时间。 – 2011-04-07 22:10:39

3

您可以尝试在你的数据源定义降低默认BATCHSIZE JDBC连接PARAM。
DataImportHandler设计为逐行地流式传输。它将一个获取大小值(默认值:500)传递给Statement#setFetchSize,这是一些驱动程序不尊重的。

如果您使用的是MsSQL,您可以添加dataSource参数responseBuffering =“adaptive”。

这里看到更多的信息:
http://wiki.apache.org/solr/DataImportHandlerFaq

+0

我不使用jdbc ..我们直接对数据进行索引..... – 2011-03-30 14:32:20