RFR: GCLAB slowpath allocations should fit the object into GCLAB

Roman Kennke rkennke at redhat.com
Mon Jul 16 11:34:59 UTC 2018


Am 16.07.2018 um 13:22 schrieb Aleksey Shipilev:
> Was backporting this code, and realized that we have a bad bug: we can get GCLAB smaller than
> allocation that should fit in it! Oops. The bug seems preexisting -- e.g. GCLAB stats might have
> replied smaller size too -- but elastic GCLABs make it more probable.
> 
> Fixed with:
> 
> diff -r e6c9cf5a0a73 src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp
> --- a/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp        Fri Jul 13 21:14:44 2018 +0200
> +++ b/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp        Mon Jul 16 13:01:57 2018 +0200
> @@ -754,17 +754,22 @@
>      new_gclab_size = _mutator_gclab_stats->desired_plab_sz(Threads::number_of_threads());
>    } else {
>      new_gclab_size = _collector_gclab_stats->desired_plab_sz(workers()->active_workers());
>    }
> 
> +  // Allocated object should fit in new GCLAB, and new_gclab_size should be larger than min
> +  size_t min_size = MAX2(size, PLAB::min_size());
> +  new_gclab_size = MAX2(new_gclab_size, min_size);
> 
>    // Allocate a new GCLAB...
>    size_t actual_size = 0;
> -  HeapWord* gclab_buf = allocate_new_gclab(PLAB::min_size(), new_gclab_size, &actual_size);
> +  HeapWord* gclab_buf = allocate_new_gclab(min_size, new_gclab_size, &actual_size);
>    if (gclab_buf == NULL) {
>      return NULL;
>    }
> 
> +  assert (size <= actual_size, "allocation should fit");
> +
>    if (ZeroTLAB) {
>      // ..and clear it.
>      Copy::zero_to_words(gclab_buf, actual_size);
>    } else {
>      // ...and zap just allocated object.
> 
> 
> Testing: tier3_gc_shenandoah (in sh/jdk8; sh/jdk is in progress)


Okidoki
Roman




More information about the shenandoah-dev mailing list