diff --git a/substratevm/src/com.oracle.svm.core.genscavenge/src/com/oracle/svm/core/genscavenge/CompactingOldGeneration.java b/substratevm/src/com.oracle.svm.core.genscavenge/src/com/oracle/svm/core/genscavenge/CompactingOldGeneration.java index 1c81aed263b6..4881a85d98d3 100644 --- a/substratevm/src/com.oracle.svm.core.genscavenge/src/com/oracle/svm/core/genscavenge/CompactingOldGeneration.java +++ b/substratevm/src/com.oracle.svm.core.genscavenge/src/com/oracle/svm/core/genscavenge/CompactingOldGeneration.java @@ -336,6 +336,17 @@ private void fixupReferencesBeforeCompaction(ChunkReleaser chunkReleaser, Timers oldFixupAlignedChunksTimer.stop(); } + /* + * Check each unaligned object and fix its references if the object is marked. Add the chunk + * to the releaser's list in case the object is not marked and therefore won't survive. + */ + Timer oldFixupUnalignedChunksTimer = timers.oldFixupUnalignedChunks.start(); + try { + fixupUnalignedChunkReferences(chunkReleaser); + } finally { + oldFixupUnalignedChunksTimer.stop(); + } + Timer oldFixupImageHeapTimer = timers.oldFixupImageHeap.start(); try { for (ImageHeapInfo info : HeapImpl.getImageHeapInfos()) { @@ -374,17 +385,6 @@ private void fixupReferencesBeforeCompaction(ChunkReleaser chunkReleaser, Timers oldFixupStackTimer.stop(); } - /* - * Check each unaligned object and fix its references if the object is marked. Add the chunk - * to the releaser's list in case the object is not marked and therefore won't survive. - */ - Timer oldFixupUnalignedChunksTimer = timers.oldFixupUnalignedChunks.start(); - try { - fixupUnalignedChunkReferences(chunkReleaser); - } finally { - oldFixupUnalignedChunksTimer.stop(); - } - Timer oldFixupRuntimeCodeCacheTimer = timers.oldFixupRuntimeCodeCache.start(); try { if (RuntimeCompilation.isEnabled()) { diff --git a/substratevm/src/com.oracle.svm.core.genscavenge/src/com/oracle/svm/core/genscavenge/ReferenceObjectProcessing.java b/substratevm/src/com.oracle.svm.core.genscavenge/src/com/oracle/svm/core/genscavenge/ReferenceObjectProcessing.java index 57be28d88ff3..15133ecf1204 100644 --- a/substratevm/src/com.oracle.svm.core.genscavenge/src/com/oracle/svm/core/genscavenge/ReferenceObjectProcessing.java +++ b/substratevm/src/com.oracle.svm.core.genscavenge/src/com/oracle/svm/core/genscavenge/ReferenceObjectProcessing.java @@ -246,6 +246,7 @@ private static boolean maybeUpdateForwardedReference(Reference dr, Pointer re @Uninterruptible(reason = "Called from uninterruptible code.", mayBeInlined = true) private static boolean willSurviveThisCollection(Object obj) { if (SerialGCOptions.useCompactingOldGen() && GCImpl.getGCImpl().isCompleteCollection()) { + // Only for discovery, during processing for enqueuing mark status is already cleared return ObjectHeaderImpl.isMarked(obj); } HeapChunk.Header chunk = HeapChunk.getEnclosingHeapChunk(obj); diff --git a/substratevm/src/com.oracle.svm.core.genscavenge/src/com/oracle/svm/core/genscavenge/compacting/ObjectMoveInfo.java b/substratevm/src/com.oracle.svm.core.genscavenge/src/com/oracle/svm/core/genscavenge/compacting/ObjectMoveInfo.java index 0c2b79539f1a..24e451354631 100644 --- a/substratevm/src/com.oracle.svm.core.genscavenge/src/com/oracle/svm/core/genscavenge/compacting/ObjectMoveInfo.java +++ b/substratevm/src/com.oracle.svm.core.genscavenge/src/com/oracle/svm/core/genscavenge/compacting/ObjectMoveInfo.java @@ -180,6 +180,7 @@ public static void walkObjectsForFixup(AlignedHeapChunk.AlignedHeader chunk, Obj while (p.notEqual(objSeqEnd)) { assert p.belowThan(objSeqEnd); Object obj = p.toObjectNonNull(); + ObjectHeaderImpl.unsetMarkedAndKeepRememberedSetBit(obj); UnsignedWord objSize = LayoutEncoding.getSizeFromObjectInlineInGC(obj); /* diff --git a/substratevm/src/com.oracle.svm.core.genscavenge/src/com/oracle/svm/core/genscavenge/compacting/ObjectRefFixupVisitor.java b/substratevm/src/com.oracle.svm.core.genscavenge/src/com/oracle/svm/core/genscavenge/compacting/ObjectRefFixupVisitor.java index d4dfcd9b81e1..10cb8cc56f5c 100644 --- a/substratevm/src/com.oracle.svm.core.genscavenge/src/com/oracle/svm/core/genscavenge/compacting/ObjectRefFixupVisitor.java +++ b/substratevm/src/com.oracle.svm.core.genscavenge/src/com/oracle/svm/core/genscavenge/compacting/ObjectRefFixupVisitor.java @@ -72,7 +72,7 @@ private static void visitObjectReference(Pointer objRef, boolean compressed, Obj || holderObject == null // references from CodeInfo, invalidated or weak || holderObject instanceof Reference; // cleared referent - Object obj = newLocation.toObjectNonNull(); + Object obj = newLocation.toObject(); ReferenceAccess.singleton().writeObjectAt(objRef, obj, compressed); } // Note that image heap cards have already been cleaned and re-marked during the scan diff --git a/substratevm/src/com.oracle.svm.core.genscavenge/src/com/oracle/svm/core/genscavenge/compacting/PlanningVisitor.java b/substratevm/src/com.oracle.svm.core.genscavenge/src/com/oracle/svm/core/genscavenge/compacting/PlanningVisitor.java index df3cb9f95f6d..f9985503be1d 100644 --- a/substratevm/src/com.oracle.svm.core.genscavenge/src/com/oracle/svm/core/genscavenge/compacting/PlanningVisitor.java +++ b/substratevm/src/com.oracle.svm.core.genscavenge/src/com/oracle/svm/core/genscavenge/compacting/PlanningVisitor.java @@ -99,8 +99,6 @@ public boolean visitChunk(AlignedHeapChunk.AlignedHeader chunk) { } if (ObjectHeaderImpl.isMarkedHeader(header)) { - ObjectHeaderImpl.unsetMarkedAndKeepRememberedSetBit(p.toObjectNonNull()); - /* * Adding the optional identity hash field would increase an object's size, so we * should have copied all objects that need one during marking instead.