Alan Bateman wrote:
Mandy Chung wrote:
This is related to 6857194: Add hotspot new perf counters to aid
class loading performance measurement.
It's useful to add performance counters in the library code so that
perf data from the JDK and VM can be collected and output in a
unified way (written in the jvmstat shared memory buffer). I add a
simple sun.misc.PerfCounter class to maintain the list of perf
counters for the library to use. This fix only instruments the class
loading and jar/zip to collect simple basic metrics. Additional
perf counters will be added in the future.
Webrev:
http://cr.openjdk.java.net/~mchung/6878481/webrev.00/
Thanks
Mandy
It's good to see the use of the instrumentation buffer extended to the
libraries.
I'm not sure how sun.misc.Perf behaves when running with
-XX:-UsePerfData. You've probably checked this anyway, but just in
case...
Adding -XX:-UsePerfData option works fine but I am yet to understand the
logics since this should be different than the case with a small
PerfDataMemorySize where the perf counters are still created but in the
C heap. I'm looking into the hotspot perfdata implementation further.
It would be good to include a comment to define the meaning of each of
the counters. For example, in ClassLoader.loadClass, it's not clear if
you mean to include the time to check if the class has already been
loaded (just on that one, if the lookup is not meant to be included
then it would reduce the calls to nanoTimes a bit).
As David points out the high number of calls to System.nanoTime, I
should refine the fix not to include the lookup time. I'll update the
fix and also describes the meaning of each counter.
Is it necessary to have separate counters for zip and JAR? If I'm
reading this correctly, then zipFiles and jarFiles will both be
incremented when a JAR file is opened - is that right?
That's right, both zipFiles and jarFiles counters are incremented.
I agree with Rémi's comment that perf, name, and lb can be final.
Agreed.
Would addElapsedTime(start) be better named as
addElapsedTimeFrom(start) to make it clear that it doesn't add "start"
to the elapsed time, but rather the elapsed time from the given
starting time?
Ok.
This might sound crazy, but do the updates need to be synchronized? I
don't think there is any synchronization in the VM. I agree with
David's concern about the overhead of the calls to nanoTimes (which
I'm sure you are measuring) but for the synchronization there are
places where both a counter and an elapsed time are updated.
Yes, I ran the server benchmarks on Windows XP that shows negligible
overhead. I have to rerun the solaris-i586 measurement as I got some
high standard deviation. I'm composing my reply to David's email.
With the synchronization, we might miss some updates. It's a tradeoff
between correctness and performance overhead (I have to find out the
reasons why it was decided not to have synchronization in the hotspot
implementation). Is the counter update a fast operation - updating the
direct buffer? I think so and thus this should not cause high lock
contention on the PerfCounter.
Thanks
Mandy
-Alan.