示例#1
0
/**
 * 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);
			}
		}
	}
}