CRR (S): 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
Tony Printezis
tony.printezis at oracle.com
Wed Feb 8 14:47:18 UTC 2012
Bengt,
Inline.
On 02/08/2012 06:50 AM, Bengt Rutisson wrote:
>
>> I wrote a test that exposes the issue (when
>> +ExplicitGCInvokesConcurrent is used) and I attached it to the CR (it
>> initiates marking cycles constantly, I just compare the number of
>> System.gc()'s to the number of actual marking cycles in the log). I
>> did the first implementation based on the first version of your "hum
>> alloc can start a conc cycle" fix and I had to update it based on the
>> changes you pushed afterwards. I just reran the test to make sure
>> all's still well, and it is:
>>
>> vanilla: tried to initiate 2610 cycles, 2595 cycles actually initiated
>>
>> with fix: tried to initiate 2613 cycles, 2613 cycles actually initiated
>
> Excellent! Thanks. Sorry for not checking the CR properly before asking.
Np (I should have mentioned the test in the code review request). I
couldn't come up with a straightforward way to also test the fix when
cycles are initiated by humongous allocations. But, given that that code
path also calls collect() I think exercising the code with
+ExplicitGCInvokesConcurrent should be enough.
>> FWIW, I like the version with the method even if it's just for the
>> extra comments which might be helpful to whoever reads the code in
>> the future.
>
> Well, we don't really need the switch to have comments, do we? Also, I
> would prefer to have the comments in should_do_concurrent_full_gc().
> That's where I would look for the information that the comments provide.
>
> Infact, that method already has a comment in the hpp file:
>
> // It decides whether an explicit GC should start a concurrent cycle
> // instead of doing a STW GC. Currently, a concurrent cycle is
> // explicitly started if:
> // (a) cause == _gc_locker and +GCLockerInvokesConcurrent, or
> // (b) cause == _java_lang_system_gc and +ExplicitGCInvokesConcurrent.
> // (c) cause == _g1_humongous_allocation
> bool should_do_concurrent_full_gc(GCCause::Cause cause);
>
> Mabye just make this comment more detailed?
Do you like this version better?
http://cr.openjdk.java.net/~tonyp/7129892/webrev.3/
I also noticed that we were calling
SharedHeap::heap()->total_collections() from a few places in
G1CollectedHeap and we can call total_collections() directly given that
G1CH extends SharedHeap. I simplified those.
Tony
>>> Finally a coding standard question regarding switch statements. The
>>> hotspot code in general is not consistent in this case, and neither
>>> is the GC code or even the G1 code. But should the "case" statements
>>> be indented one level under the "switch" statement? To me that makes
>>> sense since the switch statement starts a new code block. I assume
>>> you have a different opinion since you wrote it differently, but
>>> what is the rational behind it?
>>>
>>> To exemplify. This:
>>>
>>> switch (cause) {
>>> case GCCause::_gc_locker: return
>>> GCLockerInvokesConcurrent;
>>> case GCCause::_java_lang_system_gc: return
>>> ExplicitGCInvokesConcurrent;
>>> case GCCause::_g1_humongous_allocation: return true;
>>> default: return false;
>>> }
>>>
>>> would be easier for me to read if it was:
>>>
>>> switch (cause) {
>>> case GCCause::_gc_locker: return
>>> GCLockerInvokesConcurrent;
>>> case GCCause::_java_lang_system_gc: return
>>> ExplicitGCInvokesConcurrent;
>>> case GCCause::_g1_humongous_allocation: return true;
>>> default: return false;
>>> }
>>
>> I'm OK either way and I do think the latter is a bit nicer. But by
>> default emacs does not indent so I went with it. I'll add the
>> indentation.
>
> Great! :-)
>
> Bengt
>
>>> Anyway, just ,minor stuff. So, in general: ship it!
>>
>> Thanks!
>>
>> Tony
>>
>>> Bengt
>>>
>>> On 2012-01-26 20:52, Tony Printezis wrote:
>>>> Hi all,
>>>>
>>>> Can I please have a couple of code reviews for the following change?
>>>>
>>>> http://cr.openjdk.java.net/~tonyp/7129892/webrev.1/
>>>>
>>>> The issue is that a GC attempt that's supposed to explicitly start
>>>> a concurrent marking cycle might be unsuccessful (as another GC
>>>> might get scheduled first) which will prevent the cycle from
>>>> starting. The idea is to retry such unsuccessful attempts.
>>>>
>>>> I also changed should_do_concurrent_full_gc() from an if-statement
>>>> to a switch statement. I discussed it with Bengt (the last person
>>>> to modify that method) and we both think that the switch statement
>>>> is more readable.
>>>>
>>>> BTW, I did a couple of iterations of this fix to address the
>>>> slightly different approach Bengt took in the cycle initiation
>>>> after hum allocation code (i.e., start the cycle before the
>>>> allocation, not after). In the end the current version of
>>>> retry_unsuccessful_concurrent_full_gc(), a new method I added,
>>>> always returns true for all causes. I'm inclined to leave the
>>>> switch in, even just for the comments per cause. I could be
>>>> persuaded to replace it with return true; statement though.
>>>>
>>>> Tony
>>>>
>>>
>
More information about the hotspot-gc-dev
mailing list