RFR: 8230662: Remove dead code from MethodTypeForm

Claes Redestad claes.redestad at oracle.com
Mon Sep 9 11:56:22 UTC 2019



On 2019-09-09 12:31, Peter Levart wrote:
> Hi Claes,
> 
> Your changes look good. 

Thanks! Already pushed, though.

> But I spotted a pre-existing and unusual use of 
> @Stable annotation in java.lang.invoke.MethodTypeForm class:
> 
>      // Cached adapter information:
>      @Stable final SoftReference<MethodHandle>[] methodHandles;
> 
>      // Cached lambda form information, for basic types only:
>      final @Stable SoftReference<LambdaForm>[] lambdaForms;
> 
> This declarations are paired with the following caching logic that 
> returns pre-existing entry if it is already set and not yet cleared or 
> cache new entry and return it:
> 
>      public synchronized MethodHandle setCachedMethodHandle(int which, 
> MethodHandle mh) {
>          // Simulate a CAS, to avoid racy duplication of results.
>          SoftReference<MethodHandle> entry = methodHandles[which];
>          if (entry != null) {
>              MethodHandle prev = entry.get();
>              if (prev != null) {
>                  return prev;
>              }
>          }
>          methodHandles[which] = new SoftReference<>(mh);
>          return mh;
>      }
> 
> and:
> 
>      public synchronized LambdaForm setCachedLambdaForm(int which, 
> LambdaForm form) {
>          // Simulate a CAS, to avoid racy duplication of results.
>          SoftReference<LambdaForm> entry = lambdaForms[which];
>          if (entry != null) {
>              LambdaForm prev = entry.get();
>              if (prev != null) {
>                  return prev;
>              }
>          }
>          lambdaForms[which] = new SoftReference<>(form);
>          return form;
>      }
> 
> 
> If these two @Stable annotations had any effect on JIT optimization, 
> then I think the caching logic would become ineffective for slots in 
> which SoftReference(s) got cleared by GC. In that case, such slots would 
> constantly be overwritten with new SoftReference(s) only to see old 
> constant-folded SoftReference(s) next time around.
> 
> So I think that these @Stable annotations do no good here. Either they 
> are ineffective in cases where MethodTypeForm instances are not 
> constant-folded, or they render caching ineffective when MethodTypeForm 
> instances are constant-folder and SoftReference(s) are cleared. In 
> either case it would be better without them.
> 
> What do you think?

You might be right, and this should be examined. It seems the @Stable
dates from an earlier version of MethodTypeForm that didn't use
SoftReferences:

https://bugs.openjdk.java.net/browse/JDK-8057020

Thanks!

/Claes


More information about the core-libs-dev mailing list