# HG changeset patch # User shade # Date 1569310694 -7200 # Node ID cdce40c3286f8b16900ab26aa8a97ba1f147240f # Parent 03fce7b04b4214416bbf513bfa6ab49e6569bbdc 8231395: Backout JDK-8231249 Reviewed-by: tschatzl diff -r 03fce7b04b42 -r cdce40c3286f src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp --- a/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp Tue Sep 24 03:28:42 2019 -0400 +++ b/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp Tue Sep 24 09:38:14 2019 +0200 @@ -809,12 +809,22 @@ // way later after GC happened, only to fail the second allocation, because // other threads have already depleted the free storage. In this case, a better // strategy is to try again, as long as GC makes progress. - - if (result == NULL) { - do { - control_thread()->handle_alloc_failure(req.size()); - result = allocate_memory_under_lock(req, in_new_region); - } while (result == NULL && _progress_last_gc.is_set()); + // + // Then, we need to make sure the allocation was retried after at least one + // Full GC, which means we want to try more than ShenandoahFullGCThreshold times. + + size_t tries = 0; + + while (result == NULL && _progress_last_gc.is_set()) { + tries++; + control_thread()->handle_alloc_failure(req.size()); + result = allocate_memory_under_lock(req, in_new_region); + } + + while (result == NULL && tries <= ShenandoahFullGCThreshold) { + tries++; + control_thread()->handle_alloc_failure(req.size()); + result = allocate_memory_under_lock(req, in_new_region); } } else {