RFR: 8232588: G1 concurrent System.gc can return early or late

Thomas Schatzl thomas.schatzl at oracle.com
Wed Nov 6 15:24:54 UTC 2019


On 31.10.19 21:53, Kim Barrett wrote:
> RFR: 8232588: G1 concurrent System.gc can return early or late
> RFR: 8233279: G1: GCLocker GC with +GCLockerInvokesConcurrent spins while cycle in progress
> Please review this refactoring and fixing of the state machine used by
> G1CollectedHeap::collect for handling requests for concurrent collections.
> The handling of concurrent collection requests is now split out into a
> helper function for that purpose.  All of the state machine logic for
> checking for completion, waiting for completions, and performing retries is
> now in that new helper function, rather than being distributed between
> try_collect() and various parts of the VMOp.


> A change is that waiting by a user-requested GC for a concurrent marking
> cycle to complete used to be performed with the thread transitioned to
> native and without safepoint checks on the associated monitor lock and wait.
> This was noted as having been cribbed from CMS.  Coleen and I looked at this
> and could not come up with a reason for doing that for G1 (anymore, after
> the recent spate of locking improvements), so there's a new G1-specific
> monitor being used and the locking and waiting is now "normal".  (This makes
> the FullGCCount_lock monitor largely CMS-specific.)

I do not see a reason for the extra monitor (why it is better to have a 
separate monitor instead of reusing the existing one with almost the 
same name?), it does not seem to add information. It is still used in 
GenCollectedHeap/Serial, so can't be removed with CMS.

> For other concurrent GC requests, the only intentional change is for
> _gc_locker with GCLockerInvokesConcurrent.  Previously it would spin in
> try_collect while there was a concurrent marking cycle in progress, also
> blocking any callers of GCLocker::stall_until_clear() (JDK-8233279).  Now it
> returns in that situation, though it's not clear that's a great idea either.
> Indeed, even when that option was introduced (for CMS, as part of fixing a
> bad interaction between GCLocker GCs and +ExplicitGCInvokesConcurrent) it
> was not clear it was a good idea (see JDK-6919638).  Fortunately it's off by
> default. JDK-8233280 has been filed to remove this option.
> CR:
> https://bugs.openjdk.java.net/browse/JDK-8233279
> https://bugs.openjdk.java.net/browse/JDK-8232588
> Webrev:
> https://cr.openjdk.java.net/~kbarrett/8232588/open.00/
> Testing:
> mach5 tier1-6
> Local (linux-x64) testing with a program that allocates some live data in
> the old gen, then has several threads all repeatedly looping on System.gc().
> Looked at output from new logging in try_collect_concurrently and verified
> the interleavings of GC start/end and new log messages were as expected.

- Not sure, but maybe this logging should be moved to trace level? In 
either case I would suggest to improve it to cover the try_collect call 
too, i.e. with appropriate "attempt"/"complete"/"discard" messages.

Otherwise the logging looks a bit incomplete to me, i.e. only attempts 
to initiate a concurrent collection cauuse messages. I understand that 
this might generate too many messages for gc+debug, that is the reason 
to potentially move to gc+trace.

- feel free to ignore: in such log messages, if I add thread id for 
debugging purposes I tend to put the thread id value first so that if 
you have a log in front of you, and ask your viewer to highlight a 
particular id, all highlights are in the same column.


.... stuff from unified logging] <thread-id> Message

instead of having the thread-id somewhere located in the message like in
this case where it is somewhere in the middle.

(I kind of also prefer the raw Thread::current() value instead of the 
pretty name, fwiw)

I do not feel strongly about this at all, just something that came to my 

- a comment why we need a separate gc_counter_less_than method instead 
of a < comparison would be nice (I know, because of roll-over of these 

- pre-existing:

g1VMOperations.cpp:124-127: maybe this could be changed to

} else if (g1h->should_upgrade....) {

Also please fix the indentation of the parameter list in the call to 
do_full_collection() in line 133.

Looks good otherwise.


More information about the hotspot-gc-dev mailing list