Skip to content

Commit 24525c3

Browse files
authored
Merge pull request #19029 from dmitripivkine/0.44
(0.44)Add missed scan for modules in System and Application class loaders
2 parents a78d091 + 0e069b3 commit 24525c3

File tree

2 files changed

+32
-24
lines changed

2 files changed

+32
-24
lines changed

runtime/gc_base/RootScanner.cpp

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -395,44 +395,44 @@ MM_RootScanner::scanPermanentClasses(MM_EnvironmentBase *env)
395395
{
396396
reportScanningStarted(RootScannerEntity_PermanentClasses);
397397

398+
/* Do systemClassLoader */
399+
scanClassloader(env, static_cast<J9JavaVM*>(_omrVM->_language_vm)->systemClassLoader);
400+
401+
/* Do applicationClassLoader */
402+
scanClassloader(env, static_cast<J9JavaVM*>(_omrVM->_language_vm)->applicationClassLoader);
403+
404+
condYield();
405+
406+
reportScanningEnded(RootScannerEntity_PermanentClasses);
407+
}
408+
409+
/**
410+
* Scan all objects from class loader.
411+
*/
412+
void
413+
MM_RootScanner::scanClassloader(MM_EnvironmentBase *env, J9ClassLoader *classLoader)
414+
{
398415
J9MemorySegment *segment = NULL;
399416
J9Class *clazz = NULL;
400417

401-
/* Do systemClassLoader */
402-
if (NULL != static_cast<J9JavaVM*>(_omrVM->_language_vm)->systemClassLoader) {
403-
GC_ClassLoaderSegmentIterator segmentIterator(static_cast<J9JavaVM*>(_omrVM->_language_vm)->systemClassLoader, MEMORY_TYPE_RAM_CLASS);
404-
while(NULL != (segment = segmentIterator.nextSegment())) {
405-
if(_singleThread || J9MODRON_HANDLE_NEXT_WORK_UNIT(env)) {
418+
if (NULL != classLoader) {
419+
GC_ClassLoaderSegmentIterator segmentIterator(classLoader, MEMORY_TYPE_RAM_CLASS);
420+
while (NULL != (segment = segmentIterator.nextSegment())) {
421+
if (_singleThread || J9MODRON_HANDLE_NEXT_WORK_UNIT(env)) {
406422
GC_ClassHeapIterator classHeapIterator(static_cast<J9JavaVM*>(_omrVM->_language_vm), segment);
407-
while(NULL != (clazz = classHeapIterator.nextClass())) {
423+
while (NULL != (clazz = classHeapIterator.nextClass())) {
408424
doClass(clazz);
409425
if (shouldYieldFromClassScan(100000)) {
410426
yield();
411427
}
412428
}
413429
}
414430
}
415-
}
416431

417-
/* Do applicationClassLoader */
418-
if (NULL != static_cast<J9JavaVM*>(_omrVM->_language_vm)->applicationClassLoader) {
419-
GC_ClassLoaderSegmentIterator segmentIterator(static_cast<J9JavaVM*>(_omrVM->_language_vm)->applicationClassLoader, MEMORY_TYPE_RAM_CLASS);
420-
while(NULL != (segment = segmentIterator.nextSegment())) {
421-
if(_singleThread || J9MODRON_HANDLE_NEXT_WORK_UNIT(env)) {
422-
GC_ClassHeapIterator classHeapIterator(static_cast<J9JavaVM*>(_omrVM->_language_vm), segment);
423-
while(NULL != (clazz = classHeapIterator.nextClass())) {
424-
doClass(clazz);
425-
if (shouldYieldFromClassScan(100000)) {
426-
yield();
427-
}
428-
}
429-
}
432+
if (_singleThread || J9MODRON_HANDLE_NEXT_WORK_UNIT(env)) {
433+
scanModularityObjects(classLoader);
430434
}
431435
}
432-
433-
condYield();
434-
435-
reportScanningEnded(RootScannerEntity_PermanentClasses);
436436
}
437437
#endif /* J9VM_GC_DYNAMIC_CLASS_UNLOADING */
438438

runtime/gc_base/RootScanner.hpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,14 @@ class MM_RootScanner : public MM_BaseVirtual
122122
void scanArrayObject(MM_EnvironmentBase *env, J9Object *objectPtr, MM_MemoryPool *memoryPool, MM_HeapRegionManager *manager, uintptr_t memoryType);
123123

124124
bool isContinuationListEmpty(MM_EnvironmentBase *env);
125+
126+
/**
127+
* Scan all objects from class loader.
128+
* @param env thread GC environment
129+
* @param classLoader class loader address
130+
*/
131+
void scanClassloader(MM_EnvironmentBase *env, J9ClassLoader *classLoader);
132+
125133
protected:
126134
/* Family of yielding methods to be overridden by incremental scanners such
127135
* as the RealtimeRootScanner. The default implementations of these do

0 commit comments

Comments
 (0)