Skip to content

Performance issues with SerializableTypeWrapper on Java 1.7.0_51 [SPR-11335] #15959

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
spring-projects-issues opened this issue Jan 20, 2014 · 8 comments
Assignees
Labels
in: core Issues in core modules (aop, beans, core, context, expression) type: bug A general bug
Milestone

Comments

@spring-projects-issues
Copy link
Collaborator

Phil Webb opened SPR-11335 and commented

The Spring XD build time jumped from 7mins to over 20mins following a Java upgrade to 1.7.0_51.

The root cause of the performance problems appears to be SerializableTypeWrapper.


Referenced from: commits d96b91a

2 votes, 6 watchers

@spring-projects-issues
Copy link
Collaborator Author

Phil Webb commented

Test worker [RUNNABLE]
	sun.reflect.Reflection.getCallerClass()
	java.lang.Class.getConstructor(Class[])
	java.lang.reflect.Proxy.newProxyInstance(ClassLoader, Class[], InvocationHandler)
	org.springframework.core.SerializableTypeWrapper.forTypeProvider(SerializableTypeWrapper$TypeProvider)
	org.springframework.core.SerializableTypeWrapper$TypeProxyInvocationHandler.invoke(Object, Method, Object[])
	com.sun.proxy.$Proxy9.getActualTypeArguments()
	sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl.equals(Object)
	sun.reflect.GeneratedMethodAccessor8.invoke(Object, Object[])
	sun.reflect.DelegatingMethodAccessorImpl.invoke(Object, Object[])
	java.lang.reflect.Method.invoke(Object, Object[])
	org.springframework.core.SerializableTypeWrapper$TypeProxyInvocationHandler.invoke(Object, Method, Object[])
	com.sun.proxy.$Proxy9.equals(Object)
	org.springframework.util.ObjectUtils.nullSafeEquals(Object, Object)
	org.springframework.core.ResolvableType.equals(Object)
	org.springframework.util.ObjectUtils.nullSafeEquals(Object, Object)
	org.springframework.core.ResolvableType.variableResolverSourceEquals(ResolvableType$VariableResolver)
	org.springframework.core.ResolvableType.equals(Object)
	org.springframework.util.ConcurrentReferenceHashMap$Segment.findInChain(ConcurrentReferenceHashMap$Reference, Object, int)
	org.springframework.util.ConcurrentReferenceHashMap$Segment.doTask(int, Object, ConcurrentReferenceHashMap$Task)
	org.springframework.util.ConcurrentReferenceHashMap.doTask(Object, ConcurrentReferenceHashMap$Task)
	org.springframework.util.ConcurrentReferenceHashMap.put(Object, Object, boolean)
	org.springframework.util.ConcurrentReferenceHashMap.put(Object, Object)
	org.springframework.core.ResolvableType.forType(Type, SerializableTypeWrapper$TypeProvider, ResolvableType$VariableResolver)
	org.springframework.core.ResolvableType.forType(Type, ResolvableType$VariableResolver)
	org.springframework.core.ResolvableType.resolveType()
	org.springframework.core.ResolvableType.resolveClass()
	org.springframework.core.ResolvableType.<init>(Type, SerializableTypeWrapper$TypeProvider, ResolvableType$VariableResolver, ResolvableType)
	org.springframework.core.ResolvableType.forType(Type, SerializableTypeWrapper$TypeProvider, ResolvableType$VariableResolver)
	org.springframework.core.ResolvableType.forType(Type, ResolvableType$VariableResolver)
	org.springframework.core.ResolvableType.forTypes(Type[], ResolvableType$VariableResolver)
	org.springframework.core.ResolvableType.getInterfaces()
	org.springframework.core.ResolvableType.as(Class)<5 recursive calls>
	org.springframework.core.ResolvableType.forMethodParameter(MethodParameter, Type)
	org.springframework.core.ResolvableType.forMethodParameter(MethodParameter)
	org.springframework.core.ResolvableType.forMethodParameter(Method, int, Class)
	org.springframework.core.BridgeMethodResolver.isResolvedTypeMatch(Method, Method, Class)
	org.springframework.core.BridgeMethodResolver.isBridgeMethodFor(Method, Method, Class)
	org.springframework.core.BridgeMethodResolver.searchCandidates(List, Method)
	org.springframework.core.BridgeMethodResolver.findBridgedMethod(Method)
	reactor.spring.beans.factory.config.ConsumerBeanAutoConfiguration$2.doWith(Method)
	org.springframework.util.ReflectionUtils.doWithMethods(Class, ReflectionUtils$MethodCallback, ReflectionUtils$MethodFilter)<4 recursive calls>
	reactor.spring.beans.factory.config.ConsumerBeanAutoConfiguration.findHandlerMethods(Class, ReflectionUtils$MethodFilter)
	reactor.spring.beans.factory.config.ConsumerBeanAutoConfiguration.onApplicationEvent(ContextRefreshedEvent)
	reactor.spring.beans.factory.config.ConsumerBeanAutoConfiguration.onApplicationEvent(ApplicationEvent)
	org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(ApplicationEvent)
	org.springframework.context.support.AbstractApplicationContext.publishEvent(ApplicationEvent)
	org.springframework.context.support.AbstractApplicationContext.finishRefresh()
	org.springframework.context.support.AbstractApplicationContext.refresh()
	org.springframework.boot.SpringApplication.refresh(ApplicationContext)
	org.springframework.boot.SpringApplication.run(String[])
	org.springframework.boot.builder.SpringApplicationBuilder.run(String[])<2 recursive calls>
	org.springframework.xd.dirt.server.SingleNodeApplication.run(String[])
	org.springframework.xd.dirt.stream.StreamTestSupport.startXDSingleNode()
	sun.reflect.NativeMethodAccessorImpl.invoke0(Method, Object, Object[])
	sun.reflect.NativeMethodAccessorImpl.invoke(Object, Object[])
	sun.reflect.DelegatingMethodAccessorImpl.invoke(Object, Object[])
	java.lang.reflect.Method.invoke(Object, Object[])
	org.junit.runners.model.FrameworkMethod$1.runReflectiveCall()
	org.junit.internal.runners.model.ReflectiveCallable.run()
	org.junit.runners.model.FrameworkMethod.invokeExplosively(Object, Object[])
	org.junit.internal.runners.statements.RunBefores.evaluate()
	org.junit.internal.runners.statements.RunAfters.evaluate()
	org.junit.runners.ParentRunner.run(RunNotifier)
	org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecuter.runTestClass(String)
	org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecuter.execute(String)
	org.gradle.api.internal.tasks.testing.junit.JUnitTestClassProcessor.processTestClass(TestClassRunInfo)
	org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(TestClassRunInfo)
	sun.reflect.GeneratedMethodAccessor29.invoke(Object, Object[])
	sun.reflect.DelegatingMethodAccessorImpl.invoke(Object, Object[])
	java.lang.reflect.Method.invoke(Object, Object[])
	org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(MethodInvocation)
	org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(Object)
	org.gradle.messaging.dispatch.ContextClassLoaderDispatch.dispatch(Object)
	org.gradle.messaging.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(Object, Method, Object[])
	com.sun.proxy.$Proxy2.processTestClass(TestClassRunInfo)
	org.gradle.api.internal.tasks.testing.worker.TestWorker.processTestClass(TestClassRunInfo)
	sun.reflect.GeneratedMethodAccessor28.invoke(Object, Object[])
	sun.reflect.DelegatingMethodAccessorImpl.invoke(Object, Object[])
	java.lang.reflect.Method.invoke(Object, Object[])
	org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(MethodInvocation)
	org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(Object)
	org.gradle.messaging.remote.internal.hub.MessageHub$Handler.run()
	org.gradle.internal.concurrent.DefaultExecutorFactory$StoppableExecutorImpl$1.run()
	java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor$Worker)
	java.util.concurrent.ThreadPoolExecutor$Worker.run()
	java.lang.Thread.run()
Test worker [RUNNABLE]
	java.lang.Class.forName0(String, boolean, ClassLoader)
	java.lang.Class.forName(String, boolean, ClassLoader)
	java.lang.reflect.Proxy.getProxyClass0(ClassLoader, Class[])
	java.lang.reflect.Proxy.newProxyInstance(ClassLoader, Class[], InvocationHandler)
	org.springframework.core.SerializableTypeWrapper.forTypeProvider(SerializableTypeWrapper$TypeProvider)
	org.springframework.core.SerializableTypeWrapper$TypeProxyInvocationHandler.invoke(Object, Method, Object[])
	com.sun.proxy.$Proxy9.getActualTypeArguments()
	sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl.equals(Object)
	sun.reflect.GeneratedMethodAccessor8.invoke(Object, Object[])
	sun.reflect.DelegatingMethodAccessorImpl.invoke(Object, Object[])
	java.lang.reflect.Method.invoke(Object, Object[])
	org.springframework.core.SerializableTypeWrapper$TypeProxyInvocationHandler.invoke(Object, Method, Object[])
	com.sun.proxy.$Proxy9.equals(Object)
	org.springframework.util.ObjectUtils.nullSafeEquals(Object, Object)
	org.springframework.core.ResolvableType.equals(Object)
	org.springframework.util.ConcurrentReferenceHashMap$Segment.findInChain(ConcurrentReferenceHashMap$Reference, Object, int)
	org.springframework.util.ConcurrentReferenceHashMap$Segment.getReference(Object, int, ConcurrentReferenceHashMap$Restructure)
	org.springframework.util.ConcurrentReferenceHashMap.getReference(Object, ConcurrentReferenceHashMap$Restructure)
	org.springframework.util.ConcurrentReferenceHashMap.get(Object)
	org.springframework.core.ResolvableType.forType(Type, SerializableTypeWrapper$TypeProvider, ResolvableType$VariableResolver)
	org.springframework.core.ResolvableType.forType(Type, ResolvableType$VariableResolver)
	org.springframework.core.ResolvableType.forTypes(Type[], ResolvableType$VariableResolver)
	org.springframework.core.ResolvableType.getInterfaces()
	org.springframework.core.ResolvableType.as(Class)<4 recursive calls>
	org.springframework.core.ResolvableType.forMethodParameter(MethodParameter, Type)
	org.springframework.core.ResolvableType.forMethodParameter(MethodParameter)
	org.springframework.core.ResolvableType.forMethodParameter(Method, int, Class)
	org.springframework.core.BridgeMethodResolver.isResolvedTypeMatch(Method, Method, Class)
	org.springframework.core.BridgeMethodResolver.isBridgeMethodFor(Method, Method, Class)
	org.springframework.core.BridgeMethodResolver.searchCandidates(List, Method)
	org.springframework.core.BridgeMethodResolver.findBridgedMethod(Method)
	org.springframework.core.annotation.AnnotationUtils.getAnnotation(Method, Class)
	org.springframework.core.annotation.AnnotationUtils.findAnnotation(Method, Class)
	reactor.spring.beans.factory.config.ConsumerBeanAutoConfiguration$1.matches(Method)
	reactor.spring.beans.factory.config.ConsumerBeanAutoConfiguration$2.doWith(Method)
	org.springframework.util.ReflectionUtils.doWithMethods(Class, ReflectionUtils$MethodCallback, ReflectionUtils$MethodFilter)<4 recursive calls>
	reactor.spring.beans.factory.config.ConsumerBeanAutoConfiguration.findHandlerMethods(Class, ReflectionUtils$MethodFilter)
	reactor.spring.beans.factory.config.ConsumerBeanAutoConfiguration.onApplicationEvent(ContextRefreshedEvent)
	reactor.spring.beans.factory.config.ConsumerBeanAutoConfiguration.onApplicationEvent(ApplicationEvent)
	org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(ApplicationEvent)
	org.springframework.context.support.AbstractApplicationContext.publishEvent(ApplicationEvent)
	org.springframework.context.support.AbstractApplicationContext.finishRefresh()
	org.springframework.context.support.AbstractApplicationContext.refresh()
	org.springframework.boot.SpringApplication.refresh(ApplicationContext)
	org.springframework.boot.SpringApplication.run(String[])
	org.springframework.boot.builder.SpringApplicationBuilder.run(String[])<2 recursive calls>
	org.springframework.xd.dirt.server.SingleNodeApplication.run(String[])
	org.springframework.xd.dirt.stream.StreamTestSupport.startXDSingleNode()
	sun.reflect.NativeMethodAccessorImpl.invoke0(Method, Object, Object[])
	sun.reflect.NativeMethodAccessorImpl.invoke(Object, Object[])
	sun.reflect.DelegatingMethodAccessorImpl.invoke(Object, Object[])
	java.lang.reflect.Method.invoke(Object, Object[])
	org.junit.runners.model.FrameworkMethod$1.runReflectiveCall()
	org.junit.internal.runners.model.ReflectiveCallable.run()
	org.junit.runners.model.FrameworkMethod.invokeExplosively(Object, Object[])
	org.junit.internal.runners.statements.RunBefores.evaluate()
	org.junit.internal.runners.statements.RunAfters.evaluate()
	org.junit.runners.ParentRunner.run(RunNotifier)
	org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecuter.runTestClass(String)
	org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecuter.execute(String)
	org.gradle.api.internal.tasks.testing.junit.JUnitTestClassProcessor.processTestClass(TestClassRunInfo)
	org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(TestClassRunInfo)
	sun.reflect.GeneratedMethodAccessor29.invoke(Object, Object[])
	sun.reflect.DelegatingMethodAccessorImpl.invoke(Object, Object[])
	java.lang.reflect.Method.invoke(Object, Object[])
	org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(MethodInvocation)
	org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(Object)
	org.gradle.messaging.dispatch.ContextClassLoaderDispatch.dispatch(Object)
	org.gradle.messaging.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(Object, Method, Object[])
	com.sun.proxy.$Proxy2.processTestClass(TestClassRunInfo)
	org.gradle.api.internal.tasks.testing.worker.TestWorker.processTestClass(TestClassRunInfo)
	sun.reflect.GeneratedMethodAccessor28.invoke(Object, Object[])
	sun.reflect.DelegatingMethodAccessorImpl.invoke(Object, Object[])
	java.lang.reflect.Method.invoke(Object, Object[])
	org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(MethodInvocation)
	org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(Object)
	org.gradle.messaging.remote.internal.hub.MessageHub$Handler.run()
	org.gradle.internal.concurrent.DefaultExecutorFactory$StoppableExecutorImpl$1.run()
	java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor$Worker)
	java.util.concurrent.ThreadPoolExecutor$Worker.run()
	java.lang.Thread.run()
Test worker [RUNNABLE]
	java.lang.Class.getGenericSignature()
	java.lang.Class.getGenericInterfaces()
	org.springframework.core.SerializableTypeWrapper$2.getType()
	org.springframework.core.SerializableTypeWrapper$MethodInvokeTypeProvider.<init>(SerializableTypeWrapper$TypeProvider, Method, int)
	org.springframework.core.SerializableTypeWrapper$TypeProxyInvocationHandler.invoke(Object, Method, Object[])
	com.sun.proxy.$Proxy9.getActualTypeArguments()
	sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl.equals(Object)
	sun.reflect.GeneratedMethodAccessor8.invoke(Object, Object[])
	sun.reflect.DelegatingMethodAccessorImpl.invoke(Object, Object[])
	java.lang.reflect.Method.invoke(Object, Object[])
	org.springframework.core.SerializableTypeWrapper$TypeProxyInvocationHandler.invoke(Object, Method, Object[])
	com.sun.proxy.$Proxy9.equals(Object)
	org.springframework.util.ObjectUtils.nullSafeEquals(Object, Object)
	org.springframework.core.ResolvableType.equals(Object)
	org.springframework.util.ObjectUtils.nullSafeEquals(Object, Object)
	org.springframework.core.ResolvableType.variableResolverSourceEquals(ResolvableType$VariableResolver)
	org.springframework.core.ResolvableType.equals(Object)
	org.springframework.util.ConcurrentReferenceHashMap$Segment.findInChain(ConcurrentReferenceHashMap$Reference, Object, int)
	org.springframework.util.ConcurrentReferenceHashMap$Segment.doTask(int, Object, ConcurrentReferenceHashMap$Task)
	org.springframework.util.ConcurrentReferenceHashMap.doTask(Object, ConcurrentReferenceHashMap$Task)
	org.springframework.util.ConcurrentReferenceHashMap.put(Object, Object, boolean)
	org.springframework.util.ConcurrentReferenceHashMap.put(Object, Object)
	org.springframework.core.ResolvableType.forType(Type, SerializableTypeWrapper$TypeProvider, ResolvableType$VariableResolver)
	org.springframework.core.ResolvableType.forType(Type, ResolvableType$VariableResolver)
	org.springframework.core.ResolvableType.resolveType()
	org.springframework.core.ResolvableType.resolveClass()
	org.springframework.core.ResolvableType.<init>(Type, SerializableTypeWrapper$TypeProvider, ResolvableType$VariableResolver, ResolvableType)
	org.springframework.core.ResolvableType.forType(Type, SerializableTypeWrapper$TypeProvider, ResolvableType$VariableResolver)
	org.springframework.core.ResolvableType.forType(Type, ResolvableType$VariableResolver)
	org.springframework.core.ResolvableType.forTypes(Type[], ResolvableType$VariableResolver)
	org.springframework.core.ResolvableType.getInterfaces()
	org.springframework.core.ResolvableType.as(Class)<5 recursive calls>
	org.springframework.core.ResolvableType.forMethodParameter(MethodParameter, Type)
	org.springframework.core.ResolvableType.forMethodParameter(MethodParameter)
	org.springframework.core.ResolvableType.forMethodParameter(Method, int, Class)
	org.springframework.core.BridgeMethodResolver.isResolvedTypeMatch(Method, Method, Class)
	org.springframework.core.BridgeMethodResolver.isBridgeMethodFor(Method, Method, Class)
	org.springframework.core.BridgeMethodResolver.searchCandidates(List, Method)
	org.springframework.core.BridgeMethodResolver.findBridgedMethod(Method)
	org.springframework.core.annotation.AnnotationUtils.getAnnotation(Method, Class)
	org.springframework.core.annotation.AnnotationUtils.findAnnotation(Method, Class)
	reactor.spring.beans.factory.config.ConsumerBeanAutoConfiguration$1.matches(Method)
	reactor.spring.beans.factory.config.ConsumerBeanAutoConfiguration$2.doWith(Method)
	org.springframework.util.ReflectionUtils.doWithMethods(Class, ReflectionUtils$MethodCallback, ReflectionUtils$MethodFilter)<5 recursive calls>
	reactor.spring.beans.factory.config.ConsumerBeanAutoConfiguration.findHandlerMethods(Class, ReflectionUtils$MethodFilter)
	reactor.spring.beans.factory.config.ConsumerBeanAutoConfiguration.onApplicationEvent(ContextRefreshedEvent)
	reactor.spring.beans.factory.config.ConsumerBeanAutoConfiguration.onApplicationEvent(ApplicationEvent)
	org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(ApplicationEvent)
	org.springframework.context.support.AbstractApplicationContext.publishEvent(ApplicationEvent)
	org.springframework.context.support.AbstractApplicationContext.finishRefresh()
	org.springframework.context.support.AbstractApplicationContext.refresh()
	org.springframework.boot.SpringApplication.refresh(ApplicationContext)
	org.springframework.boot.SpringApplication.run(String[])
	org.springframework.boot.builder.SpringApplicationBuilder.run(String[])<2 recursive calls>
	org.springframework.xd.dirt.server.SingleNodeApplication.run(String[])
	org.springframework.xd.dirt.stream.StreamTestSupport.startXDSingleNode()
	sun.reflect.NativeMethodAccessorImpl.invoke0(Method, Object, Object[])
	sun.reflect.NativeMethodAccessorImpl.invoke(Object, Object[])
	sun.reflect.DelegatingMethodAccessorImpl.invoke(Object, Object[])
	java.lang.reflect.Method.invoke(Object, Object[])
	org.junit.runners.model.FrameworkMethod$1.runReflectiveCall()
	org.junit.internal.runners.model.ReflectiveCallable.run()
	org.junit.runners.model.FrameworkMethod.invokeExplosively(Object, Object[])
	org.junit.internal.runners.statements.RunBefores.evaluate()
	org.junit.internal.runners.statements.RunAfters.evaluate()
	org.junit.runners.ParentRunner.run(RunNotifier)
	org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecuter.runTestClass(String)
	org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecuter.execute(String)
	org.gradle.api.internal.tasks.testing.junit.JUnitTestClassProcessor.processTestClass(TestClassRunInfo)
	org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(TestClassRunInfo)
	sun.reflect.GeneratedMethodAccessor29.invoke(Object, Object[])
	sun.reflect.DelegatingMethodAccessorImpl.invoke(Object, Object[])
	java.lang.reflect.Method.invoke(Object, Object[])
	org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(MethodInvocation)
	org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(Object)
	org.gradle.messaging.dispatch.ContextClassLoaderDispatch.dispatch(Object)
	org.gradle.messaging.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(Object, Method, Object[])
	com.sun.proxy.$Proxy2.processTestClass(TestClassRunInfo)
	org.gradle.api.internal.tasks.testing.worker.TestWorker.processTestClass(TestClassRunInfo)
	sun.reflect.GeneratedMethodAccessor28.invoke(Object, Object[])
	sun.reflect.DelegatingMethodAccessorImpl.invoke(Object, Object[])
	java.lang.reflect.Method.invoke(Object, Object[])
	org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(MethodInvocation)
	org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(Object)
	org.gradle.messaging.remote.internal.hub.MessageHub$Handler.run()
	org.gradle.internal.concurrent.DefaultExecutorFactory$StoppableExecutorImpl$1.run()
	java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor$Worker)
	java.util.concurrent.ThreadPoolExecutor$Worker.run()
	java.lang.Thread.run()

@spring-projects-issues
Copy link
Collaborator Author

Torsten Krah commented

We are seeing this too, test times are ridiculous now with 1.7.0_51 - 1.7.0_45 is fine.

@spring-projects-issues
Copy link
Collaborator Author

Phil Webb commented

Torsten Krah, I have just pushed a fix to master. We are seeing improvements locally with the Spring XD build but it would be good if you could try the latest snapshots (when build 723 https://build.springsource.org/browse/SPR-PUB-723 finishes) and let us know if it also works for you.

@spring-projects-issues
Copy link
Collaborator Author

Torsten Krah commented

Hi Phil, thanks for the update, fix is working for us too.

@spring-projects-issues
Copy link
Collaborator Author

Phil Webb commented

Great! Thanks for testing :)

@spring-projects-issues
Copy link
Collaborator Author

Gary Russell commented

A heads up that this also fixes a Spring Integration issue with 7u51 where the conversion service failed to convert a [Map of Maps of Collections of Foo] to a [Map of Maps of Collections of Bar] (where a FooToBar converter is registered).

This test 1 works with Spring 4.0.0 and 7u45, is broken with 4.0.0 and 7u51, and fixed with 4.0.1.BUILD-SNAPSHOT.

@spring-projects-issues
Copy link
Collaborator Author

Phil Webb commented

Cheers Gary!

@spring-projects-issues
Copy link
Collaborator Author

spring-projects-issues commented May 1, 2014

Charles O'Farrell commented

In addition to just performance we (Atlassian Stash) saw a memory leak (#16021) when the same proxied object was added to the ConcurrentReferenceHashMap continuously on each page load.

Just mentioning that here for completeness (I had to spend a while tracking down the exact commit that fixed it).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
in: core Issues in core modules (aop, beans, core, context, expression) type: bug A general bug
Projects
None yet
Development

No branches or pull requests

2 participants