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:37:00 UTC 2020



On 7/27/20 2:04 PM, Thomas Stüfe 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.

There is a 4th argument to the hashtable get() function that detects 
that we need rehashing.  You could assert it's false, and have your test 
insert 100 entries and see if it crashes.  I think if the hashcode is 
good, this should always return false.  I don't know this for a fact, 
but you could experiment with this.  Otherwise, do what Thomas suggests.
thanks,
Coleen


>
> 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