RFR (M): 8224741: Optimize the scan area during the Scan Heap Roots phase

Thomas Schatzl thomas.schatzl at oracle.com
Tue Jul 2 10:40:14 UTC 2019


Hi Kim,

  thanks for your review.

On Mon, 2019-07-01 at 18:31 -0400, Kim Barrett wrote:
> > On May 24, 2019, at 11:31 AM, Thomas Schatzl <
> > thomas.schatzl at oracle.com> wrote:
> > 
> > Hi all,
> > 
> >  can I have reviews for this small change based on JDK-8213108 (out
> > for review right now) that optimizes the scanning of blocks within
> > a chunk (see comment of g1RemSet.cpp introduced in JDK-8213108) a
> > bit?
> > 
> > […]
> > The only reason this is a separate CR is because I thought that the
> > change in JDK-8213108 is large enough already as is, and easier to
> > understand without.
> 
> Thank you for that :)
> 
> > CR:
> > https://bugs.openjdk.java.net/browse/JDK-8224741
> > Webrev:
> > http://cr.openjdk.java.net/~tschatzl/8224741/webrev/
> > Testing:
> > hs-tier1-5, local jtreg gc and gc/g1 testing, perf testing
> > 
> > Thanks,
> >  Thomas
> 
> -------------------------------------------------------------------
> -----------
> src/hotspot/share/gc/g1/heapRegion.hpp
>  296   // Returns the address after the last actually scanned.
> 
> This doesn't mention the possible NULL result when the iteration
> couldn't be done (only in the concurrent case).  Of course, the
> previous comment didn't describe the return value at all.

Fixed.

> 
> -------------------------------------------------------------------
> -----------
> src/hotspot/share/gc/g1/g1RemSet.cpp
>  923     assert(scanned_to >= mr.end(), "Scanned to " PTR_FORMAT "
> less than range " PTR_FORMAT, p2i(scanned_to), p2i(mr.end()));
> 
> I think this assertion isn't correct.
> 
> Suppose we have a humongous non-objarray object that fits in a single
> region.  And suppose the range of dirty cards covers the entire
> object, and beyond (because the object's size is not a multiple of
> card size).  The start of the scanned region includes (is) the start
> of the object, and the end of the scan region is beyond the end of
> the
> object.  The scan of the region will hit the clause in
> do_oops_on_card_in_humongous that (with this change) returns obj end,
> which is less than mr.end(), tripping the assertion.
> 
> But see next comment.
> 
> -------------------------------------------------------------------
> -----------
> src/hotspot/share/gc/g1/g1RemSet.cpp
>  296       return (HeapWord*)obj + size;
> 
> Maybe return the greator of end of object and end of region?
> Similarly to the dead case, there can't be other objects in this
> region, and we've scanned the entire object.
> 
> Doing so would also address the assert issue above.

Fixed it the suggested way.

> 
> -------------------------------------------------------------------
> -----------
> src/hotspot/share/gc/g1/g1RemSet.cpp 
>  260 HeapWord* HeapRegion::do_oops_on_card_in_humongous(MemRegion mr,
> ...
>  281   if (!g1h->is_obj_dead(obj, sr)) {
> ...
>  298   }
>  299   // The object is dead. There can be no other object in this
> region, so return
>  300   // the end of that region.
>  301   return end();
> 
> The structure here has become somewhat confusing with the return
> value change.  It used to be that we always returned true at the end,
> once we reached the is-dead check.  But now we return different
> values in every clause.  I think it would be easier to read if the
> control structure were flattened out to something like
> 
>   if (g1h->is_obj_dead(obj, sr)) {
>     ...
>     return ...;
>   } else if (obj->is_objArray() || (sr->bottom() < mr.start())) {
>     ...
>     return ...;
>   } else {
>     ...
>     return ...;
>   }

Done.

> 
> -------------------------------------------------------------------
> -----------
> src/hotspot/share/gc/g1/g1RemSet.cpp 
>  349     bool is_imprecise = false;
> 
> I think the variable name is backward, and should be is_precise.

:(

> 
> -------------------------------------------------------------------
> -----------
> src/hotspot/share/gc/g1/g1RemSet.cpp 
>  367       return is_imprecise ? mr.end() : cur;
> 
> s/mr.end()/end/
> 
> -------------------------------------------------------------------
> -----------
> src/hotspot/share/gc/g1/heapRegion.hpp
>  648   // Iterate over the objects overlapping part of a card,
> applying cl
> 
> [pre-existing]
> 
> Before JDK-8213108, oops_on_card_seq_iterate_careful and its helpers
> were applied to a MemRegion that covered no more than a single card.
> 8213108 changed that, now possibly applying the iteration to a
> MemRegion intersecting multiple cards.  But comments for the iterate
> functions haven't been updated.
> 

Fixed.

Updated webrevs:
http://cr.openjdk.java.net/~tschatzl/8224741/webrev.0_to_1 (diff)
http://cr.openjdk.java.net/~tschatzl/8224741/webrev.1 (full)


testing:
hs-tier1-3 almost done without issues

Thanks,
  Thomas




More information about the hotspot-gc-dev mailing list