CMS parallel initial mark
Thomas Schatzl
thomas.schatzl at oracle.com
Mon Jun 10 19:45:38 UTC 2013
Hi,
On Fri, 2013-06-07 at 11:17 -0700, Jon Masamitsu wrote:
> On 6/7/2013 4:23 AM, Thomas Schatzl wrote:
> > Hi all,
> >
> > some notes about the second patch, the modified eden boundary
> > sampling; in general I think the idea is good (Jon suggested that it
> > should become default), but imho there are some issues with the
> > implementation.
> >
> > On Tue, 2013-05-28 at 17:24 -0700, Hiroshi Yamauchi wrote:
> >> Hi,
> >>
> >> Here's a suggested patch in a separate patch:
> >>
> >> http://cr.openjdk.java.net/~hiroshi/webrevs/edenchunks/webrev.00/
> >>
> >> that attempts to improve on this issue by implementing an alternative
> >> way of dividing up the eden into chunks for an increased parallelism
> >> (or better load balancing between the GC threads) for the young gen
> >> scan portion of the remark phase (and the now-parallelized initial
> >> mark phase.) It uses a CAS-based mechanism that samples the object
> >> boundaries in the eden space on the slow allocation code paths (eg. at
> >> the TLAB refill and large object allocation times) at all times.
> > - this patch is for DefNew/CMS only it seems. Is this correct?
> >
> > - in the Hotspot code base explicit != NULL checks are done for whatever
> > reason. To keep the same style it would be nice to update the checks
> > whether to do the sampling ("if (CMSEdenChunksRecordAlways &&
> > _next_gen)") accordingly.
> >
> > (the next point is not an issue of the patch)
> > - the check whether there is a _next_gen is odd - I do not think that
> > DefNew works as a generation without an older generation, but I'm not
> > sure.
> You're correct that DefNew needs to have a _next_gen.
>
> > Looking at other similar code checking for _next_gen != NULL, the
> > response is typically to update _next_gen and then asserting that
> > _next_gen is != NULL. E.g.
> >
> > if (_next_gen == NULL) {
> > GenCollectedHeap* gch = GenCollectedHeap::heap();
> > _next_gen = gch->next_gen(this);
> > assert(_next_gen != NULL,
> > "This must be the youngest gen, and not the only gen");
> > }
> >
> > Jon?
>
> Yes, except in a very few situations, _next_gen should be set.
> Exceptions I would expect is during initialization. At the point
> Thomas indicates and assertion would be sufficient.
>
> assert(_next_gen != NULL, "...");
Thanks.
>
>
> >
> > - I think CMSCollector::_eden_chunk_sampling_active should be volatile
> > to avoid any clever compilers skipping the read in sample_eden_chunk().
> > (Although I don't think it's possible here). See also below for avoiding
> > that variable completely.
>
> Could you explain you thinking for making it volatile. As you have, I
> didn't think
> it was necessary and thought ,"If not necessary, don't do it".
It's not necessary I think, just as a reminder to the compiler to not
optimize that load away. I think the Atomic instruction contain the
necessary instructions though.
> > (btw, throughout this code there is a lot of checking whether some
> > NEW_C_HEAP_ARRAY returned NULL or not, and does elaborate recovery -
> > however by default NEW_C_HEAP_ARRAY fails with an OOM anyway... - but
> > that is certainly out of scope)
>
> Thomas, could you file a CR for fixing that? Thanks.
CR 8016276: CMS concurrentMarkSweepGeneration contains lots of
unnecessary allocation failure handling
> > Same for checking whether _survivor_chunk_array is NULL - at the moment
> > sometimes _survivor_chunk_array is checked against NULL to avoid
> > entering code (in print_eden_and_survivor_chunk_arrays()).
> >
> > The condition that could be used is the one that triggers allocation of
> > _survivor_chunk_array: (CMSParallelRemarkEnabled &&
> > CMSParallelSurvivorRemarkEnabled) in
> > concurrentMarkSweepGeneration.cpp:728.
>
> Personally, I like a check like if (_eden_chunk_array != NULL)
> better. I think it is more future proof. For whatever reason we don't
> try to dereference _eden_chunk_array if it is NULL. An assertion
> checking that
>
> (CMSParallelRemarkEnabled &&
> CMSParallelSurvivorRemarkEnabled)
>
> is true would we be appropriate.
Also good.
Thomas
More information about the hotspot-gc-dev
mailing list