You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-user@lucene.apache.org by Terence Lai <tl...@trekspace.com> on 2004/08/18 00:30:19 UTC

OutOfMemoryError

Hi All,

I am getting a OutOfMemoryError when I deploy my EJB application. To debug the problem, I wrote the following test program:

    public static void main(String[] args) {
        try {
            Query query = getQuery();

            for (int i=0; i<1000; i++) {
                search(query);
                
                if ( i%50 == 0 ) {
                    System.out.println("Sleep...");
                    Thread.currentThread().sleep(5000);
                    System.out.println("Wake up!");
                }
            }            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static void search(Query query) throws IOException {
        FSDirectory fsDir = null;
        IndexSearcher is = null;
        Hits hits = null;
        
        try {
            fsDir = FSDirectory.getDirectory("C:\\index, false);
            is = new IndexSearcher(fsDir);
            SortField sortField = new SortField("profile_modify_date",
                SortField.STRING, true);

            hits = is.search(query, new Sort(sortField));
        } finally {
            if (is != null) {
                try {
                    is.close();
                } catch (Exception ex) {
                }
            }
            
            if (fsDir != null) {
                try {
                    is.close();
                } catch (Exception ex) {
                }
            }
        }
        
    }

In the test program, I wrote a loop to keep calling the search method. Everytime it enters the search method, I would instantiate the IndexSearcher. Before I exit the method, I close the IndexSearcher and FSDirectory. I also made the Thread sleep for 5 seconds in every 50 searches. Hopefully, this will give some time for the java to do the Garbage Collection. Unfortunately, when I observe the memory usage of my process, it keeps increasing until I got the java.lang.OutOfMemoryError.

Note that I invoke the IndexSearcher.search(Query query, Sort sort) to process the search. If I don't specify the Sort field(i.e. using IndexSearcher.search(query)), I don't have this problem, and the memory usage keeps at a very static level.

Does anyone experience a similar problem? Did I do something wrong in the test program. I throught by closing the IndexSearcher and the FSDirectory, the memory will be able to release during the Garbage Collection.

Thanks,
Terence




----------------------------------------------------------
Get your free email account from http://www.trekspace.com
          Your Internet Virtual Desktop!

---------------------------------------------------------------------
To unsubscribe, e-mail: lucene-user-unsubscribe@jakarta.apache.org
For additional commands, e-mail: lucene-user-help@jakarta.apache.org


Re: OutOfMemoryError

Posted by Daniel Naber <da...@t-online.de>.
On Wednesday 18 August 2004 00:30, Terence Lai wrote:

>             if (fsDir != null) {
>                 try {
>                     is.close();
>                 } catch (Exception ex) {
>                 }
>             }

You close is here again, not fsDir. Also, it's a good idea to never ignore 
exceptions, you should at least print them out, even if it's just a 
close() that fails.

Regards
 Daniel

-- 
http://www.danielnaber.de

Re: OutOfMemoryError

Posted by Otis Gospodnetic <ot...@yahoo.com>.
Reuse your IndexSearcher! :)

Also, I think somebody has written some EJB stuff to work with Lucene. 
The project is on SF.net.

Otis

--- Terence Lai <tl...@trekspace.com> wrote:

> Hi All,
> 
> I am getting a OutOfMemoryError when I deploy my EJB application. To
> debug the problem, I wrote the following test program:
> 
>     public static void main(String[] args) {
>         try {
>             Query query = getQuery();
> 
>             for (int i=0; i<1000; i++) {
>                 search(query);
>                 
>                 if ( i%50 == 0 ) {
>                     System.out.println("Sleep...");
>                     Thread.currentThread().sleep(5000);
>                     System.out.println("Wake up!");
>                 }
>             }            
>         } catch (Exception e) {
>             e.printStackTrace();
>         }
>     }
> 
>     private static void search(Query query) throws IOException {
>         FSDirectory fsDir = null;
>         IndexSearcher is = null;
>         Hits hits = null;
>         
>         try {
>             fsDir = FSDirectory.getDirectory("C:\\index, false);
>             is = new IndexSearcher(fsDir);
>             SortField sortField = new
> SortField("profile_modify_date",
>                 SortField.STRING, true);
> 
>             hits = is.search(query, new Sort(sortField));
>         } finally {
>             if (is != null) {
>                 try {
>                     is.close();
>                 } catch (Exception ex) {
>                 }
>             }
>             
>             if (fsDir != null) {
>                 try {
>                     is.close();
>                 } catch (Exception ex) {
>                 }
>             }
>         }
>         
>     }
> 
> In the test program, I wrote a loop to keep calling the search
> method. Everytime it enters the search method, I would instantiate
> the IndexSearcher. Before I exit the method, I close the
> IndexSearcher and FSDirectory. I also made the Thread sleep for 5
> seconds in every 50 searches. Hopefully, this will give some time for
> the java to do the Garbage Collection. Unfortunately, when I observe
> the memory usage of my process, it keeps increasing until I got the
> java.lang.OutOfMemoryError.
> 
> Note that I invoke the IndexSearcher.search(Query query, Sort sort)
> to process the search. If I don't specify the Sort field(i.e. using
> IndexSearcher.search(query)), I don't have this problem, and the
> memory usage keeps at a very static level.
> 
> Does anyone experience a similar problem? Did I do something wrong in
> the test program. I throught by closing the IndexSearcher and the
> FSDirectory, the memory will be able to release during the Garbage
> Collection.
> 
> Thanks,
> Terence
> 
> 
> 
> 
> ----------------------------------------------------------
> Get your free email account from http://www.trekspace.com
>           Your Internet Virtual Desktop!
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: lucene-user-unsubscribe@jakarta.apache.org
> For additional commands, e-mail: lucene-user-help@jakarta.apache.org
> 
> 


---------------------------------------------------------------------
To unsubscribe, e-mail: lucene-user-unsubscribe@jakarta.apache.org
For additional commands, e-mail: lucene-user-help@jakarta.apache.org