RFR: Fix evac-locking math

Aleksey Shipilev shade at redhat.com
Mon Jun 29 12:28:02 UTC 2020


Resending for Roman's convenience.

-Aleksey

On 6/29/20 11:23 AM, Aleksey Shipilev wrote:
> This is destined to sh/jdk sandbox.
> 
> I believe current sizing math mismatches the intent. We already compute bitmap index from the *word
> size*, which means shifting that to LogHeapWordSize is incorrect. What we have now in the sandbox is
> actually 2^3 = 8 heap words per lock bit.
> 
> This reflects it better:
> 
> --- a/src/hotspot/share/gc/shenandoah/shenandoahEvacLockingBitmap.hpp   Tue Jun 23 18:07:20 2020 +0200
> +++ b/src/hotspot/share/gc/shenandoah/shenandoahEvacLockingBitmap.hpp   Mon Jun 29 11:12:00 2020 +0200
> @@ -44,19 +44,19 @@
>   */
>  class ShenandoahEvacLockingBitmap : public CHeapObj<mtGC> {
>  private:
>    MemRegion _covered;    // The heap area covered by this bitmap.
>    const int _shifter;    // Shift amount from heap index to bit index in the bitmap.
> -  CHeapBitMap _bm;        // The actual bitmap.
> +  CHeapBitMap _bm;       // The actual bitmap.
> 
>    // Convert from address to bit offset.
>    inline size_t addr_to_offset(const HeapWord* addr) const;
> 
>  public:
>    ShenandoahEvacLockingBitmap(MemRegion heap) :
>    _covered(heap),
> -  _shifter((1 + ShenandoahEvacLockGranularity) * LogHeapWordSize),
> +  _shifter(ShenandoahEvacLockGranularity),
>    _bm(_covered.word_size() >> _shifter, mtGC) {
>  }
> 
>    inline void acquire(oop obj);
>    inline void release(oop obj);
> diff -r aeb9d445884d src/hotspot/share/gc/shenandoah/shenandoah_globals.hpp
> --- a/src/hotspot/share/gc/shenandoah/shenandoah_globals.hpp    Tue Jun 23 18:07:20 2020 +0200
> +++ b/src/hotspot/share/gc/shenandoah/shenandoah_globals.hpp    Mon Jun 29 11:12:00 2020 +0200
> @@ -320,14 +320,16 @@
>                                                                              \
>    experimental(uintx, ShenandoahSATBBufferFlushInterval, 100,               \
>            "Forcefully flush non-empty SATB buffers at this interval. "      \
>            "Time is in milliseconds.")                                       \
>                                                                              \
> -  experimental(uintx, ShenandoahEvacLockGranularity, 0,                     \
> -          "How coarse to make evac-locking. Default 0 means "               \
> -          "per-HeapWord-locking, higher value make locking coarser "        \
> -          "in 2-exponent steps, e.g. one lock per 2^N heap words.")         \
> +  experimental(uintx, ShenandoahEvacLockGranularity, 3,                     \
> +          "Defines the coarseness of evac-locking bitmap. Measured in "     \
> +          "power-of-two steps. Zero means per-HeapWord-locking, default 3 " \
> +          "means one lock per 2^3 = 8 heap words. Larger values improve "   \
> +          "native footprint at expense of more potential contention during "\
> +          "evacuation.")                                                    \
>                                                                              \
>    diagnostic(bool, ShenandoahPreclean, true,                                \
>            "Do concurrent preclean phase before final mark: process "        \
>            "definitely alive references to avoid dealing with them during "  \
>            "pause.")                                                         \
> 
> Testing: hotspot_gc_shenandoah
> 


-- 
Thanks,
-Aleksey



More information about the shenandoah-dev mailing list