Solr - Java堆空间内存溢出

14

我使用Tomcat和Solr,希望有人能帮助我找到错误原因。开始时一切正常,但后来出现了这个错误。重启之后又可以正常工作了。请帮助我找到错误。

2011年3月7日上午10:36:47 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)

注:此错误信息显示了Solr出现了内存不足的问题(java.lang.OutOfMemoryError: Java heap space)。org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:212) 在org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)中被调用 在org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:634)中被处理 在org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:445)中运行 由于Java堆空间不足而导致java.lang.OutOfMemoryError异常。


这个问题与“C#”标签有什么关系? - LukeH
堆空间有多大?堆使用可能很好,但堆可能太小了。 - Thomas
内存大小为15.9 GB。即使增加了堆的大小,仍然会抛出错误..请帮忙..提前致谢... - Syed Abdul Kather
4个回答

19

尝试增加内存

要么设置环境变量JAVA_OPTS="-Xms256m -Xmx500m",这意味着堆起始大小为256 MB,最大512 MB。或者编辑您的catalina.bat或.sh文件并在其中添加此行。

您需要调整这些值,几周前我有一个SOLR索引作业,大约2 GB的数据,需要700MB堆。


3

使用-Xmx1024m或更大的值启动Tomcat,以提供更多的堆空间。


3
您可以尝试在数据源定义中降低默认的batchSize JDBC连接参数。
DataImportHandler 设计为逐行流式处理。它会向 Statement#setFetchSize 传递一个获取大小值(默认值:500),但有些驱动程序不支持。
如果您使用的是 MsSQL,可以添加 dataSource 参数 responseBuffering="adaptive"。
更多信息请参见:
http://wiki.apache.org/solr/DataImportHandlerFaq

1

你应该考虑调整你的JVM。首先,你应该修改JVM参数以发出垃圾回收日志,然后使用工具分析该日志。这个分析将帮助你选择合理的堆值,并且它也将允许你判断你是否真的有一个内存泄漏或只是一个堆调优问题。参见这个相关问题获取一些关于GC分析工具的信息:

分析Sun Hotspots、JVM 6的GC日志


调整堆大小后,索引时仍然出现错误。 - Syed Abdul Kather
我有16GB的内存...我可以设置多大的堆大小作为最大值? - Syed Abdul Kather
1
这取决于您使用的是32位还是64位JVM以及您是否在Windows或Linux上运行。在Linux上,32位JVM通常受限于4GB进程上限,这意味着您可以分配给堆的空间大约为3GB。在Windows平台上,这个数字会进一步减少;32位Windows只能分配大约1.2GB的空间。64位JVM的最大堆大小基本上没有限制,但是如果您不对系统进行调整,对于非常大的堆,您将忍受过多的GC时间。 - Helter Scelter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接