Skip to content

Commit

Permalink
Reset TLH sizing at first increment for CS
Browse files Browse the repository at this point in the history
We reduce current refresh size at GC points, so that slow allocating
threads have a chance to reduce their current refresh size.

It's done toward the end of a GC cycle, which means that for Concurrent
Scavegner it's done at the end of 2nd GC increment.

However, it's slighty better to do it at the end of 1st increment since
it will cuase TLH to be slighly smaller during concurrent phase of the
cycle.

During the concurrent phase there are other activities like GC
background threads and read-barriers that effectively slow down the
allocation rate of mutator threads, so there is less contention among
them and less need for larger TLHs.

Also, since allocate space is much smaller during concurrent phase of
GC, smaller TLHs will lead to smaller discards for the last TLH refresh,
which leads to more tilting and less frequent GC cycles.

Signed-off-by: Aleksandar Micic <Aleksandar_Micic@ca.ibm.com>
  • Loading branch information
Aleksandar Micic authored and Aleksandar Micic committed Feb 6, 2024
1 parent 3e1bb69 commit 9d43516
Showing 1 changed file with 8 additions and 10 deletions.
18 changes: 8 additions & 10 deletions gc/base/standard/Scavenger.cpp
Expand Up @@ -4248,6 +4248,14 @@ MM_Scavenger::mainThreadGarbageCollect(MM_EnvironmentBase *envBase, MM_AllocateD
reportGCCycleStart(env);
_cycleTimes.cycleStart = omrtime_hires_clock();
mainSetupForGC(env);

/* Restart the allocation caches associated to all threads */
GC_OMRVMThreadListIterator threadListIterator(_omrVM);
OMR_VMThread *walkThread = NULL;
while ((walkThread = threadListIterator.nextOMRVMThread()) != NULL) {
MM_EnvironmentBase *walkEnv = MM_EnvironmentBase::getEnvironment(walkThread);
walkEnv->_objectAllocationInterface->restartCache(env);
}
}
clearIncrementGCStats(env, firstIncrement);
reportGCStart(env);
Expand Down Expand Up @@ -4330,16 +4338,6 @@ MM_Scavenger::mainThreadGarbageCollect(MM_EnvironmentBase *envBase, MM_AllocateD
_evacuateMemorySubSpace = _activeSubSpace->getMemorySubSpaceSurvivor();
_activeSubSpace->cacheRanges(_evacuateMemorySubSpace, &_evacuateSpaceBase, &_evacuateSpaceTop);
#endif
/* Restart the allocation caches associated to all threads */
{
GC_OMRVMThreadListIterator threadListIterator(_omrVM);
OMR_VMThread *walkThread;
while((walkThread = threadListIterator.nextOMRVMThread()) != NULL) {
MM_EnvironmentBase *walkEnv = MM_EnvironmentBase::getEnvironment(walkThread);
walkEnv->_objectAllocationInterface->restartCache(env);
}
}

_extensions->heap->resetHeapStatistics(false);

/* If there was a failed tenure of a size greater than the threshold, set the flag. */
Expand Down

0 comments on commit 9d43516

Please sign in to comment.