bottleneck by java.lang.Class.getAnnotations() - proposed patch

Peter Levart peter.levart at gmail.com
Wed Nov 7 19:02:00 UTC 2012


On 11/07/2012 06:59 PM, Martin Buchholz wrote:
> We've also seen deadlocks in accessing annotations in the wild.
> So, many thanks for working on this (both performance improvements and 
> deadlock removal).
> We don't have a test case to contribute, but here's a stacktrace:
That's one thread. What about the other(s)?

I guess this is similar to http://bugs.sun.com/view_bug.do?bug_id=7122142

Various locks are involved:

- AnnotationType.getInstance is a static synchronized method (locks on 
AnnotationType.class)

- Class.initAnnotationsIfNecessary is an instance synchronized method 
(locks on various .class instances)

lazy initialization sequence can take various ordering combinations 
among threads (recursing on loading annotations on annotations - the 
meta annotations - when requested by the AnnotationType init).

The proposed patch removes blocking synchronization on 
Class.initAnnotationsIfNecessary (replacing this method with another one 
that has no blocking synchronization). Therefore just one lock remains 
in such scenarios (AnnotationType.getInstance) and there's no dead-lock 
with just one lock ;-)

Regards, Peter

>
> sun.reflect.annotation.AnnotationType.getInstance(AnnotationType.java:80)
>     
>  sun.reflect.annotation.AnnotationParser.parseAnnotation(AnnotationParser.java:220)
>     
>  sun.reflect.annotation.AnnotationParser.parseAnnotations2(AnnotationParser.java:87)
>     
>  sun.reflect.annotation.AnnotationParser.parseAnnotations(AnnotationParser.java:70)
>      java.lang.Class.initAnnotationsIfNecessary(Class.java:3093)
>      java.lang.Class.getAnnotation(Class.java:3050)
>      sun.reflect.annotation.AnnotationType.<init>(AnnotationType.java:130)
>     
>  sun.reflect.annotation.AnnotationType.getInstance(AnnotationType.java:83)
>     
>  sun.reflect.annotation.AnnotationParser.parseAnnotation(AnnotationParser.java:220)
>     
>  sun.reflect.annotation.AnnotationParser.parseAnnotations2(AnnotationParser.java:87)
>     
>  sun.reflect.annotation.AnnotationParser.parseAnnotations(AnnotationParser.java:70)
>      java.lang.Class.initAnnotationsIfNecessary(Class.java:3093)
>      java.lang.Class.getAnnotation(Class.java:3050)
>      sun.reflect.annotation.AnnotationType.<init>(AnnotationType.java:130)
>     
>  sun.reflect.annotation.AnnotationType.getInstance(AnnotationType.java:83)
>     
>  sun.reflect.annotation.AnnotationParser.parseAnnotation(AnnotationParser.java:220)
>     
>  sun.reflect.annotation.AnnotationParser.parseAnnotations2(AnnotationParser.java:87)
>     
>  sun.reflect.annotation.AnnotationParser.parseAnnotations(AnnotationParser.java:70)
>      java.lang.Class.initAnnotationsIfNecessary(Class.java:3093)
>      java.lang.Class.getAnnotation(Class.java:3050)
>
> Martin
>
> On Wed, Nov 7, 2012 at 9:11 AM, Peter Levart <peter.levart at gmail.com 
> <mailto:peter.levart at gmail.com>> wrote:
>
>     On 11/06/2012 08:37 AM, Peter Levart wrote:
>
>
>         Hi all,
>
>         I have prepared a better patch. It addresses the goals of
>         JEP-149 more seriously. I also have some benchmarks. Stay tuned...
>
>         Regards, Peter
>
>
>
>     For easier viewing, here's also a webrev:
>
>     http://dl.dropbox.com/u/101777488/jdk8-hacks/JEP-149/webrev/index.html
>
>     Regards, Peter
>
>




More information about the core-libs-dev mailing list