今天一哥们在做一个程序的时候使用了Lucene做全文检索工具,但是遇到了一个问题:首先就是检索速度非常的慢,而且只要连续检索三四次,程序马上就荡掉。通过日志发现是在CharacterEncodingFilter处报的错,没有办法只能去看filter的源代码。filter的程序很简单,只是做了request,response的编码,问题不可能出在这里啊!但是日志显示的错误信息就是从这个filter产生的,怎么回事?再看一下代码,晕:
try
{
// some code here
}
catch(Exception e)
{
//exception handling here
}
Exception太宽把底层错误屏蔽掉了,什么有价值的都看不到啊!把Exception改成IOException再试。Good 这次错误终于显示出来了:OutOfMemoryErr: Heap space
原来是内存耗尽了,好说!开始看代码中那些地方把内存吃掉了,改了一些地方(有个函数狂作字符串 +,改用StringBuffer,另外把一些循环中声明对象改为在循环开始...),重新启动服务器,这回应该没有问题了吧!OutOfMemoryErr: Heap space,日,怎么还是这个错误,再看...
终于找到了这块代码RAMDirectory ramDir = new RAMDirectory(fileName),不会是这里把内存都吃掉了吧!把这句注释掉,直接用文件方式,重起,测试,没有问题了!!!!!
看来这个RAMDirectory 是把整个索引文件的内容都放到内存中了,怪不得内存那么快就耗尽了。本来希望把文件放到内存中希望查询能快一点,没想到速度没加快反而找了不少麻烦!
仔细考虑了一下,要想使用RAMDirectory 把索引文件放到内存中不能每次查询时都重新打开RAMDirectory 。解决这个问题最好使用一个Singleton,在系统启动时把索引读到内存,查询时就直接使用。
本来是一个小问题,可是好长时间才解决,看来是经验不足,还需要锻炼!