Increased safepoint cleanup tasks in Java 11 (vs 8)
Daniel D. Daugherty
daniel.daugherty at oracle.com
Wed Jun 5 23:08:49 UTC 2019
On 6/5/19 7:03 PM, Vitaly Davidovich wrote:
>
>
> On Wed, Jun 5, 2019 at 6:55 PM David Holmes <david.holmes at oracle.com
> <mailto:david.holmes at oracle.com>> wrote:
>
> On 6/06/2019 2:31 am, Vitaly Davidovich wrote:
> > On Wed, Jun 5, 2019 at 12:15 PM Daniel D. Daugherty <
> > daniel.daugherty at oracle.com
> <mailto:daniel.daugherty at oracle.com>> wrote:
> >
> >> On 6/5/19 12:04 PM, Vitaly Davidovich wrote:
> >>
> >>
> >>
> >> On Wed, Jun 5, 2019 at 11:44 AM Daniel D. Daugherty <
> >> daniel.daugherty at oracle.com
> <mailto:daniel.daugherty at oracle.com>> wrote:
> >>
> >>> On 6/5/19 11:37 AM, Vitaly Davidovich wrote:
> >>>> On Wed, Jun 5, 2019 at 8:58 AM Vitaly Davidovich
> <vitalyd at gmail.com <mailto:vitalyd at gmail.com>>
> >>> wrote:
> >>>>
> >>>>> Hey Aleksey,
> >>>>>
> >>>>> On Wed, Jun 5, 2019 at 8:52 AM Aleksey Shipilev
> <shade at redhat.com <mailto:shade at redhat.com>>
> >>> wrote:
> >>>>>
> >>>>>> On 6/5/19 2:33 PM, Vitaly Davidovich wrote:
> >>>>>>> Does anyone have ideas on pinpointing this further?
> >>>>>> I have the educated guess:
> >>>>>> https://bugs.openjdk.java.net/browse/JDK-8181859
> >>>>>>
> >>>>>> Which means you can try if
> -XX:MonitorUsedDeflationThreshold=0 reduces
> >>>>>> the number of "guaranteed"
> >>>>>> safepoints.
> >>>>>>
> >>>>> Hmm, the application doesn't use JVM monitors (in any meaningful
> >>>>> capacity). But interesting JBS entry - I will try it out,
> thanks! The
> >>>>> description of safepoint clean up in there is/was consistent
> with my
> >>>>> understanding as well. On Java 8, we'd see the "no vm
> operation"
> >>> safepoint
> >>>>> operations, and I always assumed it was IC buffer cleaning
> (even had a
> >>> mail
> >>>>> thread on that topic a few years ago, either on this list or
> >>>>> hotspot-compiler). That tended to stabilize (i.e. they went
> away)
> >>> after
> >>>>> the application reached steady state, whereas I'm seeing
> essentially
> >>>>> non-stop safepoint cleanups on 11.
> >>>>>
> >>>> Ok, adding -XX:MonitorUsedDeflationThreshold=0 seems to
> alleviate the
> >>> issue
> >>>> - # of entered safepoint cleanups looks on par with Java 8,
> although I'm
> >>>> still assessing a bit more.
> >>>
> >>> This observation doesn't really match with your earlier comment:
> >>>
> >>>> Hmm, the application doesn't use JVM monitors (in any meaningful
> >>>> capacity).
> >>>
> >>> The default value for MonitorUsedDeflationThreshold is 90. So
> a cleanup
> >>> safepoint should only be triggered if monitor use exceeds 90%
> of the
> >>> monitor pool.
> >>>
> >> Hmm, ok - I see what you mean:
> >>
> https://github.com/openjdk/jdk11u/blob/d46b56eb81b07b452141c7dcd078d33fc8e49d63/src/hotspot/share/runtime/safepoint.cpp#L604
> >>
> >> So there's either monitor usage that I'm not aware of (or
> forgot about) or
> >> the ratio is > 90 but the absolute # of them is small (which
> I'd consider
> >> "don't use in any meaningful capacity"). Is there a way to
> print out
> >> monitor population so I can see?
> >>
> >>
> >> I've been adding a lot of logging support to the Java Monitor
> subsystem,
> >> but those changes are in JDK13 and not in JDK11. I'm trying to
> remember
> >> what there is in JDK11, but ...
> >>
> > Yeah, I'm having a hard time keeping track of what
> features/changes are in
> > what Java release or update version or upstream/downstream
> backport or ...
> >
> > By the way, do JNI (specifically, Java calling into native)
> calls cause
> > monitor inflation? The app in question does have substantial JNI
> usage. I
> > guess by not using java monitors extensively, I meant the
> vanilla flavor of
> > Java code with synchronized blocks/methods.
>
> JNI calls do not in themselves impact monitors. However if native
> code
> uses the JNI MonitorEnter then that does trigger inflation.
>
> David
> -----
>
> Thanks for clarifying, David.
>
> Pretty certain that JNI code I have is not calling MonitorEnter, but
> will double check.
>
> So beyond monitor contention via vanilla Java code, are there other
> scenarios resulting in inflation? Is there perhaps a list of these
> that someone could point to? I can spelunk through hotspot code, but
> maybe someone can spare me that exercise :).
Java Monitor inflation is caused by:
- contention on the same monitor between 2 or more threads
- monitor.wait() call
- synchronized (obj) { obj.hashCode(); }
The last one is specific to the HotSpot VM.
Dan
>
> Thanks!
>
>
>
> >
> >>
> >> Dan
> >>
> >>
> >>
> >> Thanks Dan
> >>
> >>>
> >>> Dan
> >>>
> >>>
> >>>>
> >>>> Of course now the trouble is this is an experimental option, and
> >>> enabling
> >>>> things like that in production raises eyebrows. Is it safe
> to assume,
> >>>> however, that setting this to 0 essentially behaves like Java
> 8? It
> >>> appears
> >>>> so, based on that JBS Aleksey linked above. But just double
> checking.
> >>>>
> >>>> If that's the case, then perhaps we can overlook the
> experimental bit
> >>> and
> >>>> wait until this is done outside safepoints, per Robbin's email.
> >>>>
> >>>> Thanks to everyone that responded on this thread! Very helpful.
> >>>>
> >>>>>> --
> >>>>>> Thanks,
> >>>>>> -Aleksey
> >>>>>>
> >>>>>>
> >>>
> >>>
> >>
>
> --
> Sent from my phone
More information about the hotspot-runtime-dev
mailing list