RFR (M/L): 8247928: Refactor G1ConcurrentMarkThread for mark abort (JDK-8240556)

Thomas Schatzl thomas.schatzl at oracle.com
Thu Jun 25 08:56:12 UTC 2020


Hi all,

   can I have reviews for this change that refactors the 
G1ConcurrentMarkThread class to prepare it better for mark abort 
(JDK-8240556).

So the idea in the latter is to abort the concurrent cycle if after 
concurrent start gc we find that old gen occupancy actually went down 
below the IHOP again due to e.g. eager reclaim. To do that, G1 needs to 
scrub any marks on the next bitmap during the gc pause.
The current, original change just performs this work in the pause, which 
is very slow, so the idea is to do the bitmap cleaning concurrently 
instead. The problem is that G1ConcurrentMarkThread is a mess and you 
can't easily "jump" to the end of the current marking.

Additionally, the code was worth refactoring without that requirement 
anyway ;)

This change refactors the code so that it is much easier to do add a 
second path through the concurrent cycle.

Overall, there are two options to do that:
1) provide an explicit state machine for the concurrent marking so that 
you can jump to the end easily.
2) provide building blocks that can be easily put together to implement 
the second path.

While 1) works (there is a sample POC at 
http://cr.openjdk.java.net/~tschatzl/8247928/webrev.sm/), I found that 
it is much more code and less understandable than just building two 
paths through the marking cycle as in the "abort marking" case we only 
need to do the very tail end of the regular full marking cycle, so I 
propose this option for review.

This is refactoring (almost) only, the additional path should be added 
with JDK-8240556. Almost because I changed two things:
- the concurrent mark (control) thread does not do any marking any more 
for a long time (long long ago it did root scanning/marking), so I 
removed the _vtime_mark_accum accumulator.
- the "Concurrent Mark" finish message is now only printed at the end of 
all marking, not every iteration. First, the restart case is very rare 
so probably anyone parsing it will not handle this case correctly, and 
the contents (times) of that finish message are confusing, which means 
most likely anyone handling it will likely do the wrong thing.
The "Concurrent Mark Restart for Mark Overflow" remains to indicate a 
restart.

Based on JDK-8248221 also out for review.

CR:
https://bugs.openjdk.java.net/browse/JDK-8247928
Webrev:
http://cr.openjdk.java.net/~tschatzl/8247928/webrev/
Testing:
tier1-5, a few local jtreg runs of the gc directory

Thanks,
   Thomas



More information about the hotspot-gc-dev mailing list