RFR: JDK-8068589: GCCause should distinguish jcmd GC.run from System.gc()
Frederic Parain
frederic.parain at oracle.com
Tue Jan 27 10:10:18 UTC 2015
On 01/26/2015 09:28 AM, Kirk Pepperdine wrote:
> Hi Yasumasa,
>
> Thank you for your review of the code. Indeed you have filed this as a
> bug and it has been commented on as an enhancement, not a bug. As I have
> mentioned a single call to System.gc() makes no difference in any
> analytic that I performed on any application that I’ve encountered in
> the wild no matter what the cause. Other issues: it’s not currently
> clear to me that jcmd is the only entry point to this call and that
> would make the message misleading for those other paths. There are other
> entry points that can results in a full GC but they will remain labeled
> as is.
Correct. It is possible to externally trigger a full GC using the
PlatformMBean server, and invoking the
java.lang.management.MemoryMXBean.gc() operation.
In this case, the gcCause is also "System.gc()".
Fred
> I also see a downstream impact on tooling. Thus I don’t see a
> compelling argument for the value of this change thus I will argue
> towards not destabilizing downstream tooling.
>
> That said, I’ve said my piece and have added enough spam to the list on
> this subject.
>
> Kind regards,
> Kirk Pepperdine
>
>
> On Jan 26, 2015, at 4:53 AM, Yasumasa Suenaga <yasuenag at gmail.com
> <mailto:yasuenag at gmail.com>> wrote:
>
>> Hi Kirk,
>>
>> I want to distinguish GC whether it is requested from internal (e.g.
>> System.gc()) or not.
>> System.gc() is called in RMI as you said.
>>
>> In JVM implementation, entry point of GC is
>> Universe::heap()->collect() family. It is used by JVMTI force GC, heap
>> inspection (e.g. jmap), etc. Thus I guess that GCCause which is
>> invoked from JVM should set valid GCCause which is not System.gc().
>> So I file this enhancement to JBS and create a patch.
>>
>> Thanks,
>>
>> Yasumasa
>>
>> 2015/01/26 6:14 "Kirk Pepperdine" <kirk at kodewerk.com
>> <mailto:kirk at kodewerk.com>>:
>>
>> Hi Yasumasa,
>>
>>
>> >
>> > I think the System.gc() call which is invoked by jcmd is special
>> case and I want to
>> > distinguish it.
>> > Programmer can call System.gc() from their code. But GC which is
>> invoked by jcmd is NOT explicitly call by programmer.
>>
>> System.gc() called for by RMI is also not explicitly called by the
>> programmer either. There are also other tools that will result in
>> calls to System.gc() also. Should we catalog them in GCCause also?
>>
>> >
>> > Indeed, SystemGCDCmd will call System.gc() (same meaning).
>> > However, I think it has different meaning from System.gc() call
>> from source code.
>>
>> I’m not sure I understand the point. From an analytical POV, a
>> single call to System.gc() is pretty much meaningless. If it’s
>> regular or there is a pattern in the frequency of the calls then
>> I’m interested. A call to System.gc() has the same effect no
>> matter who or why is responsible.
>>
>> My interest lies in keeping the GC logs as simple as possible. If
>> there is meaningful data to add so be it. That said, I’m not sure
>> that this change meets that bar.
>>
>> That said, I’m still concerned that the caller/callee division
>> seems inside out. But it’s Sunday so…
>>
>> Kind regards,
>> Kirk Pepperdine
>>
>> >
>> >
>> > Thanks,
>> >
>> > Yasumasa
>> >
>> >
>> > On 2015/01/25 22:56, Kirk Pepperdine wrote:
>> >> Hi,
>> >>
>> >> IMHO, if a System.gc() is being called then the cause should be
>> System.gc(). If we start down the road of differentiating between
>> the various causes of calls to System.gc() this will turn in a
>> nightmare!
>> >>
>> >> Indeed as I look at the patch it’s curious that it’s up to the
>> caller to determine is calls to System.gc() have been suppressed.
>> I would have expected the collect() call to make the decision as
>> to should the call be honored or not.
>> >>
>> >> void SystemGCDCmd::execute(DCmdSource source, TRAPS) {
>> >> if (!DisableExplicitGC) {
>> >> Universe::heap()->collect(GCCause::_jcmd_gc_run);
>> >> } else {
>> >> output()->print_cr("Explicit GC is disabled, no GC has
>> been performed.");
>> >> }
>> >>
>> >>
>> >>
>> >> Kind regards,
>> >> Kirk Pepperdine
>> >>
>> >> On Jan 25, 2015, at 2:15 PM, Yasumasa Suenaga
>> <yasuenag at gmail.com <mailto:yasuenag at gmail.com>
>> <mailto:yasuenag at gmail.com <mailto:yasuenag at gmail.com>>> wrote:
>> >>
>> >>> Hi all,
>> >>>
>> >>> GCCause which is printed in gc log is "System.gc()" when jcmd
>> GC.run is invoked.
>> >>> I think that GCCause which is caused by jcmd GC.run should be
>> different from System.gc() .
>> >>>
>> >>> I uploaded webrev for this enhancement:
>> >>> http://cr.openjdk.java.net/~ysuenaga/JDK-8068589/webrev.00/
>> >>>
>> >>> This patch prints "jcmd GC.run" to gc log when jcmd GC.run is
>> invoked.
>> >>>
>> >>>
>> >>> Could you review it?
>> >>>
>> >>>
>> >>> Thanks,
>> >>>
>> >>> Yasumasa
>> >>
>>
>
--
Frederic Parain - Oracle
Grenoble Engineering Center - France
Phone: +33 4 76 18 81 17
Email: Frederic.Parain at oracle.com
More information about the hotspot-gc-dev
mailing list