Request for review (S): 7163848: G1: Log GC Cause for a GC
Bengt Rutisson
bengt.rutisson at oracle.com
Thu Apr 26 08:51:33 UTC 2012
Hi John, Jesper and Jon,
Thanks for the reviews!
Since JPRT will be down from tomorrow I would like to push this today.
So, I'll go ahead and push this now.
Thanks again for looking at this,
Bengt
On 2012-04-25 13:07, Bengt Rutisson wrote:
>
> Hi John,
>
> Thanks for looking at this!
>
> Good catch about record_collection_pause_start(). I've updated this
> and I also re-instated the assert that I had removed.
>
> Here's an updated webrev based on your comments:
> http://cr.openjdk.java.net/~brutisso/7163848/webrev.01/
>
> Now the log messages look like this:
>
> [Full GC (System.gc()) 394K->299K(100M), 0.0618841 secs]
> [GC pause (G1 Evacuation Pause) (young) 20M->325K(100M), 0.0213615 secs]
> [GC pause (G1 Humongous Allocation) (young) (initial-mark)
> 32M->32M(100M), 0.0038521 secs]
>
> With log level finer and finest the second entry above will look like
> this:
>
> [GC pause (G1 Evacuation Pause) (young), 0.00431665 secs]
>
> The size information is printed on separate lines as part of the GC
> details.
>
> Thanks again for the review!
> Bengt
>
> On 2012-04-24 19:03, John Cuthbertson wrote:
>> Hi Bengt,
>>
>> Apologies. A bad cut'n paste of the code. It should have been:
>>
>> void G1CollectorPolicy::record_collection_pause_start(double
>> start_time_sec,
>> size_t start_used) {
>> if (G1Log::finer()) {
>> gclog_or_tty->stamp(PrintGCTimeStamps);
>> gclog_or_tty->print("[GC pause (%s)", gcs_are_young() ? "young" :
>> "mixed");
>> gclog_or_tty->print(" (%s)", GCCause::to_string(_g1->gc_cause()));
>> }
>>
>> The other thing I was thinking - based upon your output:
>>
>> [GC pause (young) (G1 Evacuation Pause) 149M->118M(244M), 0.2433432
>> secs]
>> [GC pause (young) (initial-mark) (G1 Evacuation Pause)
>> 160M->128M(247M), 0.1768634 secs]
>> [GC pause (young) (initial-mark) (G1 Humongous Allocation)
>> 32M->32M(100M), 0.0104583 secs]
>> [GC pause (mixed) (G1 Evacuation Pause) 128M->82M(256M), 0.5632070 secs]
>> [Full GC (System.gc()) 417K->321K(100M), 0.0324733 secs]
>> [Full GC (Permanent Generation Full) 285K->285K(7168K), 0.0270867 secs]
>> [Full GC (Last ditch collection) 285K->275K(7168K), 0.0268307 secs]
>> [Full GC (No GC)[GC concurrent-root-region-scan-end, 0.0007064]
>>
>> is that you may want to move the "initial-mark" to after the GC cause
>> (because it doesn't come out every pause) and potentially even before
>> the young./mixed. That way the cause is always the 3rd field. If not
>> then you should print the cause in
>> G1CollectorPolicy::record_collection_pause_end() before
>> "(initial-mark)" is printed. Or move the "initial-mark" message into
>> record_collection_pause_start().
>>
>> Anyway the main point is that with this change as it stands - there
>> will be different line output between "fine" and "finer" - and we
>> should try to avoid that.
>>
>> JohnC
>>
>> On 04/24/12 09:35, John Cuthbertson wrote:
>>> Hi Bengt,
>>>
>>> These are very similar to the changes I gave to Stanley Guan to
>>> identify the reason for 7143858.
>>>
>>> In G1CollectedHeap::do_collection(), you've removed the assert:
>>>
>>> assert(!system_gc || explicit_gc, "invariant");
>>>
>>> was this intentional?
>>>
>>> Also don't you also want the same change in
>>> G1CollectorPolicy::record_collection_pause_start():
>>>
>>> void G1CollectorPolicy::record_collection_pause_start(double
>>> start_time_sec,
>>> size_t
>>> start_used) {
>>> if (G1Log::finer()) {
>>> gclog_or_tty->stamp(PrintGCTimeStamps);
>>> gclog_or_tty->print(" (%s)", gcs_are_young() ? "young" : "mixed");
>>> gclog_or_tty->print("[GC pause (%s)",
>>> GCCause::to_string(_g1->gc_cause()));
>>> }
>>>
>>> Other than that - it looks good.
>>>
>>> JohnC
>>>
>>> On 04/24/12 05:12, Bengt Rutisson wrote:
>>>>
>>>> Hi everyone,
>>>>
>>>> Could I have a couple of reviews for this change?
>>>> http://cr.openjdk.java.net/~brutisso/7163848/webrev.00/
>>>>
>>>> Background
>>>>
>>>> Many times it is useful to know why a GC happened. The GC cause
>>>> tells us that, but it has not been exposed in the log file before.
>>>> The change adds that information to the log entries for PrintGC.
>>>>
>>>> Here are some examples of what the logging looks like with this
>>>> change:
>>>>
>>>> [GC pause (young) (G1 Evacuation Pause) 149M->118M(244M), 0.2433432
>>>> secs]
>>>> [GC pause (young) (initial-mark) (G1 Evacuation Pause)
>>>> 160M->128M(247M), 0.1768634 secs]
>>>> [GC pause (young) (initial-mark) (G1 Humongous Allocation)
>>>> 32M->32M(100M), 0.0104583 secs]
>>>> [GC pause (mixed) (G1 Evacuation Pause) 128M->82M(256M), 0.5632070
>>>> secs]
>>>> [Full GC (System.gc()) 417K->321K(100M), 0.0324733 secs]
>>>> [Full GC (Permanent Generation Full) 285K->285K(7168K), 0.0270867
>>>> secs]
>>>> [Full GC (Last ditch collection) 285K->275K(7168K), 0.0268307 secs]
>>>> [Full GC (No GC)[GC concurrent-root-region-scan-end, 0.0007064]
>>>>
>>>> We might want to re-phrase the GC cause names, but that should
>>>> probably be a separate CR since it will affect jstat and others
>>>> that use the GCCause::to_string() method.
>>>>
>>>> Thanks,
>>>> Bengt
>>>
>>
>
More information about the hotspot-gc-dev
mailing list