You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@jackrabbit.apache.org by "Al Caponi (JIRA)" <ji...@apache.org> on 2007/12/05 05:22:43 UTC

[jira] Commented: (JCR-1224) OutOfMemory on 64-Bit Linux

    [ https://issues.apache.org/jira/browse/JCR-1224?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12548531 ] 

Al Caponi commented on JCR-1224:
--------------------------------

Hi,
I also reproduced an OutOfMemory error with a test class similar to FirstHop.java. Here are some findings.

Jackrabbit version: 1.3.3

Environment:
---------------------------
Windows XP Pro v.2002 SP2
AMD Athlon 64
1GB RAM

JRE: Sun JRE 1.5.0_11
---------------------------

Error message: java.lang.OutOfMemoryError: Java heap space

Stack from Eclipse debugger:
---------------------------
Thread [main] (Suspended (breakpoint at line 140 in IndexMerger))	
	IndexMerger.indexAdded(String, int) line: 140	
	MultiIndex$AddIndex.execute(MultiIndex) line: 1362	
	MultiIndex.executeAndLog(MultiIndex$Action) line: 872	
	MultiIndex.commitVolatileIndex() line: 926	
	MultiIndex.flush() line: 810	
	Recovery.run() line: 172	
	Recovery.run(MultiIndex, RedoLog) line: 85	
	MultiIndex.<init>(File, SearchIndex, ItemStateManager, NodeId, Set, NamespaceMappings) line: 297	
	SearchIndex.doInit() line: 295	
	SearchIndex(AbstractQueryHandler).init(QueryHandlerContext) line: 44	
	SearchManager.initializeQueryHandler() line: 478	
	SearchManager.<init>(SearchConfig, NamespaceRegistryImpl, NodeTypeRegistry, ItemStateManager, NodeId, SearchManager, NodeId) line: 231	
	RepositoryImpl$WorkspaceInfo.getSearchManager() line: 1580	
	RepositoryImpl.initWorkspace(RepositoryImpl$WorkspaceInfo) line: 570	
	RepositoryImpl.initStartupWorkspaces() line: 379	
	RepositoryImpl.<init>(RepositoryConfig) line: 286	
	RepositoryImpl.create(RepositoryConfig) line: 521	
	TransientRepository$2.getRepository() line: 245	
	TransientRepository.startRepository() line: 265	
	TransientRepository.login(Credentials, String) line: 333	
	TransientRepository.login() line: 388	
	JcrTest.main(String[]) line: 65	<< My test class
---------------------------

Findings:
Drilled down to an infinite loop in org.apache.jackrabbit.core.query.lucene.IndexMerger (line 140):
---------------------------
class IndexMerger extends Thread implements IndexListener {
...
    void indexAdded(String name, int numDocs) {
...
                while (upper < maxMergeDocs) {
                    indexBuckets.add(new IndexBucket(lower, upper, true));
                    lower = upper + 1;
                    upper *= mergeFactor;
...
                }
..
}
---------------------------

>From repository.xml <SearchIndex>
          <param name="minMergeDocs" value="100"/>
          <param name="maxMergeDocs" value="2147483647"/>
          <param name="mergeFactor" value="10"/>
The upper variable (init at 100) which grows by a factor of 10 constantly skips into negative territory (e.g. 1215752192 --> -727379968) and would probably never equal to 2147483647 before running out of heap space.

<SearchIndex> from my repository.xml (copied from website sample and modified the persistence manager to SimpleDbPersistenceManager (for MySQL))
---------------------------
...
        <SearchIndex class="org.apache.jackrabbit.core.query.lucene.SearchIndex">
            <param name="path" value="default/index"/>
            <param name="useCompoundFile" value="true"/>
            <param name="minMergeDocs" value="100"/>
            <param name="volatileIdleTime" value="3"/>
            <param name="maxMergeDocs" value="2147483647"/>
            <param name="mergeFactor" value="10"/>
            <param name="maxFieldLength" value="10000"/>
            <param name="bufferSize" value="10"/>
            <param name="cacheSize" value="1000"/>
            <param name="forceConsistencyCheck" value="false"/>
            <param name="enableConsistencyCheck" value="false"/>
            <param name="autoRepair" value="true"/>
            <param name="analyzer" value="org.apache.lucene.analysis.standard.StandardAnalyzer"/>
            <param name="queryClass" value="org.apache.jackrabbit.core.query.QueryImpl"/>
            <param name="respectDocumentOrder" value="true"/>
            <param name="resultFetchSize" value="2147483647"/>
            <param name="extractorPoolSize" value="0"/>
            <param name="extractorTimeout" value="100"/>
            <param name="extractorBackLogSize" value="100"/>
        </SearchIndex>
    </Workspace>
---------------------------

Changing the value of maxMergeDocs didn't help as in this particular stack trace, the value of IndexMerger.maxMergeDocs was reset to 2147483647.

Regards,
Al


> OutOfMemory on 64-Bit Linux
> ---------------------------
>
>                 Key: JCR-1224
>                 URL: https://issues.apache.org/jira/browse/JCR-1224
>             Project: Jackrabbit
>          Issue Type: Bug
>          Components: indexing
>    Affects Versions: 1.4
>         Environment: Linux lysiosdev 2.6.23.1-21.fc7 #1 SMP Thu Nov 1 20:28:15 EDT 2007 x86_64 x86_64 x86_64 GNU/Linux
> java version "1.5.0_12"
> Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_12-b04)
> Java HotSpot(TM) 64-Bit Server VM (build 1.5.0_12-b04, mixed mode)
>            Reporter: Andreas Julius
>
> On my 64-Bit environment OS/JVM I tried a "mvn clean install" and got an OutOfMemory Exception.
> On my 32-Bit environment Mac OSX 10.5 Java 1.5 the tests were all  fine and the IndexMerger was significant faster.
> Running org.apache.jackrabbit.test.TestAll
> 21.11.2007 10:29:51 *INFO * [IndexMerger] IndexMerger: merged 549 documents in 289 ms into _a. (IndexMerger.java, line 304)
> 21.11.2007 10:29:55 *ERROR* [main] ImportHandler: fatal error encountered at line: 1, column: 10 while parsing XML stream: org.xml.sax.SAXParseException: Attribute name "is" associated with an element type "this" must be followed by the ' = ' character. (ImportHandler.java, line 116)
> 21.11.2007 10:29:55 *ERROR* [main] ImportHandler: fatal error encountered at line: 1, column: 10 while parsing XML stream: org.xml.sax.SAXParseException: Attribute name "is" associated with an element type "this" must be followed by the ' = ' character. (ImportHandler.java, line 104)
> 21.11.2007 10:29:59 *ERROR* [main] ImportHandler: fatal error encountered at line: -1, column: -1 while parsing XML stream: org.xml.sax.SAXParseException: Premature end of file. (ImportHandler.java, line 104)
> 21.11.2007 10:29:59 *ERROR* [main] ImportHandler: fatal error encountered at line: -1, column: -1 while parsing XML stream: org.xml.sax.SAXParseException: Premature end of file. (ImportHandler.java, line 116)
> 21.11.2007 10:30:45 *INFO * [IndexMerger] IndexMerger: merged 555 documents in 2015 ms into _l. (IndexMerger.java, line 304)
> 21.11.2007 10:33:13 *INFO * [IndexMerger] IndexMerger: merged 412 documents in 25587 ms into _w. (IndexMerger.java, line 304)
> Exception in thread "Timer-1" java.lang.OutOfMemoryError: Java heap space
>         at org.apache.lucene.store.BufferedIndexOutput.<init>(BufferedIndexOutput.java:26)
>         at org.apache.lucene.store.FSDirectory$FSIndexOutput.<init>(FSDirectory.java:592)
>         at org.apache.lucene.store.FSDirectory.createOutput(FSDirectory.java:435)
>         at org.apache.lucene.util.BitVector.write(BitVector.java:122)
>         at org.apache.lucene.index.SegmentReader.doCommit(SegmentReader.java:236)
>         at org.apache.lucene.index.IndexReader.commit(IndexReader.java:794)
>         at org.apache.lucene.index.FilterIndexReader.doCommit(FilterIndexReader.java:190)
>         at org.apache.lucene.index.IndexReader.commit(IndexReader.java:825)
>         at org.apache.lucene.index.IndexReader.close(IndexReader.java:841)
>         at org.apache.jackrabbit.core.query.lucene.AbstractIndex.close(AbstractIndex.java:327)
>         at org.apache.jackrabbit.core.query.lucene.MultiIndex$DeleteIndex.execute(MultiIndex.java:1715)
>         at org.apache.jackrabbit.core.query.lucene.MultiIndex.executeAndLog(MultiIndex.java:936)
>         at org.apache.jackrabbit.core.query.lucene.MultiIndex.flush(MultiIndex.java:880)
>         at org.apache.jackrabbit.core.query.lucene.MultiIndex.checkFlush(MultiIndex.java:1110)
>         at org.apache.jackrabbit.core.query.lucene.MultiIndex.access$100(MultiIndex.java:75)
>         at org.apache.jackrabbit.core.query.lucene.MultiIndex$1.run(MultiIndex.java:324)
>         at java.util.TimerThread.mainLoop(Timer.java:512)
>         at java.util.TimerThread.run(Timer.java:462)
> 21.11.2007 10:34:37 *ERROR* [main] DatabasePersistenceManager: failed to write node state: cfbffd6d-114d-4738-9383-48da2b5dbc1d (DatabasePersistenceManager.java, line 441)
> java.lang.OutOfMemoryError: Java heap space
>         at java.util.Properties$LineReader.<init>(Properties.java:346)
>         at java.util.Properties.load(Properties.java:284)

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.