[Lucene] java.lang.OutOfMemoryError : Java heap space

검색엔진로그 2011. 3. 15. 12:43



루씬을 사용하는 도중  Searcher 클래스에서 다음과 같은 에러가 발생했다. 

java.lang.OutOfMemoryError: Java heap space
        at org.apache.lucene.index.SegmentReader$Norm.bytes(SegmentReader.java:463)
        at org.apache.lucene.index.SegmentReader.getNorms(SegmentReader.java:1017)
        at org.apache.lucene.index.SegmentReader.norms(SegmentReader.java:1024)
        at org.apache.lucene.search.TermQuery$TermWeight.scorer(TermQuery.java:79)
        at org.apache.lucene.search.IndexSearcher.search(IndexSearcher.java:210)
        at org.apache.lucene.search.Searcher.search(Searcher.java:67)

 색인파일이 31G 정도 쌓였을 쯤 발생한 에러인데,  색인이 너무 커서, 검색도중  메모리가 부족해지는 현상이었다.  
임시방편으로 
set  JAVA_OPTS="-Xms512m -Xmx1024m"

명령으로  JVM의 힙메모리 크기를 늘려주었더니 뻣는 현상은 해결이 되었다.  하지만 색인 파일은 
자료가  쌓일수록 더 커질 것이기 때문에 언젠가 다시 메모리 부족현상이 발생하게 될 것이다.  
좀더 근본적인 해결책을 찾아봐야 겠다. 

현재는 다수의 램디렉토리와 단일 파일디렉토리를 사용하여 색인을 수행하고 있다.  즉 하나의 파일 색인기를 사용하고 있는데 
이 파일 색인기를 하나만 사용할 것이 아니라  다중으로 분리하여 구성하면 위 문제에 대한 해결책이 어느정도 될 것 같다. 
이렇게 하면 합너에 읽어들이는 색인파일의 크기도 줄어들 것이고, 최적화도 색인기별로 별도로 수행할 수 있으며, 
하나의 색인기가 에러가 발생하더라도 나머지 색인기를 사용할 수 있기 때문에 큰 장점이 된다. 
다중 색인기에서 동시에 검색을 지원하는 루씬 클래스도 지원되기 때문에 검색모듈을 구축하는 부분도 크게 달라지지
않는다.