RFR: Underflow in adaptive free_threshold calculation

Aleksey Shipilev shade at redhat.com
Fri Aug 4 08:53:11 UTC 2017


Happens when free threshold is already small, and "step" moves it over the zero to negative value.
But, because we calculate with unsigned math, it underflows. This is not catastrophic, because we
would cap at ShenandoahMaxFreeThreshold, but it is a performance bug nevertheless.

Fix:

$ hg diff
diff -r 01ce666f15f1 src/share/vm/gc/shenandoah/shenandoahCollectorPolicy.cpp
--- a/src/share/vm/gc/shenandoah/shenandoahCollectorPolicy.cpp	Thu Aug 03 17:21:19 2017 +0200
+++ b/src/share/vm/gc/shenandoah/shenandoahCollectorPolicy.cpp	Fri Aug 04 10:50:35 2017 +0200
@@ -676,7 +676,8 @@
   }

   void adjust_free_threshold(intx adj) {
-    uintx new_threshold = _free_threshold + adj;
+    intx new_value = adj + _free_threshold;
+    uintx new_threshold = (uintx)MAX2<intx>(new_value, 0);
     new_threshold = MAX2(new_threshold, ShenandoahMinFreeThreshold);
     new_threshold = MIN2(new_threshold, ShenandoahMaxFreeThreshold);
     if (new_threshold != _free_threshold) {

Testing: some performance tests, hotspot_gc_shenandoah

Thanks,
-Aleksey



More information about the shenandoah-dev mailing list