--- old/src/hotspot/share/gc/shenandoah/heuristics/shenandoahAdaptiveHeuristics.cpp 2020-04-02 15:32:40.831234403 +0200 +++ new/src/hotspot/share/gc/shenandoah/heuristics/shenandoahAdaptiveHeuristics.cpp 2020-04-02 15:32:40.531233544 +0200 @@ -60,9 +60,9 @@ // ShenandoahGarbageThreshold is the soft threshold which would be ignored until min_garbage is hit. size_t capacity = ShenandoahHeap::heap()->max_capacity(); - size_t free_target = capacity / 100 * ShenandoahMinFreeThreshold; - size_t min_garbage = free_target > actual_free ? (free_target - actual_free) : 0; size_t max_cset = (size_t)((1.0 * capacity / 100 * ShenandoahEvacReserve) / ShenandoahEvacWaste); + size_t free_target = (capacity / 100 * ShenandoahMinFreeThreshold) + max_cset; + size_t min_garbage = (free_target > actual_free ? (free_target - actual_free) : 0); log_info(gc, ergo)("Adaptive CSet Selection. Target Free: " SIZE_FORMAT "%s, Actual Free: " SIZE_FORMAT "%s, Max CSet: " SIZE_FORMAT "%s, Min Garbage: " SIZE_FORMAT "%s", --- old/src/hotspot/share/gc/shenandoah/heuristics/shenandoahTraversalHeuristics.cpp 2020-04-02 15:32:41.611236638 +0200 +++ new/src/hotspot/share/gc/shenandoah/heuristics/shenandoahTraversalHeuristics.cpp 2020-04-02 15:32:41.311235779 +0200 @@ -100,9 +100,10 @@ size_t capacity = heap->max_capacity(); size_t actual_free = heap->free_set()->available(); - size_t free_target = capacity / 100 * ShenandoahMinFreeThreshold; - size_t min_garbage = free_target > actual_free ? (free_target - actual_free) : 0; + size_t max_cset = (size_t)((1.0 * capacity / 100 * ShenandoahEvacReserve) / ShenandoahEvacWaste); + size_t free_target = (capacity / 100 * ShenandoahMinFreeThreshold) + max_cset; + size_t min_garbage = free_target > actual_free ? (free_target - actual_free) : 0; log_info(gc, ergo)("Adaptive CSet Selection. Target Free: " SIZE_FORMAT "%s, Actual Free: " SIZE_FORMAT "%s, Max CSet: " SIZE_FORMAT "%s, Min Garbage: " SIZE_FORMAT "%s",