### Eclipse Workspace Patch 1.0 #P org.eclipse.core.resources Index: src/org/eclipse/core/internal/localstore/UnifiedTreeNode.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.core.resources/src/org/eclipse/core/internal/localstore/UnifiedTreeNode.java,v retrieving revision 1.23 diff -u -r1.23 UnifiedTreeNode.java --- src/org/eclipse/core/internal/localstore/UnifiedTreeNode.java 18 Mar 2009 11:02:11 -0000 1.23 +++ src/org/eclipse/core/internal/localstore/UnifiedTreeNode.java 16 Oct 2009 12:40:04 -0000 @@ -7,6 +7,7 @@ * * Contributors: * IBM Corporation - initial API and implementation + * Martin Oberhuber (Wind River) - [292267] OutOfMemoryError due to leak in UnifiedTree *******************************************************************************/ package org.eclipse.core.internal.localstore; @@ -108,6 +109,17 @@ this.fileInfo = info; this.existsWorkspace = existsInWorkspace; } + + /** + * Releases elements that won't be needed any more for garbage collection. + * Should be called before adding a node to the free list. + */ + public void releaseForGc() { + this.child = null; + this.resource = null; + this.store = null; + this.fileInfo = null; + } public void setExistsWorkspace(boolean exists) { this.existsWorkspace = exists; Index: src/org/eclipse/core/internal/localstore/UnifiedTree.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.core.resources/src/org/eclipse/core/internal/localstore/UnifiedTree.java,v retrieving revision 1.47 diff -u -r1.47 UnifiedTree.java --- src/org/eclipse/core/internal/localstore/UnifiedTree.java 18 Mar 2009 11:02:11 -0000 1.47 +++ src/org/eclipse/core/internal/localstore/UnifiedTree.java 16 Oct 2009 12:40:04 -0000 @@ -9,6 +9,7 @@ * IBM Corporation - initial API and implementation * Martin Oberhuber (Wind River) - [105554] handle cyclic symbolic links * Martin Oberhuber (Wind River) - [232426] shared prefix histories for symlinks + * Martin Oberhuber (Wind River) - [292267] OutOfMemoryError due to leak in UnifiedTree *******************************************************************************/ package org.eclipse.core.internal.localstore; @@ -107,8 +108,14 @@ addNodeChildrenToQueue(node); else removeNodeChildrenFromQueue(node); - //allow reuse of the node - freeNodes.add(node); + //allow reuse of the node, but don't let the freeNodes list grow infinitely + if (freeNodes.size() < 32767) { + //free memory-consuming elements of the node for garbage collection + node.releaseForGc(); + freeNodes.add(node); + } + //else, the whole node will be garbage collected since there is no + //reference to it any more. } } @@ -171,7 +178,9 @@ } else if (comp > 0) { // resource exists only in file system //don't create a node for symbolic links that create a cycle - if (!localInfo.getAttribute(EFS.ATTRIBUTE_SYMLINK) || !localInfo.isDirectory() || !isRecursiveLink(node.getStore(), localInfo)) + if (localInfo.getAttribute(EFS.ATTRIBUTE_SYMLINK) && localInfo.isDirectory() && isRecursiveLink(node.getStore(), localInfo)) + child = null; + else child = createChildNodeFromFileSystem(node, localInfo); localIndex++; } else {