Merge "PackBitmapIndex: Not buffer inflated bitmap during bitmap creation."
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/BasePackBitmapIndex.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/BasePackBitmapIndex.java
index c9bb167..ec53818 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/BasePackBitmapIndex.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/BasePackBitmapIndex.java
@@ -59,12 +59,26 @@
 		 * @return the full bitmap
 		 */
 		EWAHCompressedBitmap getBitmap() {
+			EWAHCompressedBitmap bitmap = getBitmapWithoutCaching();
+			// Cache the result.
+			bitmapContainer = bitmap;
+			return bitmap;
+		}
+
+		/**
+		 * Compute and return the full bitmap, do NOT cache the expanded bitmap,
+		 * which saves memory and should only be used during bitmap creation in
+		 * garbage collection.
+		 *
+		 * @return the full bitmap
+		 */
+		EWAHCompressedBitmap getBitmapWithoutCaching() {
 			// Fast path to immediately return the expanded result.
 			Object r = bitmapContainer;
 			if (r instanceof EWAHCompressedBitmap)
 				return (EWAHCompressedBitmap) r;
 
-			// Expand the bitmap and cache the result.
+			// Expand the bitmap but not cache the result.
 			XorCompressedBitmap xb = (XorCompressedBitmap) r;
 			EWAHCompressedBitmap out = xb.bitmap;
 			for (;;) {
@@ -72,7 +86,6 @@
 				if (r instanceof EWAHCompressedBitmap) {
 					out = out.xor((EWAHCompressedBitmap) r);
 					out.trim();
-					bitmapContainer = out;
 					return out;
 				}
 				xb = (XorCompressedBitmap) r;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackBitmapIndexRemapper.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackBitmapIndexRemapper.java
index 4b25284..dd5d03c 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackBitmapIndexRemapper.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackBitmapIndexRemapper.java
@@ -156,7 +156,8 @@
 			return null;
 
 		inflated.clear();
-		for (IntIterator i = oldBitmap.getBitmap().intIterator(); i.hasNext();)
+		for (IntIterator i = oldBitmap.getBitmapWithoutCaching()
+				.intIterator(); i.hasNext();)
 			inflated.set(prevToNewMapping[i.next()]);
 		bitmap = inflated.toEWAHCompressedBitmap();
 		bitmap.trim();