JDK 8 RFR for JDK-7185456 : (ann) Optimize Annotation handling in java/sun.reflect.* code for small number of annotationsC

Joel Borggrén-Franck joel.franck at oracle.com
Wed Mar 27 08:41:39 UTC 2013


Hi Joe,

Looks good to me.

I would include Andrej's suggestion of removing one of the members.put(...).

cheers
/Joel

On 03/26/2013 11:43 PM, Joe Darcy wrote:
> Hello,
>
> Please review this refactoring of how annotations objects are created:
>
>      JDK-7185456 : (ann) Optimize Annotation handling in java/sun.reflect.*
> code for small number of annotationsC
>      http://cr.openjdk.java.net/~darcy/7185456.0/
>
> In brief, an annotation object is backed by a hash map with one entry per
> method defined on the annotation type. Currently the default HashMap
> constructor which uses a default capacity of 16 is used. Since most
> annotation type define many fewer methods, some space is wasted. The patch
> (inline below) "right sizes" the HashMap to match the number of methods in
> the annotation type.
>
> Thanks,
>
> -Joe
>
> --- old/src/share/classes/sun/reflect/annotation/AnnotationType.java
> 2013-03-26 15:37:22.000000000 -0700
> +++ new/src/share/classes/sun/reflect/annotation/AnnotationType.java
> 2013-03-26 15:37:22.000000000 -0700
> @@ -45,19 +45,18 @@
>        * types.  This matches the return value that must be used for a
>        * dynamic proxy, allowing for a simple isInstance test.
>        */
> -    private final Map<String, Class<?>> memberTypes = new
> HashMap<String,Class<?>>();
> +    private final Map<String, Class<?>> memberTypes;
>
>       /**
>        * Member name -> default value mapping.
>        */
> -    private final Map<String, Object> memberDefaults =
> -        new HashMap<String, Object>();
> +    private final Map<String, Object> memberDefaults;
>
>       /**
>        * Member name -> Method object mapping. This (and its assoicated
>        * accessor) are used only to generate AnnotationTypeMismatchExceptions.
>        */
> -    private final Map<String, Method> members = new HashMap<String, Method>();
> +    private final Map<String, Method> members;
>
>       /**
>        * The retention policy for this annotation type.
> @@ -105,6 +104,9 @@
>                   }
>               });
>
> +        memberTypes = new HashMap<String,Class<?>>(methods.length+1, 1.0f);
> +        memberDefaults = new HashMap<String, Object>(0);
> +        members = new HashMap<String, Method>(methods.length+1, 1.0f);
>
>           for (Method method :  methods) {
>               if (method.getParameterTypes().length != 0)



More information about the core-libs-dev mailing list