RFR 8062116: JVMTI GetClassMethods is Slow

serguei.spitsyn at oracle.com serguei.spitsyn at oracle.com
Wed Nov 5 04:56:27 UTC 2014


The fix looks good in general.

src/share/vm/oops/method.cpp

1785   bool contains(Method** m) {
1786     if (m == NULL) return false;
1787     for (JNIMethodBlockNode* b = &_head; b != NULL; b = b->_next) {
1788       if (b->_methods <= m && m < b->_methods + b->_number_of_methods) {
*1789         ptrdiff_t idx = m - b->_methods;**
**1790         if (b->_methods + idx == m) {**
1791           return true;
1792         }*
1793       }
1794     }
1795     return false;  // not found
1796   }


Just noticed that the lines 1789-1792 can be replaced with one liner:
*        return true;*

It is because the condition *(b->_methods + idx == m)* is always true.   
   :)

Also, should we check the condition: **m != _free_method*** ?
What about the following ?:
*        return (****m != _free_method***);*


Thanks,
Serguei


On 11/4/14 5:52 PM, Jeremy Manson wrote:
> Updated patch here:
>
> http://cr.openjdk.java.net/~jmanson/8062116/webrev.01/ 
> <http://cr.openjdk.java.net/%7Ejmanson/8062116/webrev.01/>
>
> Jeremy
>
> On Tue, Nov 4, 2014 at 2:15 PM, serguei.spitsyn at oracle.com 
> <mailto:serguei.spitsyn at oracle.com> <serguei.spitsyn at oracle.com 
> <mailto:serguei.spitsyn at oracle.com>> wrote:
>
>     Jeremy and Coleen,
>
>     Thank you for taking care about this bug!
>
>     The fix looks good to me.
>     I do not see any issues.
>
>     Coleen,
>
>     Please, let me know if you need any help with testing or anything
>     else.
>
>     Thanks,
>     Serguei
>
>
>     On 11/4/14 11:57 AM, serguei.spitsyn at oracle.com
>     <mailto:serguei.spitsyn at oracle.com> wrote:
>
>         Hi Jeremy and Coleen,
>
>         I'm reviewing this too.
>         We also need to run the nsk.jvmti, nsk.jdi and jtreg jdi tests.
>
>         Thanks,
>         Serguei
>
>         On 11/3/14 12:19 PM, Coleen Phillimore wrote:
>
>
>             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
>             <http://cr.openjdk.java.net/%7Ejmanson/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()).
>
>
>         Agreed on the above.
>
>
>             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/
>                 <http://cr.openjdk.java.net/%7Ejmanson/8062116/webrev.00/>
>
>                 A reproducible test case can be found here:
>
>                 http://cr.openjdk.java.net/~jmanson/8062116/repro/
>                 <http://cr.openjdk.java.net/%7Ejmanson/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
>
>
>
>
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/serviceability-dev/attachments/20141104/23ae12e1/attachment-0001.html>


More information about the serviceability-dev mailing list