Skip to content

Commit 00302f1

Browse files
committed
Deep Structure Scan Optimization
- Introduced new scan type `SCAN_MIXED_OBJECT_LINKED` for objects with self referencing fields - Scan type is recognized when non-zero self referencing field offset is found - Introduced new class fields to store offset of self referencing fields (at most 2) which are to be scanned with priority - If a self referencing field is found while building the class description, the offset to that field is stored to either `selfReferencingField1` or `selfReferencingField2` - Superclass self referencing field offsets are propagated and given priority over derived class fields - Scavenger delegate handles `SCAN_MIXED_OBJECT_LINKED` obj types by calling deepScan (resides on OMR side) to "special treat" these objects with priority Signed-off-by: Salman Rana <salman.rana@ibm.com>
1 parent f0107dd commit 00302f1

20 files changed

+62
-9
lines changed

runtime/gc_api/HeapIteratorAPI.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -399,6 +399,7 @@ j9mm_iterate_object_slots(
399399
MM_GCExtensionsBase *extensions = MM_GCExtensionsBase::getExtensions(javaVM->omrVM);
400400

401401
switch(extensions->objectModel.getScanType(objectPtr)) {
402+
case GC_ObjectModel::SCAN_MIXED_OBJECT_LINKED:
402403
case GC_ObjectModel::SCAN_ATOMIC_MARKABLE_REFERENCE_OBJECT:
403404
case GC_ObjectModel::SCAN_MIXED_OBJECT:
404405
case GC_ObjectModel::SCAN_OWNABLESYNCHRONIZER_OBJECT:

runtime/gc_base/ReferenceChainWalker.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -348,6 +348,7 @@ MM_ReferenceChainWalker::scanObject(J9Object *objectPtr)
348348
doClassSlot(&clazz, J9GC_REFERENCE_TYPE_CLASS, -1, objectPtr);
349349

350350
switch(_extensions->objectModel.getScanType(objectPtr)) {
351+
case GC_ObjectModel::SCAN_MIXED_OBJECT_LINKED:
351352
case GC_ObjectModel::SCAN_ATOMIC_MARKABLE_REFERENCE_OBJECT:
352353
case GC_ObjectModel::SCAN_MIXED_OBJECT:
353354
case GC_ObjectModel::SCAN_OWNABLESYNCHRONIZER_OBJECT:

runtime/gc_glue_java/CompactDelegate.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11

22
/*******************************************************************************
3-
* Copyright (c) 2017, 2017 IBM Corp. and others
3+
* Copyright (c) 2017, 2019 IBM Corp. and others
44
*
55
* This program and the accompanying materials are made available under
66
* the terms of the Eclipse Public License 2.0 which accompanies this
@@ -78,6 +78,7 @@ MM_CompactDelegate::verifyHeap(MM_EnvironmentBase *env, MM_MarkMap *markMap)
7878
omrobjectptr_t objectPtr = NULL;
7979
while (NULL != (objectPtr = markedObjectIterator.nextObject())) {
8080
switch(extensions->objectModel.getScanType(objectPtr)) {
81+
case GC_ObjectModel::SCAN_MIXED_OBJECT_LINKED:
8182
case GC_ObjectModel::SCAN_ATOMIC_MARKABLE_REFERENCE_OBJECT:
8283
case GC_ObjectModel::SCAN_MIXED_OBJECT:
8384
case GC_ObjectModel::SCAN_OWNABLESYNCHRONIZER_OBJECT:

runtime/gc_glue_java/CompactSchemeFixupObject.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ void
7171
MM_CompactSchemeFixupObject::fixupObject(MM_EnvironmentStandard *env, omrobjectptr_t objectPtr)
7272
{
7373
switch(env->getExtensions()->objectModel.getScanType(objectPtr)) {
74+
case GC_ObjectModel::SCAN_MIXED_OBJECT_LINKED:
7475
case GC_ObjectModel::SCAN_ATOMIC_MARKABLE_REFERENCE_OBJECT:
7576
case GC_ObjectModel::SCAN_MIXED_OBJECT:
7677
case GC_ObjectModel::SCAN_CLASS_OBJECT:

runtime/gc_glue_java/MarkingDelegate.hpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11

22
/*******************************************************************************
3-
* Copyright (c) 2017, 2017 IBM Corp. and others
3+
* Copyright (c) 2017, 2019 IBM Corp. and others
44
*
55
* This program and the accompanying materials are made available under
66
* the terms of the Eclipse Public License 2.0 which accompanies this
@@ -118,6 +118,7 @@ class MM_MarkingDelegate
118118

119119
GC_ObjectScanner *objectScanner = NULL;
120120
switch(_extensions->objectModel.getScanType(objectPtr)) {
121+
case GC_ObjectModel::SCAN_MIXED_OBJECT_LINKED:
121122
case GC_ObjectModel::SCAN_ATOMIC_MARKABLE_REFERENCE_OBJECT:
122123
case GC_ObjectModel::SCAN_MIXED_OBJECT:
123124
case GC_ObjectModel::SCAN_OWNABLESYNCHRONIZER_OBJECT:

runtime/gc_glue_java/MetronomeDelegate.hpp

+1
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,7 @@ class MM_MetronomeDelegate : public MM_BaseNonVirtual
210210
{
211211
UDATA pointersScanned = 0;
212212
switch(_extensions->objectModel.getScanType(objectPtr)) {
213+
case GC_ObjectModel::SCAN_MIXED_OBJECT_LINKED:
213214
case GC_ObjectModel::SCAN_ATOMIC_MARKABLE_REFERENCE_OBJECT:
214215
case GC_ObjectModel::SCAN_MIXED_OBJECT:
215216
case GC_ObjectModel::SCAN_OWNABLESYNCHRONIZER_OBJECT:

runtime/gc_glue_java/ObjectIterator.hpp

+4
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ class GC_ObjectIterator {
6565
switch (_type) {
6666
case GC_ObjectModel::SCAN_INVALID_OBJECT:
6767
return;
68+
case GC_ObjectModel::SCAN_MIXED_OBJECT_LINKED:
6869
case GC_ObjectModel::SCAN_ATOMIC_MARKABLE_REFERENCE_OBJECT:
6970
case GC_ObjectModel::SCAN_MIXED_OBJECT:
7071
case GC_ObjectModel::SCAN_CLASS_OBJECT:
@@ -91,6 +92,7 @@ class GC_ObjectIterator {
9192
switch (_type) {
9293
case GC_ObjectModel::SCAN_INVALID_OBJECT:
9394
return NULL;
95+
case GC_ObjectModel::SCAN_MIXED_OBJECT_LINKED:
9496
case GC_ObjectModel::SCAN_ATOMIC_MARKABLE_REFERENCE_OBJECT:
9597
case GC_ObjectModel::SCAN_MIXED_OBJECT:
9698
case GC_ObjectModel::SCAN_CLASS_OBJECT:
@@ -118,6 +120,7 @@ class GC_ObjectIterator {
118120
switch (_type) {
119121
case GC_ObjectModel::SCAN_INVALID_OBJECT:
120122
return;
123+
case GC_ObjectModel::SCAN_MIXED_OBJECT_LINKED:
121124
case GC_ObjectModel::SCAN_ATOMIC_MARKABLE_REFERENCE_OBJECT:
122125
case GC_ObjectModel::SCAN_MIXED_OBJECT:
123126
case GC_ObjectModel::SCAN_CLASS_OBJECT:
@@ -142,6 +145,7 @@ class GC_ObjectIterator {
142145
switch (_type) {
143146
case GC_ObjectModel::SCAN_INVALID_OBJECT:
144147
return;
148+
case GC_ObjectModel::SCAN_MIXED_OBJECT_LINKED:
145149
case GC_ObjectModel::SCAN_ATOMIC_MARKABLE_REFERENCE_OBJECT:
146150
case GC_ObjectModel::SCAN_MIXED_OBJECT:
147151
case GC_ObjectModel::SCAN_CLASS_OBJECT:

runtime/gc_glue_java/ObjectModel.hpp

+7-1
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ class GC_ObjectModel : public GC_ObjectModelBase
114114
SCAN_CLASSLOADER_OBJECT = 6,
115115
SCAN_ATOMIC_MARKABLE_REFERENCE_OBJECT = 7,
116116
SCAN_OWNABLESYNCHRONIZER_OBJECT = 8,
117+
SCAN_MIXED_OBJECT_LINKED = 9
117118
};
118119

119120
/**
@@ -179,7 +180,12 @@ class GC_ObjectModel : public GC_ObjectModelBase
179180
{
180181
UDATA classFlags = J9CLASS_FLAGS(clazz) & (J9AccClassReferenceMask | J9AccClassGCSpecial | J9AccClassOwnableSynchronizer);
181182
if (0 == classFlags) {
182-
result = SCAN_MIXED_OBJECT;
183+
/* TODO try an approach with a separate class flag */
184+
if (0 != clazz->selfReferencingField1) {
185+
result = SCAN_MIXED_OBJECT_LINKED;
186+
} else {
187+
result = SCAN_MIXED_OBJECT;
188+
}
183189
} else {
184190
if (0 != (classFlags & J9AccClassReferenceMask)) {
185191
result = SCAN_REFERENCE_MIXED_OBJECT;

runtime/gc_glue_java/ScavengerDelegate.cpp

+6-2
Original file line numberDiff line numberDiff line change
@@ -265,7 +265,12 @@ MM_ScavengerDelegate::getObjectScanner(MM_EnvironmentStandard *env, omrobjectptr
265265
#endif /* defined(OMR_GC_MODRON_STRICT) */
266266

267267
GC_ObjectScanner *objectScanner = NULL;
268-
switch(_extensions->objectModel.getScanType(objectPtr)) {
268+
J9Class *clazzPtr = J9GC_J9OBJECT_CLAZZ(objectPtr);
269+
270+
switch(_extensions->objectModel.getScanType(clazzPtr)) {
271+
case GC_ObjectModel::SCAN_MIXED_OBJECT_LINKED:
272+
_extensions->scavenger->deepScan(env, objectPtr, clazzPtr->selfReferencingField1, clazzPtr->selfReferencingField2);
273+
/* Fall through and treat as mixed object (create mixed object scanner) */
269274
case GC_ObjectModel::SCAN_ATOMIC_MARKABLE_REFERENCE_OBJECT:
270275
case GC_ObjectModel::SCAN_MIXED_OBJECT:
271276
case GC_ObjectModel::SCAN_CLASS_OBJECT:
@@ -281,7 +286,6 @@ MM_ScavengerDelegate::getObjectScanner(MM_EnvironmentStandard *env, omrobjectptr
281286
bool referentMustBeMarked = isReferenceCleared || !isObjectInNewSpace;
282287
bool referentMustBeCleared = false;
283288

284-
J9Class *clazzPtr = J9GC_J9OBJECT_CLAZZ(objectPtr);
285289
UDATA referenceObjectOptions = env->_cycleState->_referenceObjectOptions;
286290
UDATA referenceObjectType = J9CLASS_FLAGS(clazzPtr) & J9AccClassReferenceMask;
287291
switch (referenceObjectType) {

runtime/gc_realtime/RealtimeAccessBarrier.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,7 @@ MM_RealtimeAccessBarrier::validateWriteBarrier(J9VMThread *vmThread, J9Object *d
190190
PORT_ACCESS_FROM_JAVAVM(javaVM);
191191

192192
switch(_extensions->objectModel.getScanType(dstObject)) {
193+
case GC_ObjectModel::SCAN_MIXED_OBJECT_LINKED:
193194
case GC_ObjectModel::SCAN_ATOMIC_MARKABLE_REFERENCE_OBJECT:
194195
case GC_ObjectModel::SCAN_MIXED_OBJECT:
195196
case GC_ObjectModel::SCAN_OWNABLESYNCHRONIZER_OBJECT:

runtime/gc_trace_vlhgc/TgcInterRegionReferences.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11

22
/*******************************************************************************
3-
* Copyright (c) 1991, 2017 IBM Corp. and others
3+
* Copyright (c) 1991, 2019 IBM Corp. and others
44
*
55
* This program and the accompanying materials are made available under
66
* the terms of the Eclipse Public License 2.0 which accompanies this
@@ -101,6 +101,7 @@ tgcHookReportInterRegionReferenceCounting(J9HookInterface** hookInterface, UDATA
101101
case GC_ObjectModel::SCAN_REFERENCE_MIXED_OBJECT:
102102
Assert_MM_true(GC_ObjectModel::REF_STATE_REMEMBERED != J9GC_J9VMJAVALANGREFERENCE_STATE(env, object));
103103
/* fall through */
104+
case GC_ObjectModel::SCAN_MIXED_OBJECT_LINKED:
104105
case GC_ObjectModel::SCAN_ATOMIC_MARKABLE_REFERENCE_OBJECT:
105106
case GC_ObjectModel::SCAN_MIXED_OBJECT:
106107
case GC_ObjectModel::SCAN_OWNABLESYNCHRONIZER_OBJECT:

runtime/gc_vlhgc/CopyForwardScheme.cpp

+3
Original file line numberDiff line numberDiff line change
@@ -2822,6 +2822,7 @@ MM_CopyForwardScheme::scanObject(MM_EnvironmentVLHGC *env, MM_AllocationContextT
28222822
J9Class* clazz = J9GC_J9OBJECT_CLAZZ(objectPtr);
28232823
Assert_MM_mustBeClass(clazz);
28242824
switch(_extensions->objectModel.getScanType(clazz)) {
2825+
case GC_ObjectModel::SCAN_MIXED_OBJECT_LINKED:
28252826
case GC_ObjectModel::SCAN_ATOMIC_MARKABLE_REFERENCE_OBJECT:
28262827
case GC_ObjectModel::SCAN_MIXED_OBJECT:
28272828
scanMixedObjectSlots(env, reservingContext, objectPtr, reason);
@@ -3108,6 +3109,7 @@ MM_CopyForwardScheme::incrementalScanCacheBySlot(MM_EnvironmentVLHGC *env)
31083109
while ((objectPtr = heapChunkIterator.nextObject()) != NULL) {
31093110
/* retrieve scan state of the scan cache */
31103111
switch(_extensions->objectModel.getScanType(objectPtr)) {
3112+
case GC_ObjectModel::SCAN_MIXED_OBJECT_LINKED:
31113113
case GC_ObjectModel::SCAN_ATOMIC_MARKABLE_REFERENCE_OBJECT:
31123114
case GC_ObjectModel::SCAN_MIXED_OBJECT:
31133115
case GC_ObjectModel::SCAN_OWNABLESYNCHRONIZER_OBJECT:
@@ -4474,6 +4476,7 @@ MM_CopyForwardScheme::verifyObject(MM_EnvironmentVLHGC *env, J9Object *objectPtr
44744476
J9Class* clazz = J9GC_J9OBJECT_CLAZZ(objectPtr);
44754477
Assert_MM_mustBeClass(clazz);
44764478
switch(_extensions->objectModel.getScanType(clazz)) {
4479+
case GC_ObjectModel::SCAN_MIXED_OBJECT_LINKED:
44774480
case GC_ObjectModel::SCAN_ATOMIC_MARKABLE_REFERENCE_OBJECT:
44784481
case GC_ObjectModel::SCAN_MIXED_OBJECT:
44794482
case GC_ObjectModel::SCAN_OWNABLESYNCHRONIZER_OBJECT:

runtime/gc_vlhgc/GlobalMarkCardScrubber.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,7 @@ MM_GlobalMarkCardScrubber::scrubObject(MM_EnvironmentVLHGC *env, J9Object *objec
129129
Assert_MM_mustBeClass(clazz);
130130
switch(MM_GCExtensions::getExtensions(env)->objectModel.getScanType(clazz)) {
131131
case GC_ObjectModel::SCAN_ATOMIC_MARKABLE_REFERENCE_OBJECT:
132+
case GC_ObjectModel::SCAN_MIXED_OBJECT_LINKED:
132133
case GC_ObjectModel::SCAN_MIXED_OBJECT:
133134
case GC_ObjectModel::SCAN_OWNABLESYNCHRONIZER_OBJECT:
134135
case GC_ObjectModel::SCAN_REFERENCE_MIXED_OBJECT:

runtime/gc_vlhgc/GlobalMarkingScheme.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -867,6 +867,7 @@ MM_GlobalMarkingScheme::scanObject(MM_EnvironmentVLHGC *env, J9Object *objectPtr
867867
J9Class* clazz = J9GC_J9OBJECT_CLAZZ(objectPtr);
868868
Assert_MM_mustBeClass(clazz);
869869
switch(_extensions->objectModel.getScanType(clazz)) {
870+
case GC_ObjectModel::SCAN_MIXED_OBJECT_LINKED:
870871
case GC_ObjectModel::SCAN_ATOMIC_MARKABLE_REFERENCE_OBJECT:
871872
case GC_ObjectModel::SCAN_MIXED_OBJECT:
872873
case GC_ObjectModel::SCAN_OWNABLESYNCHRONIZER_OBJECT:

runtime/gc_vlhgc/IncrementalGenerationalGC.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -1785,6 +1785,7 @@ MM_IncrementalGenerationalGC::verifyMarkMapClosure(MM_EnvironmentVLHGC *env, MM_
17851785
case GC_ObjectModel::SCAN_REFERENCE_MIXED_OBJECT:
17861786
Assert_MM_true(GC_ObjectModel::REF_STATE_REMEMBERED != J9GC_J9VMJAVALANGREFERENCE_STATE(env, object));
17871787
/* fall through */
1788+
case GC_ObjectModel::SCAN_MIXED_OBJECT_LINKED:
17881789
case GC_ObjectModel::SCAN_ATOMIC_MARKABLE_REFERENCE_OBJECT:
17891790
case GC_ObjectModel::SCAN_MIXED_OBJECT:
17901791
case GC_ObjectModel::SCAN_CLASS_OBJECT:

runtime/gc_vlhgc/PartialMarkingScheme.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -872,6 +872,7 @@ MM_PartialMarkingScheme::scanObject(MM_EnvironmentVLHGC *env, J9Object *objectPt
872872
J9Class* clazz = J9GC_J9OBJECT_CLAZZ(objectPtr);
873873
Assert_MM_mustBeClass(clazz);
874874
switch(_extensions->objectModel.getScanType(clazz)) {
875+
case GC_ObjectModel::SCAN_MIXED_OBJECT_LINKED:
875876
case GC_ObjectModel::SCAN_ATOMIC_MARKABLE_REFERENCE_OBJECT:
876877
case GC_ObjectModel::SCAN_MIXED_OBJECT:
877878
scanMixedObject(env, objectPtr, reason);

runtime/gc_vlhgc/WriteOnceCompactor.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -1383,6 +1383,7 @@ MM_WriteOnceCompactor::fixupObject(MM_EnvironmentVLHGC* env, J9Object *objectPtr
13831383
J9Class* clazz = J9GC_J9OBJECT_CLAZZ(objectPtr);
13841384
Assert_MM_mustBeClass(clazz);
13851385
switch(_extensions->objectModel.getScanType(clazz)) {
1386+
case GC_ObjectModel::SCAN_MIXED_OBJECT_LINKED:
13861387
case GC_ObjectModel::SCAN_ATOMIC_MARKABLE_REFERENCE_OBJECT:
13871388
case GC_ObjectModel::SCAN_MIXED_OBJECT:
13881389
case GC_ObjectModel::SCAN_REFERENCE_MIXED_OBJECT:
@@ -1821,6 +1822,7 @@ MM_WriteOnceCompactor::verifyHeap(MM_EnvironmentVLHGC *env, bool beforeCompactio
18211822

18221823
while (J9Object* objectPtr = markedObjectIterator.nextObject()) {
18231824
switch(_extensions->objectModel.getScanType(objectPtr)) {
1825+
case GC_ObjectModel::SCAN_MIXED_OBJECT_LINKED:
18241826
case GC_ObjectModel::SCAN_ATOMIC_MARKABLE_REFERENCE_OBJECT:
18251827
case GC_ObjectModel::SCAN_MIXED_OBJECT:
18261828
case GC_ObjectModel::SCAN_OWNABLESYNCHRONIZER_OBJECT:

runtime/oti/j9nonbuilder.h

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/*******************************************************************************
2-
* Copyright (c) 1991, 2019 IBM Corp. and others
32
*
3+
* Copyright (c) 1991, 2019 IBM Corp. and others
44
* This program and the accompanying materials are made available under
55
* the terms of the Eclipse Public License 2.0 which accompanies this
66
* distribution and is available at https://www.eclipse.org/legal/epl-2.0/
@@ -2978,6 +2978,8 @@ typedef struct J9Class {
29782978
UDATA* instanceLeafDescription;
29792979
#endif /* J9VM_GC_LEAF_BITS */
29802980
UDATA instanceHotFieldDescription;
2981+
UDATA selfReferencingField1;
2982+
UDATA selfReferencingField2;
29812983
struct J9Method* initializerCache;
29822984
UDATA romableAotITable;
29832985
UDATA packageID;
@@ -3044,6 +3046,8 @@ typedef struct J9ArrayClass {
30443046
UDATA* instanceLeafDescription;
30453047
#endif /* J9VM_GC_LEAF_BITS */
30463048
UDATA instanceHotFieldDescription;
3049+
UDATA selfReferencingField1;
3050+
UDATA selfReferencingField2;
30473051
struct J9Method* initializerCache;
30483052
UDATA romableAotITable;
30493053
UDATA packageID;

runtime/vm/createramclass.cpp

+4
Original file line numberDiff line numberDiff line change
@@ -2691,6 +2691,10 @@ internalCreateRAMClassFromROMClassImpl(J9VMThread *vmThread, J9ClassLoader *clas
26912691
memcpy(ramClass->superclasses, superclass->superclasses, superclassCount * sizeof(UDATA));
26922692
}
26932693
ramClass->superclasses[superclassCount] = superclass;
2694+
2695+
/* Propagate self referencing field offsets from superclass (special treated during GC) - these take priority over self referencing fields of derived class*/
2696+
ramClass->selfReferencingField1 = superclass->selfReferencingField1;
2697+
ramClass->selfReferencingField2 = superclass->selfReferencingField2;
26942698
}
26952699
tempClassDepthAndFlags |= ((romClass->instanceShape & OBJECT_HEADER_SHAPE_MASK) << J9AccClassRAMShapeShift);
26962700
if (J9ROMCLASS_IS_ARRAY(romClass)) {

runtime/vm/description.c

+16-2
Original file line numberDiff line numberDiff line change
@@ -79,10 +79,12 @@ calculateInstanceDescription( J9VMThread *vmThread, J9Class *ramClass, J9Class *
7979
{
8080
UDATA superClassSize, totalSize, temp, shapeSlots;
8181
UDATA *shape;
82+
83+
J9UTF8 *className = J9ROMCLASS_CLASSNAME(ramClass->romClass);
84+
8285
#ifdef J9VM_GC_LEAF_BITS
8386
UDATA leafTemp;
8487
UDATA *leafShape;
85-
J9UTF8 *className = J9ROMCLASS_CLASSNAME(ramClass->romClass);
8688
UDATA isString = J9UTF8_LITERAL_EQUALS(J9UTF8_DATA(className), J9UTF8_LENGTH(className), "java/lang/String");
8789
#endif
8890

@@ -163,8 +165,20 @@ calculateInstanceDescription( J9VMThread *vmThread, J9Class *ramClass, J9Class *
163165
{
164166
while (walkResult->field) {
165167
UDATA slotOffset = walkResult->offset / (objectSlotSize * slotsPerShapeElement);
168+
J9UTF8 *fieldSig = J9ROMFIELDSHAPE_SIGNATURE(walkResult->field);
169+
U_8 *fieldSigBytes = J9UTF8_DATA(fieldSig);
170+
U_16 fieldSigLength = J9UTF8_LENGTH(fieldSig);
171+
172+
/* If the field is self referencing then store the offset to it (at most 2). Self referencing fields are to be scanned with priority during GC */
173+
if (((ramClass->selfReferencingField1 == 0) || (ramClass->selfReferencingField2 == 0)) && J9UTF8_DATA_EQUALS(J9UTF8_DATA(className), J9UTF8_LENGTH(className), fieldSigBytes + 1, fieldSigLength - 2)) {
174+
if (ramClass->selfReferencingField1 == 0) {
175+
ramClass->selfReferencingField1 = walkResult->offset + J9_OBJECT_HEADER_SIZE;
176+
} else {
177+
ramClass->selfReferencingField2 = walkResult->offset + J9_OBJECT_HEADER_SIZE;
178+
}
179+
}
180+
166181
#ifdef J9VM_OPT_VALHALLA_VALUE_TYPES
167-
U_8 *fieldSigBytes = J9UTF8_DATA(J9ROMFIELDSHAPE_SIGNATURE(walkResult->field));
168182
if ('Q' == *fieldSigBytes) {
169183
J9Class *fieldClass = walkResult->flattenedClass;
170184
if ((NULL != fieldClass) && J9_ARE_ALL_BITS_SET(fieldClass->classFlags, J9ClassIsFlattened)) {

0 commit comments

Comments
 (0)