我们得应用又前台系统和后台管理系统两部分(应用lucene创建索引和关键字搜索,前台和后台中创建索引和关键字搜索的代码完全一样),现象描述:
如果创建索引和关键字搜索搜索都在前台系统中运行或者创建索引和搜索功能都在后台系统中运行没有问题,一切正常,但是,(a)当点击后台的创建索引,运行正常,这时,在点击前台的关键词搜索则就报异常 (b)点击前台的搜索(之前已经创建好索引),运行正常,这时,在后台点击创建索引。在(a)(b)这两种情况下都出现异常:
“java.lang.OutOfMemoryError: Java heap space” ,异常信息如下 :
2011-6-1 14:34:00 org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servlet springmvc threw exception
java.lang.OutOfMemoryError: Java heap space
at org.wltea.analyzer.dic.DictSegment.fillSegment(DictSegment.java:167)
at org.wltea.analyzer.dic.DictSegment.fillSegment(DictSegment.java:180)
at org.wltea.analyzer.dic.DictSegment.fillSegment(DictSegment.java:180)
at org.wltea.analyzer.dic.DictSegment.fillSegment(DictSegment.java:180)
at org.wltea.analyzer.dic.DictSegment.fillSegment(DictSegment.java:156)
at org.wltea.analyzer.dic.Dictionary.loadMainDict(Dictionary.java:97)
at org.wltea.analyzer.dic.Dictionary.<init>(Dictionary.java:71)
at org.wltea.analyzer.dic.Dictionary.<clinit>(Dictionary.java:41)
at org.wltea.analyzer.cfg.Configuration.loadSegmenter(Configuration.java:110)
at org.wltea.analyzer.IKSegmentation.<init>(IKSegmentation.java:54)
at org.wltea.analyzer.lucene.IKTokenizer.<init>(IKTokenizer.java:44)
at org.wltea.analyzer.lucene.IKAnalyzer.tokenStream(IKAnalyzer.java:45)
at org.apache.lucene.analysis.Analyzer.reusableTokenStream(Analyzer.java:52)
at org.apache.lucene.index.DocInverterPerField.processFields(DocInverterPerField.java:126)
at org.apache.lucene.index.DocFieldProcessorPerThread.processDocument(DocFieldProcessorPerThread.java:246)
at org.apache.lucene.index.DocumentsWriter.updateDocument(DocumentsWriter.java:773)
at org.apache.lucene.index.DocumentsWriter.addDocument(DocumentsWriter.java:751)
at org.apache.lucene.index.IndexWriter.addDocument(IndexWriter.java:1928)
at org.apache.lucene.index.IndexWriter.addDocument(IndexWriter.java:1902)
at com.fasdq.fangdake.index.IndexNews.buildDocument(IndexNews.java:210)
at com.fasdq.fangdake.index.IndexNews.createIndexIKAnalyzer(IndexNews.java:55)
at com.fasdq.fangdake.controller.LuceneController.createIndexNews(LuceneController.java:126)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.springframework.web.servlet.mvc.multiaction.MultiActionController.invokeNamedMethod(MultiActionController.java:473)
at org.springframework.web.servlet.mvc.multiaction.MultiActionController.handleRequestInternal(MultiActionController.java:410)
at org.springframework.web.servlet.mvc.AbstractController.handleRequest(AbstractController.java:153)
at org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:48)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:875)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:807)
这个问题烦了我好几天了,弄不出来了,跪求牛人们帮忙一下!十分感谢了!

解决方案 »

  1.   

    这个要做 TreadDump .要在tomcat启动时加上几个参数.ibm与sun jdk都不一样. 然后用内存分析工具看虚拟机中那个东西占用内存较多.估计说了等于不说.=.=.毕竟现在的人知道ThreadDump的人不多.唉.
      

  2.   

    window->preferences->MyEclipse....->Servers->Tomcat->Tomcat 6.X->JDK->Optional Java VM arguments下面的文本框里加上"-Xms128m -Xmx256m-Dcom.sun.management.jmxremote=true"然后Apply
    这种方式,可以解决!我之前有遇到过,但不是做lucene还有,以这种方式解决内存溢出,并非最终解决办法,因为这样非常占用内存,你不信看CPU
    看下代码,什么地方应该改进的改下。
      

  3.   

    修改TOMCAT_HOME/bin/catalina.bat,在“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行:
    set JAVA_OPTS=%JAVA_OPTS% -server -Xms800m -Xmx800m -XX:MaxNewSize=256m具体的可以参考一下
    http://hi.baidu.com/mouhainy/blog/item/a3b2bf3377fa02fd1b4cfffc.html
      

  4.   

    关于lucene的内存溢出。。经常遇到。。
    最好的办法就是,提升你的硬件支撑因为在大量的写入索引的时候。。IO会很频繁。。,相信你已经在索引的时候的对索引内存做了优化处理。。而且你查询的时候,尽量用reader吧问楼主:你们的数据量大吗?查询效率高吗?在多目录索引下是如何进行查询的效率提升的。。希望能一起讨论学习