Add the ability to treat the zygote heap as a root collect just the
forked application heap.
Change-Id: I8807897ae426f8274018d950fec44a2182a90525
diff --git a/vm/alloc/MarkSweep.c b/vm/alloc/MarkSweep.c
index 223448a..eab30ba 100644
--- a/vm/alloc/MarkSweep.c
+++ b/vm/alloc/MarkSweep.c
@@ -134,7 +134,7 @@
} while (false)
bool
-dvmHeapBeginMarkStep()
+dvmHeapBeginMarkStep(GcMode mode)
{
GcMarkContext *mc = &gDvm.gcHeap->markContext;
@@ -142,6 +142,7 @@
return false;
}
mc->finger = NULL;
+ mc->immuneLimit = dvmHeapSourceGetImmuneLimit(mode);
return true;
}
@@ -167,6 +168,10 @@
assert(dvmIsValidObject(obj));
#endif
+ if ((char *)obj < ctx->immuneLimit) {
+ assert(isMarked(obj, ctx));
+ return;
+ }
if (!setAndReturnMarkBit(ctx, obj)) {
/* This object was not previously marked.
*/
@@ -266,6 +271,9 @@
HPROF_SET_GC_SCAN_STATE(HPROF_ROOT_STICKY_CLASS, 0);
+ LOG_SCAN("immune objects");
+ dvmMarkImmuneObjects();
+
LOG_SCAN("root class loader\n");
dvmGcScanRootClassLoader();
LOG_SCAN("primitive classes\n");
@@ -1108,13 +1116,13 @@
* marked and free them.
*/
void
-dvmHeapSweepUnmarkedObjects(int *numFreed, size_t *sizeFreed)
+dvmHeapSweepUnmarkedObjects(GcMode mode, int *numFreed, size_t *sizeFreed)
{
HeapBitmap markBits[HEAP_SOURCE_MAX_HEAP_COUNT];
HeapBitmap objBits[HEAP_SOURCE_MAX_HEAP_COUNT];
size_t origObjectsAllocated;
size_t origBytesAllocated;
- size_t numBitmaps;
+ size_t numBitmaps, numSweepBitmaps;
/* All reachable objects have been marked.
* Detach any unreachable interned strings before
@@ -1131,7 +1139,13 @@
numBitmaps = dvmHeapSourceGetNumHeaps();
dvmHeapSourceGetObjectBitmaps(objBits, markBits, numBitmaps);
- dvmHeapBitmapXorWalkLists(markBits, objBits, numBitmaps,
+ if (mode == GC_PARTIAL) {
+ numSweepBitmaps = 1;
+ assert(gDvm.gcHeap->markContext.immuneLimit == objBits[0].base);
+ } else {
+ numSweepBitmaps = numBitmaps;
+ }
+ dvmHeapBitmapXorWalkLists(markBits, objBits, numSweepBitmaps,
sweepBitmapCallback, NULL);
*numFreed = origObjectsAllocated -