Skip to content

Commit eca580b

Browse files
committed
Promote chunks with pinned objects through survivor spaces.
1 parent 057b0b0 commit eca580b

File tree

5 files changed

+54
-45
lines changed

5 files changed

+54
-45
lines changed

substratevm/src/com.oracle.svm.core.genscavenge/src/com/oracle/svm/core/genscavenge/GCImpl.java

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -921,21 +921,14 @@ private void scanGreyObjects() {
921921
}
922922

923923
@AlwaysInline("GC performance")
924+
@SuppressWarnings("static-method")
924925
Object promoteObject(Object original, UnsignedWord header) {
925926
Log trace = Log.noopLog().string("[GCImpl.promoteObject:").string(" original: ").object(original);
926-
HeapImpl heap = HeapImpl.getHeapImpl();
927927

928+
HeapImpl heap = HeapImpl.getHeapImpl();
928929
boolean isAligned = ObjectHeaderImpl.isAlignedHeader(header);
929-
Header<?> originalChunk;
930-
Space originalSpace;
931-
if (isAligned) {
932-
originalChunk = AlignedHeapChunk.getEnclosingChunk(original);
933-
originalSpace = HeapChunk.getSpace(originalChunk);
934-
} else {
935-
assert ObjectHeaderImpl.isUnalignedHeader(header);
936-
originalChunk = UnalignedHeapChunk.getEnclosingChunk(original);
937-
originalSpace = HeapChunk.getSpace(originalChunk);
938-
}
930+
Header<?> originalChunk = getChunk(original, isAligned);
931+
Space originalSpace = HeapChunk.getSpace(originalChunk);
939932

940933
Object result;
941934
if (originalSpace.getAge() < HeapParameters.getMaxSurvivorSpaces()) {
@@ -956,17 +949,27 @@ Object promoteObject(Object original, UnsignedWord header) {
956949
return result;
957950
}
958951

952+
private static Header<?> getChunk(Object obj, boolean isAligned) {
953+
if (isAligned) {
954+
return AlignedHeapChunk.getEnclosingChunk(obj);
955+
}
956+
assert ObjectHeaderImpl.isUnalignedObject(obj);
957+
return UnalignedHeapChunk.getEnclosingChunk(obj);
958+
}
959+
959960
private static void promotePinnedObject(PinnedObjectImpl pinned) {
960961
HeapImpl heap = HeapImpl.getHeapImpl();
961-
OldGeneration oldGen = heap.getOldGeneration();
962-
/* Find the chunk the object is in, and if necessary, move it to To space. */
963962
Object referent = pinned.getObject();
964963
if (referent != null && !heap.isInImageHeap(referent)) {
965-
/*
966-
* The referent doesn't move, so I can ignore the result of the promotion because I
967-
* don't have to update any pointers to it.
968-
*/
969-
oldGen.promoteObjectChunk(referent);
964+
boolean isAligned = ObjectHeaderImpl.isAlignedObject(referent);
965+
Header<?> originalChunk = getChunk(referent, isAligned);
966+
Space originalSpace = HeapChunk.getSpace(originalChunk);
967+
968+
if (originalSpace.getAge() < HeapParameters.getMaxSurvivorSpaces()) {
969+
heap.getYoungGeneration().promoteChunk(originalChunk, isAligned, originalSpace);
970+
} else {
971+
heap.getOldGeneration().promoteChunk(originalChunk, isAligned, originalSpace);
972+
}
970973
}
971974
}
972975

substratevm/src/com.oracle.svm.core.genscavenge/src/com/oracle/svm/core/genscavenge/Generation.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,4 +76,12 @@ public String getName() {
7676
* was promoted through HeapChunk motion.
7777
*/
7878
protected abstract Object promoteUnalignedObject(Object original, UnalignedHeapChunk.UnalignedHeader originalChunk, Space originalSpace);
79+
80+
/**
81+
* Promote a HeapChunk from its original space to this Space.
82+
*
83+
* This turns all the Objects in the chunk from white to grey: the objects are in this Space,
84+
* but have not yet had their interior pointers visited.
85+
*/
86+
protected abstract void promoteChunk(HeapChunk.Header<?> originalChunk, boolean isAligned, Space originalSpace);
7987
}

substratevm/src/com.oracle.svm.core.genscavenge/src/com/oracle/svm/core/genscavenge/OldGeneration.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,8 +84,15 @@ protected Object promoteUnalignedObject(Object original, UnalignedHeapChunk.Unal
8484
return original;
8585
}
8686

87-
public void promoteObjectChunk(Object obj) {
88-
getToSpace().promoteObjectChunk(obj);
87+
@Override
88+
protected void promoteChunk(HeapChunk.Header<?> originalChunk, boolean isAligned, Space originalSpace) {
89+
if (originalSpace.isFromSpace()) {
90+
if (isAligned) {
91+
getToSpace().promoteAlignedHeapChunk((AlignedHeapChunk.AlignedHeader) originalChunk, originalSpace);
92+
} else {
93+
getToSpace().promoteUnalignedHeapChunk((UnalignedHeapChunk.UnalignedHeader) originalChunk, originalSpace);
94+
}
95+
}
8996
}
9097

9198
void releaseSpaces(ChunkReleaser chunkReleaser) {

substratevm/src/com.oracle.svm.core.genscavenge/src/com/oracle/svm/core/genscavenge/Space.java

Lines changed: 1 addition & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -203,29 +203,6 @@ private Pointer allocateMemory(UnsignedWord objectSize) {
203203
return result;
204204
}
205205

206-
/**
207-
* Promote the HeapChunk containing an Object from its original space to this Space.
208-
*
209-
* This turns all the Objects in the chunk from white to grey: the objects are in this Space,
210-
* but have not yet had their interior pointers visited.
211-
*/
212-
void promoteObjectChunk(Object original) {
213-
if (ObjectHeaderImpl.isAlignedObject(original)) {
214-
AlignedHeapChunk.AlignedHeader aChunk = AlignedHeapChunk.getEnclosingChunk(original);
215-
Space originalSpace = HeapChunk.getSpace(aChunk);
216-
if (originalSpace.isFromSpace()) {
217-
promoteAlignedHeapChunk(aChunk, originalSpace);
218-
}
219-
} else {
220-
assert ObjectHeaderImpl.isUnalignedObject(original);
221-
UnalignedHeapChunk.UnalignedHeader uChunk = UnalignedHeapChunk.getEnclosingChunk(original);
222-
Space originalSpace = HeapChunk.getSpace(uChunk);
223-
if (originalSpace.isFromSpace()) {
224-
promoteUnalignedHeapChunk(uChunk, originalSpace);
225-
}
226-
}
227-
}
228-
229206
public void releaseChunks(ChunkReleaser chunkReleaser) {
230207
chunkReleaser.add(firstAlignedHeapChunk);
231208
chunkReleaser.add(firstUnalignedHeapChunk);
@@ -427,7 +404,7 @@ private Object copyAlignedObject(Object originalObj) {
427404
}
428405

429406
/** Promote an AlignedHeapChunk by moving it to this space. */
430-
private void promoteAlignedHeapChunk(AlignedHeapChunk.AlignedHeader chunk, Space originalSpace) {
407+
void promoteAlignedHeapChunk(AlignedHeapChunk.AlignedHeader chunk, Space originalSpace) {
431408
assert this != originalSpace && originalSpace.isFromSpace();
432409

433410
originalSpace.extractAlignedHeapChunk(chunk);

substratevm/src/com.oracle.svm.core.genscavenge/src/com/oracle/svm/core/genscavenge/YoungGeneration.java

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,6 @@ protected Object promoteAlignedObject(Object original, AlignedHeapChunk.AlignedH
225225
}
226226

227227
assert ObjectHeaderImpl.isAlignedObject(original);
228-
assert originalSpace.isEdenSpace() || originalSpace.isSurvivorSpace() : "Should be Eden or survivor.";
229228
assert originalSpace.getAge() < maxSurvivorSpaces;
230229

231230
int age = originalSpace.getNextAgeForPromotion();
@@ -247,4 +246,19 @@ protected Object promoteUnalignedObject(Object original, UnalignedHeapChunk.Unal
247246
toSpace.promoteUnalignedHeapChunk(originalChunk, originalSpace);
248247
return original;
249248
}
249+
250+
@Override
251+
protected void promoteChunk(HeapChunk.Header<?> originalChunk, boolean isAligned, Space originalSpace) {
252+
if (!originalSpace.isFromSpace()) {
253+
return;
254+
}
255+
assert originalSpace.getAge() < maxSurvivorSpaces;
256+
int age = originalSpace.getNextAgeForPromotion();
257+
Space toSpace = getSurvivorToSpaceAt(age - 1);
258+
if (isAligned) {
259+
toSpace.promoteAlignedHeapChunk((AlignedHeapChunk.AlignedHeader) originalChunk, originalSpace);
260+
} else {
261+
toSpace.promoteUnalignedHeapChunk((UnalignedHeapChunk.UnalignedHeader) originalChunk, originalSpace);
262+
}
263+
}
250264
}

0 commit comments

Comments
 (0)