Minor GC difference Java 7 vs Java 8
Jon Masamitsu
jon.masamitsu at oracle.com
Mon Jun 2 22:52:14 UTC 2014
On 06/01/2014 05:14 PM, Chris Hurst wrote:
> Hi,
>
> Thanks for the replies, I've been stuck on this issue for about a year
> and had raised it with Oracle support but hadn't got anywhere but last
> weekend I managed to get a lot further with it ..
>
> I wrote a trivial program to continuously fill young gen and release
> the garbage for use with some DTrace tests and this showed a similar
> issue spikes wise from there I could work out the issue as the
> parallel GC threads, i.e. anything less than number of cores removed
> the spike (ie cores-1), for the test program normal young GC
> oscillated about 1ms but spiked at about 15ms(need to check) (Reducing
> the parallel threads worked on the real application in a similar way).
> We managed to identify some very minor tasks (they were so small they
> weren't showing up on some of our less fine grained CPU monitoring)
> that occasionally competed for CPU, the effect was surprising
> relatively but now we understand the cause we can tune the Java 6 GC
> better.
> The spikes were again larger than I would have expected and all appear
> to be every close in size, I wouldn't have predicted this from the
> issue but that's fine ;-)
>
> Currently the Java 7 version is still not quite as good on overall
> throughput when not spiking though I will recheck these results, as
> our most recent tests were around tuning J6 with the new info. We're
> happy with our Java 6 GC performance.
>
> Although we can now reduce these already rare spikes (potentially to
> zero), I can't 100% guarantee they won't occur so I would still like
> to understand why Java 7 appears to handle this scenario less efficiently.
>
> Using Dtrace we were mostly seeing yields and looking at a stack trace
> pointed us toward some JDK 7 changes and some newer java options that
> might be related ?? ...
>
> taskqueue.cpp
>
> libc.so.1`lwp_yield+0x15 libjvm.so`__1cCosFyield6F_v_+0x257
> libjvm.so`__1cWParallelTaskTerminatorFyield6M_v_+0x18
> libjvm.so`__1cWParallelTaskTerminatorRoffer_termination6MpnUTerminatorTerminator__b_+0xe8
> libjvm.so`__1cJStealTaskFdo_it6MpnNGCTaskManager_I_v_+0x378
> libjvm.so`__1cMGCTaskThreadDrun6M_v_+0x19f libjvm.so`java_start+0x1f2
> libc.so.1`_thr_setup+0x4e libc.so.1`_lwp_start 17:29
>
> uintx WorkStealingHardSpins = 4096
> {experimental}
> uintx WorkStealingSleepMillis = 1
> {experimental}
> uintx WorkStealingSpinToYieldRatio = 10
> {experimental}
> uintx WorkStealingYieldsBeforeSleep = 5000
> {experimental}
>
> I haven't had a chance to play with these as yet but could these be
> involved eg j7 tuned to be more friendly to other applications at the
> cost of latency (spin to yield) ? Would that make sense ?
>
Chris,
My best recollection is that there was a performance regression
reported internally and the change to 5000 was to fix
that regression. Increasing the number of yield's done before
a sleep made this code work more like the previous behavior.
Let me know if you need better information and I can see what
I can dig up.
By the way, when you tuned down the number of ParallelGCThreads,
you saw little or no increase in the STW pause times?
You're using UseParallelGC?
Jon
> We would like to move to Java 7 for support reasons, also as we are on
> Solaris the extra memory over head of J8 (64bit only) even with
> compressed oops gives us another latency hit.
>
> Chris
>
> PS -XX:+AlwaysPreTouch is on.
>
> > Date: Thu, 29 May 2014 13:47:39 -0700
> > From: Peter.B.Kessler at Oracle.COM
> > To: christopherhurst at hotmail.com; hotspot-gc-use at openjdk.java.net
> > Subject: Re: Minor GC difference Java 7 vs Java 8
> >
> > Are the -XX:+PrintGCDetails "[Times: user=0.01 sys=0.00, real=0.03
> secs]" reports for the long pauses different from the short pauses?
> I'm hoping for some anomalous sys time, or user/real ratio, that would
> indicate it was something happening on the machine that is interfering
> with the collector. But you'd think that would show up as occasional
> 15ms blips in your message processing latency outside of when the
> collector goes off.
> >
> > Does -XX:+PrintHeapAtGC show anything anomalous about the space
> occupancy after the long pauses? E.g., more objects getting copied to
> the survivor space, or promoted to the old generation? You could infer
> the numbers from -XX:+PrintGCDetails output if you didn't want to deal
> with the volume produced by -XX:+PrintHeapAtGC.
> >
> > You don't say how large or how stable your old generation size is.
> If you have to get new pages from the OS to expand the old generation,
> or give pages back to the OS because the old generation can shrink,
> that's extra work. You can infer this traffic from -XX:+PrintHeapAtGC
> output by looking at the "committed" values for the generations. E.g.,
> in "ParOldGen total 43008K, used 226K [0xba400000, 0xbce00000,
> 0xe4e00000)" those three hex numbers are the start address for the
> generation, the end of the committed memory for that generation, and
> the end of the reserved memory for that generation. There's a similar
> report for the young generation. Running with -Xms equal to -Xmx
> should prevent pages from being acquired from or returned to the OS
> during the run.
> >
> > Are you running with -XX:+AlwaysPreTouch? Even if you've reserved
> and committed the address space, the first time you touch new pages
> the OS wants to zero them, which takes time. That flags forces all the
> zeroing at initialization. If you know your page size, you should be
> able to see the generations (mostly the old generation) crossing a
> page boundary for the first time in the -XX:+PrintHeapAtGC output.
> >
> > Or it could be some change in the collector between JDK-6 and JDK-7.
> >
> > Posting some log snippets might let sharper eyes see something.
> >
> > ... peter
> >
> > On 04/30/14 07:58, Chris Hurst wrote:
> > > Hi,
> > >
> > > Has anyone seen anything similar to this ...
> > >
> > > On java 6 (range of versions 32bit Solaris) application , using
> parallel old gc, non adapative. Using a very heavy test performance
> load we see minor GC's around the 5ms mark and some very rare say 3or4
> ish instances in 12 hours say 20ms pauses the number of pauses is
> random (though always few compares with the total number of GC's) and
> large ~20ms (this value appears the same for all such points.) We have
> a large number of minor GC's in our runs, only a full GC at startup.
> These freak GC's can be bunched or spread out and we can run for many
> hours without one (though doing minor GC's).
> > >
> > > What's odd is that if I use Java 7 (range of versions 32bit) the
> result is very close but the spikes (1 or 2 arguably less) are now
> 30-40ms (depends on run arguably even rarer). Has anyone experienced
> anything similar why would Java 7 up to double a minor GC / The GC
> throughput is approximately the same arguably 7 is better throughput
> just but that freak minor GC makes it usable due to latency.
> > >
> > > In terms of the change in spike height (20 (J6)vs40(J7)) this is
> very reproducible though the number of points and when they occur
> varies slightly. The over all GC graph , throughput is similar
> otherwise as is the resultant memory dump at the end. The test should
> be constant load, multiple clients just doing the same thing over and
> over.
> > >
> > > Has anyone seen anything similar, I was hoping someone might have
> seen a change in defaults, thread timeout, default data structure size
> change that would account for this. I was hoping the marked increase
> might be a give away to someone as its way off our average minor GC time.
> > >
> > > We have looked at gclogs, heap dumps, processor activity,
> background processes, amount of disc access, safepoints etc etc. , we
> trace message rate into out of the application for variation, compare
> heap dumps at end etc. nothing stands out so far.
> > >
> > > Chris
> > >
> > >
> > >
> > >
> > >
> > >
> > >
> > >
> > > _______________________________________________
> > > hotspot-gc-use mailing list
> > > hotspot-gc-use at openjdk.java.net
> > > http://mail.openjdk.java.net/mailman/listinfo/hotspot-gc-use
> > >
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/hotspot-gc-use/attachments/20140602/7b20f050/attachment-0001.html>
More information about the hotspot-gc-use
mailing list