/** * Walk all objects in the heap in a single threaded linear fashion. */ void MM_HeapWalker::allObjectsDo(MM_EnvironmentBase *env, MM_HeapWalkerObjectFunc function, void *userData, uintptr_t walkFlags, bool parallel, bool prepareHeapForWalk) { uintptr_t typeFlags = 0; GC_OMRVMInterface::flushCachesForWalk(env->getOmrVM()); if (walkFlags & J9_MU_WALK_NEW_AND_REMEMBERED_ONLY) { typeFlags |= MEMORY_TYPE_NEW; } MM_GCExtensionsBase *extensions = env->getExtensions(); MM_HeapRegionManager *regionManager = extensions->heap->getHeapRegionManager(); GC_HeapRegionIterator regionIterator(regionManager); MM_HeapRegionDescriptor *region = NULL; OMR_VMThread *omrVMThread = env->getOmrVMThread(); while (NULL != (region = regionIterator.nextRegion())) { if (typeFlags == (region->getTypeFlags() & typeFlags)) { /* Optimization to avoid virtual dispatch for every slot in the system */ omrobjectptr_t object = NULL; GC_ObjectHeapIteratorAddressOrderedList liveObjectIterator(extensions, region, false); while (NULL != (object = liveObjectIterator.nextObject())) { function(omrVMThread, region, object, userData); } } } }