RFR 8062116: JVMTI GetClassMethods is Slow
Coleen Phillimore
coleen.phillimore at oracle.com
Mon Nov 3 20:19:54 UTC 2014
Hi Jeremy,
I reviewed your new code and it looks fine. I had one comment in
http://cr.openjdk.java.net/~jmanson/8062116/webrev.00/src/share/vm/prims/jvmtiEnv.cpp.udiff.html
The name "need_to_resolve" doesn't make sense when reading this code.
Isn't it more like "need_to_ensure_space" ? I think method resolution
with the other name, which it doesn't do.
I was trying to find a way to make this new code not appear twice (maybe
with a local jvmtiEnv function get_jmethodID(m) - instanceK_h is
m->method_holder()).
Also, I was trying to figure out if the new class in utilities called
chunkedList.hpp could be used to store jmethodIDs, since the data
structures are similar. There is still more things in JNIMethodBlock
has to do so I think a specialized structure is still needed (which is
why I originally wrote it to be very simple). I'm not sure if the
comment above it still applies. Maybe only the first and third
sentences. Can you rewrite the comment slightly?
Your other comments in the changes are good.
I can't completely answer your question about reusing free_methods - but
if a jmethodID is created provisionally in InstanceKlass::get_jmethod_id
and not needed because it loses the race in the method id cache, it's
never handed back to native code, so it's safe to reuse. This is
different than jmethodIDs for methods that are unloaded. They are
cleared and never reused. At least that's my reading of this caching
code but it's pretty complicated stuff.
I've also run our nsk and jck vm/jvmti on this change and they all
passed. I'd be happy to sponsor it with these suggested changes and it
needs another reviewer.
Thanks for diagnosing and fixing this problem!
Coleen
On 10/30/2014 01:02 PM, Jeremy Manson wrote:
> There's a significant regression in the speed of JVMTI GetClassMethods in
> JDK8. I've tracked this down to allocation of jmethodids in a tight loop.
> The issue can be addressed by preallocating enough space for all of the
> jmethodids when starting the operation and not iterating over all of the
> existing jmethodids when you allocate a new one.
>
> A patch is here:
>
> http://cr.openjdk.java.net/~jmanson/8062116/webrev.00/
>
> A reproducible test case can be found here:
>
> http://cr.openjdk.java.net/~jmanson/8062116/repro/
>
> It's a benchmark, though: I have no idea how to turn it into a test.
>
> For whoever reviews it: can you explain to me why it is okay that this code
> reuses jmethodIDs (in JNIMethodBlock::add_method? I can imagine a lot of
> problems stemming from accidental reuse.
>
> Jeremy
More information about the serviceability-dev
mailing list