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();