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