RFR (M): 8077144: Concurrent mark initialization takes too long

Kim Barrett kim.barrett at oracle.com
Sat Mar 26 17:06:23 UTC 2016

> On Mar 25, 2016, at 9:38 PM, Kim Barrett <kim.barrett at oracle.com> wrote:
>> On Mar 15, 2016, at 6:12 PM, Thomas Schatzl <thomas.schatzl at oracle.com> wrote:
>> Hi Mikael,
>> updated webrev at
>> http://cr.openjdk.java.net/~tschatzl/8077144/webrev.3/ (full)
>> http://cr.openjdk.java.net/~tschatzl/8077144/webrev.2_to_3/ (diff)
>> which implements the suggested changes.
> ------------------------------------------------------------------------------
> src/share/vm/gc/g1/g1ConcurrentMark.cpp
> 1130 class G1LiveDataHelper VALUE_OBJ_CLASS_SPEC {
> ...
> 1142   inline void set_card_bitmap_range(BitMap* bm,
> This uses non-parallel set_bit and set_range. Parallel callers are
> operating on distinct heap regions. If that isn't guaranteed, then two
> parallel tasks could try to modify bits in the same BitMap word
> simultaneously. We're OK so long as G1HeapRegionSize is a multiple of
>  BitsPerWord * (1 << CardTableModRefBs::card_shift)
> (which is 2^15 with 512 byte cards on a 64bit machine), but
> G1HeapRegionSize is a product option with a relatively unconstrained
> value (only bounded between 1M and 32M, no alignment constraint).
> Oh, but, it looks like HeapRegion::setup_heap_region_size ensures the
> region size is a power of 2 within the min/max bounds, rounding up an
> arbitrary command line value if necessary.
> So we're OK, though it required some searching to convince myself of
> that.  An assertion somewhere in G1LiveDataHelper might be
> appropriate, since it doesn't ever use par_xxx bitmap functions,
> unlike the old code, which selected between them based on an argument
> that no longer exists.

Well, we’re OK size-wise.  I’m pretty sure we’re OK alignment-wise too, but
I’ve not yet (re)found the code that would convince me of that.  Checking that
would be part of the requested assertion.

More information about the hotspot-gc-dev mailing list