Merge pull request #22150 from LinHu2016/pmr_committedsizeisssue · eclipse-openj9/openj9@a075ec5

@@ -415,7 +415,7 @@ MM_SchedulingDelegate::partialGarbageCollectCompleted(MM_EnvironmentVLHGC *env,

415415416416

/* Check eden size based off of new PGC stats */

417417

checkEdenSizeAfterPgc(env, globalSweepHappened);

418-

calculateEdenSize(env);

418+

calculateEdenSize(env, true);

419419

/* Recalculate GMP intermission after (possibly) resizing eden */

420420

calculateAutomaticGMPIntermission(env);

421421

estimateMacroDefragmentationWork(env);

@@ -1322,7 +1322,7 @@ MM_SchedulingDelegate::updateSurvivalRatesAfterCopyForward(double thisEdenSurviv

13221322

}

1323132313241324

void

1325-

MM_SchedulingDelegate::calculateEdenSize(MM_EnvironmentVLHGC *env)

1325+

MM_SchedulingDelegate::calculateEdenSize(MM_EnvironmentVLHGC *env, bool allowTotalHeapResize)

13261326

{

13271327

uintptr_t regionSize = _regionManager->getRegionSize();

13281328

uintptr_t previousEdenSize = _edenRegionCount * regionSize;

@@ -1341,7 +1341,7 @@ MM_SchedulingDelegate::calculateEdenSize(MM_EnvironmentVLHGC *env)

13411341

Assert_MM_true(edenMaximumCount >= 1);

13421342

Assert_MM_true(edenMaximumCount >= edenMinimumCount);

134313431344-

/* Allow eden to expand as much as it wants, as long as the total heap can expand to accomodate it */

1344+

/* Allow eden to expand as much as it wants, as long as the total heap can expand to accomodate it. */

13451345

uintptr_t desiredEdenCount = OMR_MAX(edenMaximumCount, edenMinimumCount);

13461346

intptr_t desiredEdenChangeSize = (intptr_t)desiredEdenCount - (intptr_t)_edenRegionCount;

13471347

/* Determine if eden should try to grow anyways, or if the heap is tight on memory */

@@ -1351,41 +1351,32 @@ MM_SchedulingDelegate::calculateEdenSize(MM_EnvironmentVLHGC *env)

1351135113521352

Trc_MM_SchedulingDelegate_calculateEdenSize_dynamic(env->getLanguageVMThread(), desiredEdenCount, _edenSurvivalRateCopyForward, _nonEdenSurvivalCountCopyForward, freeRegions, edenMinimumCount, edenMaximumCount);

135313531354-

/* Make sure that the total heap can expand enough to satisfy the desired change in eden size

1355-

* If heap is fully expanded (or close to) make sure that there are enough free regions to satisfy given eden size change

1356-

*/

1357-

intptr_t maxEdenChange = 0;

1358-

uintptr_t maxEdenRegionCount = _extensions->getHeap()->getHeapRegionManager()->getTableRegionCount();

1359-

bool edenIsVerySmall = (_edenRegionCount * 64) < maxEdenRegionCount;

1354+

/* Eden size can not be bigger than free region size. */

1355+

intptr_t maxEdenChange = freeRegions - _edenRegionCount;

1356+

if (allowTotalHeapResize) {

136013571361-

/* Eden will be stealing free regions from the entire heap, without telling the heap to grow.

1362-

* Note: the eden sizing logic knows how much free memory is available in the heap, and knows to not grow too much.

1363-

* eden size can not be bigger than free region size.

1364-

*/

1365-

maxEdenChange = freeRegions - _edenRegionCount;

1358+

/* Make sure that the total heap can expand enough to satisfy the desired change in eden size.

1359+

* If heap is fully expanded (or close to) make sure that there are enough free regions to satisfy given eden size change.

1360+

*/

1361+

/* Proportionally adjust survivor area. */

1362+

intptr_t edenChangeWithSurvivorHeadroom = desiredEdenChangeSize + (intptr_t)ceil((double)desiredEdenChangeSize * _edenSurvivalRateCopyForward);

136613631367-

if (0 == maxHeapExpansionRegions) {

1368-

_extensions->globalVLHGCStats._heapSizingData.edenRegionChange = 0;

1369-

} else {

1370-

/* Eden will inform the total heap resizing logic, that it needs to change total heap size in order to maintain same "tenure" size */

1371-

maxEdenChange += maxHeapExpansionRegions;

1372-

intptr_t edenChangeWithSurvivorHeadroom = desiredEdenChangeSize;

1373-1374-

/* Total heap needs to be aware that by changing eden size, the amount of survivor space might also need to change */

1375-

if (0 < desiredEdenChangeSize) {

1376-

edenChangeWithSurvivorHeadroom = desiredEdenChangeSize + (intptr_t)ceil(((double)desiredEdenChangeSize * _edenSurvivalRateCopyForward));

1377-

} else if ((0 > desiredEdenChangeSize) && !edenIsVerySmall) {

1378-

/* If eden is shrinking, only factor adjusting in survivor regions for total heap resizing when eden is not very small.

1379-

* Factoring in survivor regions when eden is tiny can lead to some innacuracies, and reduce free non-eden regions, which may impact performance

1364+

/* Inform the total heap resizing logic, that it needs to change total heap size in order to maintain same "tenure" size. */

1365+

if (freeRegions > _edenRegionCount) {

1366+

_extensions->globalVLHGCStats._heapSizingData.edenRegionChange = OMR_MIN(maxHeapExpansionRegions, edenChangeWithSurvivorHeadroom);

1367+

} else {

1368+

/* Partial garbage collection has not recovered enough regions to accommodate even for the current eden size.

1369+

* So, let's expand heap by that deficit (capped to the maximum that heap expansion allows), plus whatever the new eden size requires).

13801370

*/

1381-

edenChangeWithSurvivorHeadroom = desiredEdenChangeSize + (intptr_t)floor(((double)desiredEdenChangeSize * _edenSurvivalRateCopyForward));

1371+

_extensions->globalVLHGCStats._heapSizingData.edenRegionChange = OMR_MIN(maxHeapExpansionRegions, edenChangeWithSurvivorHeadroom + (intptr_t)(_edenRegionCount - freeRegions));

13821372

}

1383-

_extensions->globalVLHGCStats._heapSizingData.edenRegionChange = OMR_MIN(maxEdenChange, edenChangeWithSurvivorHeadroom);

1373+1374+

maxEdenChange += maxHeapExpansionRegions;

13841375

}

1385137613861377

desiredEdenChangeSize = OMR_MIN(maxEdenChange, desiredEdenChangeSize);

1387-1388-

_edenRegionCount = (uintptr_t)OMR_MAX(1, ((intptr_t)_edenRegionCount + desiredEdenChangeSize));

1378+

Assert_MM_true(0 <= ((intptr_t)_edenRegionCount + desiredEdenChangeSize));

1379+

_edenRegionCount = _edenRegionCount + desiredEdenChangeSize;

1389138013901381

Trc_MM_SchedulingDelegate_calculateEdenSize_Exit(env->getLanguageVMThread(), (_edenRegionCount * regionSize));

13911382

}