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 */
417417checkEdenSizeAfterPgc(env, globalSweepHappened);
418-calculateEdenSize(env);
418+calculateEdenSize(env, true);
419419/* Recalculate GMP intermission after (possibly) resizing eden */
420420calculateAutomaticGMPIntermission(env);
421421estimateMacroDefragmentationWork(env);
@@ -1322,7 +1322,7 @@ MM_SchedulingDelegate::updateSurvivalRatesAfterCopyForward(double thisEdenSurviv
13221322}
1323132313241324void
1325-MM_SchedulingDelegate::calculateEdenSize(MM_EnvironmentVLHGC *env)
1325+MM_SchedulingDelegate::calculateEdenSize(MM_EnvironmentVLHGC *env, bool allowTotalHeapResize)
13261326{
13271327uintptr_t regionSize = _regionManager->getRegionSize();
13281328uintptr_t previousEdenSize = _edenRegionCount * regionSize;
@@ -1341,7 +1341,7 @@ MM_SchedulingDelegate::calculateEdenSize(MM_EnvironmentVLHGC *env)
13411341Assert_MM_true(edenMaximumCount >= 1);
13421342Assert_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. */
13451345uintptr_t desiredEdenCount = OMR_MAX(edenMaximumCount, edenMinimumCount);
13461346intptr_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)
1351135113521352Trc_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;
1389138013901381Trc_MM_SchedulingDelegate_calculateEdenSize_Exit(env->getLanguageVMThread(), (_edenRegionCount * regionSize));
13911382}