RFR: 8220465: Use shadow regions for faster ParallelGC full GCs

Stefan Johansson stefan.johansson at oracle.com
Fri Nov 15 09:21:50 UTC 2019


Hi Haoyu,

Thanks for the updates, here are new webrevs:
Full: http://cr.openjdk.java.net/~sjohanss/8220465/03/
Inc: http://cr.openjdk.java.net/~sjohanss/8220465/02-03/

I have asked more people to look at the change now, so you might await 
some more feedback.

Thanks,
Stefan

On 2019-11-12 16:11, Haoyu Li wrote:
> Hi Stefan,
> 
> Thanks for your advice!
> 
>     Nice, I think it would make sense to used cmpxchg in mark_normal() as
>     well and assert that the returned value is SHADOW.
> 
> I've changed mark_normal() to use Atomic::cmpxchg and added an 
> assertion. Please find the changes in the attached patchs. Thanks!
> Best Regards,
> Haoyu Li,
> 
> Stefan Johansson <stefan.johansson at oracle.com 
> <mailto:stefan.johansson at oracle.com>> 于2019年11月11日周一 下午11:10写道:
> 
>     Hi Haoyu,
> 
>     Thanks for the updated patches, I think they look good in general, just
>     one comment inline below.
> 
>     Here are some updated webrev:
>     Full: http://cr.openjdk.java.net/~sjohanss/8220465/02
>     Inc: http://cr.openjdk.java.net/~sjohanss/8220465/01-02
> 
>     On 2019-11-06 08:17, Haoyu Li wrote:
>      > Hi Stefan,
>      >
>      > Sorry for the late update. I have attached both a full patch
>      > (shadow-region-v3.patch) and the incremental changes
>      > (shadow-region-incr.patch) in this mail, and details are as follows.
>      >
>      >     Regarding the current patch, I think that it looks good in
>     general,
>      >     but I thought a bit more around how to share stuff between the
>      >     closures and I agree that adding those extra virtual functions
>      >     doesn’t really feel worth it. I’m wondering if a solution
>     where we
>      >     revert back to letting destination be the ”real destination” (not
>      >     ever pointing to the shadow region) and add a
>     copy_destination which
>      >     is destination + offset. To make this work the normal
>      >     MoveAndUpdateClosure would also have an offset, but it would
>     always
>      >     be 0. If do_addr() is then updated to use the
>     copy_destination() in
>      >     some places we might end up with something pretty nice, but maybe
>      >     I’m missing something.
>      >
>      >
>      > It is an excellent idea to let MoveAndUpdateClosure have an _offset
>      > equal to 0, so ShadowClosure can reuse more code from it. I have
>     made
>      > the above changes in the new patch.
>     Yes, using this approach looks very nice.
> 
>      >
>      >     I also realized that the current patch will trigger an assert
>      >     because destination is expected not to be the shadow address:
>      >     #  Internal Error
>      >     (open/src/hotspot/share/gc/parallel/psParallelCompact.cpp:3045),
>      >     pid=12649, tid=12728
>      >     #  assert(src_cp->destination() == destination) failed: first
>     live
>      >     obj in the space must match the destination
>      >
>      >     So this also suggests that we should keep destination() returning
>      >     the real destination.
>      >
>      >     Some other comments:
>      >     src/hotspot/share/gc/parallel/psParallelCompact.cpp
>      >     —
>      >     3383 void ShadowClosure::complete_region(ParCompactionManager
>     *cm,
>      >     HeapWord *dest_addr,
>      >     3384
>      >       PSParallelCompact::RegionData *region_ptr) {
>      >     3385   assert(region_ptr->shadow_state() ==
>      >     ParallelCompactData::RegionData::FINISH, "Region should be
>     finished”);
>      >
>      >     This assertion will also trigger when running with a debug
>     build and
>      >     at this point the shadow state should be SHADOW not FINISH.
>      >     —
>      >
>      >
>      > Sorry for these buggy assertions. The shadow_state in
>      > ShadowClosure::complete_region should be SHADOW instead of
>     FINISH, and
>      > I've corrected it. Moreover, while I was testing it in the debug
>     mode, I
>      > found another interesting case, in which a region should return
>     to the
>      > normal path if it becomes available before invoking
>     fill_shadow_region
>      > (the branch that shadow_region == 0 at psParallelCompact.cpp:3182).
>      > Therefore, I add a new function
>      > ParallelCompactData::RegionData::mark_normal() to handle this
>     special
>      > case, so the assertion in MoveAndUpdateClosure::complete_region will
>      > success.
>     Nice, I think it would make sense to used cmpxchg in mark_normal() as
>     well and assert that the returned value is SHADOW.
> 
>     Thanks,
>     Stefan
> 
>      >
>      >     src/hotspot/share/gc/parallel/psParallelCompact.hpp
>      >     —
>      >       632 inline bool
>     ParallelCompactData::RegionData::mark_filled() {
>      >       633   return Atomic::cmpxchg(FILLED, &_shadow_state, SHADOW) ==
>      >     SHADOW;
>      >       634 }
>      >
>      >     Since we never check the return value here we should make it void
>      >     and maybe instead add an assert that the return value is SHADOW.
>      >     —
>      >
>      >
>      > Thanks for the suggestion. I have changed mark_filled() to void.
>      >
>      > I really appreciate your reviews. If there are any issues in the
>     patch,
>      > please let me know at any time. Thanks again!
>      > Best Regards,
>      > Haoyu Li
>      >
>      > Stefan Johansson <stefan.johansson at oracle.com
>     <mailto:stefan.johansson at oracle.com>
>      > <mailto:stefan.johansson at oracle.com
>     <mailto:stefan.johansson at oracle.com>>> 于2019年10月29日周二 上午3:03
>     写道:
>      >
>      >     Hi Haoyu,
>      >
>      >     I’ve looked through the patch in detail now and created a new
>     webrev at:
>      > http://cr.openjdk.java.net/~sjohanss/8220465/01/
>      >
>      >     I took the liberty of removing the removal of move_and_update
>     from
>      >     your patch since I’m addressing that separately in
>     JDK-8233065. The
>      >     webrev above is still based on that removal, but I expect
>     that to be
>      >     pushed tomorrow or Wednesday so that should be fine.
>      >
>      >     I also changed the subject to make it more clear that this is
>     now a
>      >     review of:
>      > https://bugs.openjdk.java.net/browse/JDK-8220465
>      >
>      >     Regarding the current patch, I think that it looks good in
>     general,
>      >     but I thought a bit more around how to share stuff between the
>      >     closures and I agree that adding those extra virtual functions
>      >     doesn’t really feel worth it. I’m wondering if a solution
>     where we
>      >     revert back to letting destination be the ”real destination” (not
>      >     ever pointing to the shadow region) and add a
>     copy_destination which
>      >     is destination + offset. To make this work the normal
>      >     MoveAndUpdateClosure would also have an offset, but it would
>     always
>      >     be 0. If do_addr() is then updated to use the
>     copy_destination() in
>      >     some places we might end up with something pretty nice, but maybe
>      >     I’m missing something.
>      >
>      >     I also realized that the current patch will trigger an assert
>      >     because destination is expected not to be the shadow address:
>      >     #  Internal Error
>      >     (open/src/hotspot/share/gc/parallel/psParallelCompact.cpp:3045),
>      >     pid=12649, tid=12728
>      >     #  assert(src_cp->destination() == destination) failed: first
>     live
>      >     obj in the space must match the destination
>      >
>      >     So this also suggests that we should keep destination() returning
>      >     the real destination.
>      >
>      >     Some other comments:
>      >     src/hotspot/share/gc/parallel/psParallelCompact.cpp
>      >     —
>      >     3383 void ShadowClosure::complete_region(ParCompactionManager
>     *cm,
>      >     HeapWord *dest_addr,
>      >     3384
>      >       PSParallelCompact::RegionData *region_ptr) {
>      >     3385   assert(region_ptr->shadow_state() ==
>      >     ParallelCompactData::RegionData::FINISH, "Region should be
>     finished”);
>      >
>      >     This assertion will also trigger when running with a debug
>     build and
>      >     at this point the shadow state should be SHADOW not FINISH.
>      >     —
>      >
>      >     src/hotspot/share/gc/parallel/psParallelCompact.hpp
>      >     —
>      >       632 inline bool
>     ParallelCompactData::RegionData::mark_filled() {
>      >       633   return Atomic::cmpxchg(FILLED, &_shadow_state, SHADOW) ==
>      >     SHADOW;
>      >       634 }
>      >
>      >     Since we never check the return value here we should make it void
>      >     and maybe instead add an assert that the return value is SHADOW.
>      >     —
>      >
>      >     When you addressed these comments, would it be possible to
>     include
>      >     both the full patch and and the incremental changes from the
>     current
>      >     version. That makes it easier for the reviewers to see what
>     changed
>      >     between version of the patch.
>      >
>      >     Thanks,
>      >     Stefan
>      >
>      >      > 24 okt. 2019 kl. 14:16 skrev Stefan Johansson
>      >     <stefan.johansson at oracle.com
>     <mailto:stefan.johansson at oracle.com>
>     <mailto:stefan.johansson at oracle.com
>     <mailto:stefan.johansson at oracle.com>>>:
>      >      >
>      >      > Hi Haoyu,
>      >      >
>      >      > On 2019-10-23 17:15, Haoyu Li wrote:
>      >      >> Hi Stefan,
>      >      >> Thanks for your constructive feedback. I've addressed all the
>      >     issues you mentioned, and the updated patch is attached in
>     this email.
>      >      > Nice, I will look at the patch next week, but I'll shortly
>     answer
>      >     your questions right away.
>      >      >
>      >      >> During refining the patch, I have a couple of questions:
>      >      >> 1) Now the MoveAndUpdateClosure and ShadowClosure assume the
>      >     destination address is the very beginning of a region,
>     instead of an
>      >     arbitrary address like what it used to be. However, there is an
>      >     unused function named PSParallelCompact::move_and_update()
>     uses the
>      >     MoveAndUpdateClosure to process a region from its middle, which
>      >     conflicts with the assumption. I notice that you removed this
>      >     function in your patch, and so did I in the updated patch.
>     Does it
>      >     matter?
>      >      > Yes, I found this function during my code review and it
>     should be
>      >     removed, but I think that should be handled as a separate
>     issue. We
>      >     can do this removal before this patch goes in.
>      >      >
>      >      >> 2) Using the same do_addr() in MoveAndUpdateClosure and
>      >     ShadowClosure is doable, but it does not reuse all the code
>     neatly.
>      >     Because storing the address of the shadow region in _destination
>      >     requires extra virtual functions to handle allocating blocks
>     in the
>      >     start_array and setting addresses of deferred objects. In
>      >     particular, allocate_blocks() and set_deferred_object_for()
>     in both
>      >     closures are added. Is it worth avoiding to use _offset to
>     calculate
>      >     the shadow_destination?
>      >      > Ok, sounds like it might be better to have specific do_addr()
>      >     functions then. I'll think some more around this when
>     reviewing the
>      >     new patch in depth.
>      >      >
>      >      >> If there are any problems with this patch, please contact me
>      >     anytime. I'm more than happy to keep improving the code. Thanks
>      >     again for reviewing.
>      >      >>
>      >      > Sound good, thanks,
>      >      > Stefan
>      >
> 



More information about the hotspot-gc-dev mailing list