void MM_TLHAllocationSupport::objectAllocationNotify(MM_EnvironmentBase *env, void *heapBase, void *heapTop) { MM_GCExtensionsBase *extensions = env->getExtensions(); MM_CollectorLanguageInterface * cli = extensions->collectorLanguageInterface; GC_ObjectHeapIteratorAddressOrderedList objectHeapIterator(extensions, (omrobjectptr_t)heapBase, heapTop, false, false); omrobjectptr_t object = NULL; while(NULL != (object = objectHeapIterator.nextObject())){ env->objectAllocationNotify(object); } }
void MM_TLHAllocationSupport::updateFrequentObjectsStats(MM_EnvironmentBase *env) { MM_GCExtensionsBase *extensions = env->getExtensions(); MM_FrequentObjectsStats* frequentObjectsStats = _objectAllocationInterface->getFrequentObjectsStats(); if(NULL != frequentObjectsStats){ /* presumably first and current alloc pointer will point to an object */ GC_ObjectHeapIteratorAddressOrderedList objectHeapIterator(extensions, (omrobjectptr_t) getBase(), (omrobjectptr_t) getAlloc(), false, false); omrobjectptr_t object = NULL; uintptr_t limit = (((uintptr_t) getAlloc() - (uintptr_t) getBase())*extensions->frequentObjectAllocationSamplingRate)/100 + (uintptr_t) getBase(); while(NULL != (object = objectHeapIterator.nextObject())){ if( ((uintptr_t) object) > limit){ break; } frequentObjectsStats->update(env, object); } } }
void MM_SegregatedAllocationInterface::updateFrequentObjectsStats(MM_EnvironmentBase *env, uintptr_t sizeClass) { MM_GCExtensionsBase *extensions = env->getExtensions(); MM_AllocationContextSegregated *ac = (MM_AllocationContextSegregated *) env->getAllocationContext(); omrobjectptr_t base = (omrobjectptr_t) _allocationCacheBases[sizeClass]; omrobjectptr_t top = (omrobjectptr_t) _allocationCache[sizeClass].top; if((NULL != _frequentObjectsStats) && (NULL != base) && (NULL != top)){ uintptr_t cellSize = _sizeClasses->getCellSize(sizeClass); GC_ObjectHeapIteratorSegregated objectHeapIterator(extensions, base, top, ac->_smallRegions[sizeClass]->getRegionType(), cellSize, false, false); omrobjectptr_t object = NULL; uintptr_t limit = (((uintptr_t) top - (uintptr_t) base)*extensions->frequentObjectAllocationSamplingRate)/100 + (uintptr_t) base; while(NULL != (object = objectHeapIterator.nextObject())){ if( ((uintptr_t) object) > limit){ break; } _frequentObjectsStats->update(env, object); } } }