RFR(XS) 8249719: MethodHandle performance suffers from bad ResolvedMethodTable hash function

coleen.phillimore at oracle.com coleen.phillimore at oracle.com
Mon Jul 27 18:41:25 UTC 2020



On 7/27/20 2:33 PM, Volker Simonis wrote:
> I like this solution although it introduces a hard dependency on the 
> exact log format. But that's probably not a big issue.
>
> Another possibility would probably be to add a gtest.
>
> But I'd also be happy to make the current test a manual test.
>
> Let's see what Coleen's opinion is. We can use her as a tiebreaker :)
>
> Otherwise I'll leave it up to Andrei to choose his preferred option :)

So what I suggested is risky (I'm curious to see if it works).  My 
second choice is to make it a manual test.  Hopefully we won't be 
changing up the hashcode all the time and risk breaking this again.
thanks,
Coleen
>
> On Mon, Jul 27, 2020 at 8:04 PM Thomas Stüfe <thomas.stuefe at gmail.com 
> <mailto:thomas.stuefe at gmail.com>> wrote:
>
>     Hi Andrei,
>
>     I was afraid this might happen, but only occurred to me after the
>     review.
>
>     My proposal would be:
>
>     - in resolvedMethodTable.cpp, extend the log message in
>     log_insert() and print out the hashcode too (e.g. "ResolvedMethod
>     entry added for ... (4711)").
>
>     - In the test, start your test as a sub process, give it
>     -Xlog:membername+table=debug, and scan the output line for
>     "ResolvedMethod entry added for <your class name> (<hash>)".
>     Extract the hash. Read two or three lines and compare the hash.
>
>     The advantage would be that you do not need to load 200k classes
>     to see that your regression test works, and it is timing
>     independent. For examples of sub process spawning and
>     output scanning, there are many jtreg tests already (e.g.
>     runtime/ErrorHandling has a few).
>
>     Just my 5 cent. Maybe the others have different proposals.
>
>     Cheers, Thomas
>
>
>
>
>     On Mon, Jul 27, 2020 at 7:52 PM Andrei Pangin
>     <andrei.pangin at gmail.com <mailto:andrei.pangin at gmail.com>> wrote:
>
>         Hi,
>
>         Coleen, Thomas, thank you for your reviews. It turns out
>         though that my new test times out on debug builds (thanks
>         Volker for double-checking).
>
>         Test 	Tier 	Platform 	Description
>         runtime/MemberName/ResolvedMethodTableHash.java 	tier1
>         linux-aarch64-debug 	Error: Program `...java' timed out
>         (timeout set to ...ms, elapsed time including timeout handling
>         was ...ms).
>         runtime/MemberName/ResolvedMethodTableHash.java 	tier1
>         windows-x64-debug 	Error: Program
>         `c\:\\ade\\mesos\\work_dir\\jib-master\\install\\...-07-27-0826248.andrei.pangin.source\\windows-x64-debug.jdk\\jdk-16\\fastdebug\\bin\\java'
>         timed out (timeout set to ...ms, elapsed time including
>         timeout handling was ...ms).
>         runtime/MemberName/ResolvedMethodTableHash.java 	tier1
>         macosx-x64-debug 	Error: Program `...java' timed out (timeout
>         set to ...ms, elapsed time including timeout handling was ...ms).
>
>
>         Apparently, we can't rely on timing, since this test runs two
>         orders of magnitude slower on debug JVM than on product one. I
>         could simply mark the test as manual, or is there a better
>         idea? Maybe, adjust the parameters and run the test
>         automatically only on product or only on debug JVM? What do
>         you think?
>
>         Regards,
>         Andrei
>
>         сб, 25 июл. 2020 г. в 17:34, <coleen.phillimore at oracle.com
>         <mailto:coleen.phillimore at oracle.com>>:
>
>
>             Hi Andrei,
>             This looks good.  Thank you for finding this bug.  And
>             thanks to Volker for sponsoring it as well.
>             Nice to see you on the list, Andrei!
>             Coleen
>
>             On 7/25/20 3:18 AM, Thomas Stüfe wrote:
>>             Hi, Andrei,
>>
>>             Good find. I played around with a test of generating lots
>>             of lambdas and yes, all the hashes are equal. With your
>>             patch invocation time went down by half (that was for
>>             10000 lambdas).
>>
>>             The test looks fine though the normal way to do this
>>             seems to be jcod. I personally don't care since the test
>>             is nice and self contained that way, but someone from the
>>             Oracle runtime group should confirm this is fine (ccing
>>             Coleen).
>>
>>             JDK11 seems to be affected too.
>>
>>             This probably also affects jruby.
>>
>>             +1 from me.
>>
>>             ..Thomas
>>
>>             On Fri, Jul 24, 2020 at 4:53 PM Andrei Pangin
>>             <andrei.pangin at gmail.com
>>             <mailto:andrei.pangin at gmail.com>> wrote:
>>
>>                 Hi,
>>
>>                 Please review a small fix to a not-so-small
>>                 performance issue that we've
>>                 seen when migrating a production application from JDK
>>                 8 to JDK 14.
>>
>>                 On certain workloads, where Nashorn produces
>>                 thousands MethodHandles,
>>                 ResolvedMethodTable operations become extremely slow
>>                 due to degenerate
>>                 hashcode. This patch basically fixes hashcode by
>>                 including the method
>>                 holder's name in the computation. More details in the
>>                 bug report.
>>
>>                 CR: https://bugs.openjdk.java.net/browse/JDK-8249719
>>                 Webrev:
>>                 https://cr.openjdk.java.net/~apangin/8249719/webrev/
>>
>>                 Tested: tier1-2, hotspot*runtime
>>
>>                 I'll be glad if someone could sponsor the patch.
>>
>>                 Thank you,
>>                 Andrei Pangin
>>
>



More information about the hotspot-runtime-dev mailing list