Skip to content

Look up of parameter annotations causes deadlock [SPR-8319] #12967

@spring-projects-issues

Description

@spring-projects-issues

Johannes Tuchscherer opened SPR-8319 and commented

When there are a lot of requests hitting a request method with parameter annotations we occasionally get a deadlock in the jvm (see below for stack trace). I think this could be easily fixed in the org.springframework.core.HandlerMethodInvoker, if - instead of creating a new instance of MethodParameter every time (line 243) - the methodParameters and their annotations would be cached. This would also give us a nice performance gain, since we don't need to lookup annotations every time the request method is called.

java.lang.Thread.State: BLOCKED (on object monitor)
at java.lang.reflect.Proxy.getProxyClass(Proxy.java:417) - waiting to lock <0x00000000ac1166d0> (a java.util.HashMap)
at java.lang.reflect.Proxy.newProxyInstance(Proxy.java:581)
at sun.reflect.annotation.AnnotationParser.annotationForMap(AnnotationParser.java:239)
at sun.reflect.annotation.AnnotationParser.parseAnnotation(AnnotationParser.java:229)
at sun.reflect.annotation.AnnotationParser.parseParameterAnnotations2(AnnotationParser.java:133)
at sun.reflect.annotation.AnnotationParser.parseParameterAnnotations(AnnotationParser.java:110)
at java.lang.reflect.Method.getParameterAnnotations(Method.java:751)
at org.springframework.core.MethodParameter.getParameterAnnotations(MethodParameter.java:232)
at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveHandlerArguments(HandlerMethodInvoker.java:246)
at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:169)
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:421)
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:409)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:771)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:716)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:549)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)

Blocked by:

java.lang.Thread.State: BLOCKED (on object monitor)
at java.util.AbstractList.iterator(AbstractList.java:273)
at java.util.AbstractList.hashCode(AbstractList.java:524)
at java.util.HashMap.get(HashMap.java:300)
at java.lang.reflect.Proxy.getProxyClass(Proxy.java:426) - locked <0x00000000ac1166d0> (a java.util.HashMap)
at java.lang.reflect.Proxy.newProxyInstance(Proxy.java:581)
at sun.reflect.annotation.AnnotationParser.annotationForMap(AnnotationParser.java:239)
at sun.reflect.annotation.AnnotationParser.parseAnnotation(AnnotationParser.java:229)
at sun.reflect.annotation.AnnotationParser.parseParameterAnnotations2(AnnotationParser.java:133)
at sun.reflect.annotation.AnnotationParser.parseParameterAnnotations(AnnotationParser.java:110)
at java.lang.reflect.Method.getParameterAnnotations(Method.java:751)
at org.springframework.core.MethodParameter.getParameterAnnotations(MethodParameter.java:232)
at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveHandlerArguments(HandlerMethodInvoker.java:246)
at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:169)
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:421)
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:409)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:771)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:716)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:549)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)


Affects: 3.0.2

Issue Links:

1 votes, 2 watchers

Metadata

Metadata

Assignees

No one assigned

    Labels

    in: coreIssues in core modules (aop, beans, core, context, expression)status: duplicateA duplicate of another issue

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions