我们正在使用以下选项测试在tomcat 7和java 7中运行的solr 4.1
JAVA_OPTS =“ - Xms256m -Xmx2048m -XX:MaxPermSize = 1024m -XX:+ UseConcMarkSweepGC -XX:+ CMSIncrementalMode -XX:+ ParallelRefProcEnabled -XX:+ HeapDumpOnOutOfMemoryError -XX:HeapDumpPath = / home / ubuntu / OOM_HeapDump”
我们的源代码如下所示:
/**** START *****/
int noOfSolrDocumentsInBatch = 0;
for(int i=0 ; i<5000 ; i++) {
SolrInputDocument solrInputDocument = getNextSolrInputDocument();
server.add(solrInputDocument);
noOfSolrDocumentsInBatch += 1;
if(noOfSolrDocumentsInBatch == 10) {
server.commit();
noOfSolrDocumentsInBatch = 0;
}
}
/**** END *****/
方法“getNextSolrInputDocument()”生成一个包含100个字段(平均值)的solr文档。大约50个字段是“text_general”类型。 一些“test_general”字段由大约1000个单词组成,其余由几个单词组成。总字段数大约为35-40个多值字段(不是“text_general”类型)。
我们正在索引所有字段,但只存储8个字段。在这8个字段中,两个是字符串类型,五个是长的,一个是布尔值。所以我们的索引大小只有394 MB。但OOM时占用的RAM约为2.5 GB。为什么即使索引大小很小,内存也是如此之高? 什么存储在内存中?我们的理解是,每次提交文档都刷新到磁盘后。提交后,RAM中不应该保留任何内容。
我们使用以下设置:
server.commit() set waitForSearcher=true and waitForFlush=true
solrConfig.xml has following properties set:
directoryFactory = solr.MMapDirectoryFactory
maxWarmingSearchers = 1
text_general data type is being used as supplied in the schema.xml with the solr setup.
maxIndexingThreads = 8(default)
<autoCommit>
<maxTime>15000</maxTime>
<openSearcher>false</openSearcher>
</autoCommit>
我们在提交3990个solr文件后得到Java堆Out of Memory Error。来自profiler的内存转储的一些快照上传到以下链接。
http://s9.postimage.org/w7589t9e7/memorydump1.png
http://s7.postimage.org/p3abs6nuj/memorydump2.png
有人可以建议我们应该做些什么来减少/优化我们的情况下的内存消耗?还建议了什么应该是solrConfig.xml的参数的最佳值和原因