RFR: 8333793: Improve BootstrapMethodInvoker for ConstantBootstraps and ProxyGenerator

ExE Boss duke at openjdk.org
Fri Jun 7 18:42:12 UTC 2024


On Fri, 7 Jun 2024 13:45:42 GMT, Chen Liang <liach at openjdk.org> wrote:

>> This PR refactors type matching in BootstrapMethodInvoker and adds a few types, seeking to improve bootstrap overheads of some ConstantBootstraps and in particular the ProxyGenerator condys generated for e.g. annotation proxies since [JDK-8332457](https://bugs.openjdk.org/browse/JDK-8332457)
>> 
>> I've adjusted the micro-benchmark added by JDK-8332457 to not only generate a proxy but also call into one of the proxied methodt (`Object::hashCode`). 
>> 
>> Running org.openjdk.bench.java.lang.reflect.ProxyGenBench as a one-off startup benchmark sees significant improvement (-9% instructions, -6% cycles):
>> 
>> Name             Cnt           Base          Error            Test          Error         Unit  Change
>> Perfstartup-JMH   20        154,000 ±        8,165         148,000 ±       23,164        ms/op   1,04x (p = 0,352 )
>>   :.cycles            925335973,200 ± 47147600,262   842221278,800 ± 46836254,964       cycles   0,91x (p = 0,000*)
>>   :.instructions     2101588857,600 ± 81105850,361  1966307798,400 ± 22011043,908 instructions   0,94x (p = 0,000*)
>>   :.taskclock               291,500 ±       16,494         262,000 ±       15,328           ms   0,90x (p = 0,000*)
>>   * = significant
>> 
>> Number of classes loaded drops from 1096 to 1092
>> 
>> Running the micro regularly shows no significant difference:
>> 
>> Name                              Cnt   Base   Error    Test   Error  Unit  Change
>> ProxyGenBench.generateAndProxy100  10 26,827 ± 8,954  26,855 ± 7,531 ms/op   1,00x (p = 0,991 )
>>   * = significant
>
> src/java.base/share/classes/java/lang/invoke/BootstrapMethodInvoker.java line 289:
> 
>> 287:      * bootstrap method.
>> 288:      */
>> 289:     private static final MethodType CONDY_GET_STATIC_FINAL_MT = MethodType.methodType(Object.class,
> 
> This type should just be called `CONDY_NO_ARG` as it's the most common form of condy that doesn't take any arg (`nullConstant` `primitiveClass` etc.)

Note that [`ConstantBootstraps​::primitiveClass​(Lookup, String, Class)`] has a static return type of `Class⁠<⁠?⁠>`, so the following is also needed:

/**
 * Exact type used of the {@link ConstantBootstraps#primitiveClass(Lookup, String, Class)}
 * bootstrap method.
 */
private static final MethodType CONDY_CLASS_NO_ARG_MT
	= CONDY_GET_STATIC_FINAL_MT.changeReturnType(Class.class);


[`ConstantBootstraps​::primitiveClass​(Lookup, String, Class)`]: https://docs.oracle.com/en/java/javase/22/docs/api/java.base/java/lang/invoke/ConstantBootstraps.html#primitiveClass(java.lang.invoke.MethodHandles.Lookup,java.lang.String,java.lang.Class)

-------------

PR Review Comment: https://git.openjdk.org/jdk/pull/19598#discussion_r1631570980


More information about the core-libs-dev mailing list