CAS v7.0.0重启间歇性死锁问题求助(从v6.6.2迁移后)
CAS v7.0.0重启间歇性卡顿与死锁问题求助
近期将应用从CAS v6.6.2迁移至v7.0.0后,遇到重启时间歇性卡顿的问题,线程dump中检测到明确的死锁。
已尝试以下解决方案,但均无效果:
- 设置lazy initialization为false
- 创建过滤器在启动阶段拦截所有请求
- 延迟Dispatcher Servlet初始化
目前怀疑问题根源在于CAS v7.0.0中广泛使用的@RefreshScope与@Lazy注解组合,该判断基于Spring相关Issue中的死锁场景——其附件里的死锁情况与我们的线程dump完全一致。
线程dump堆栈信息如下:
Found one Java-level deadlock: ============================= "Thread-10": waiting to lock monitor 0x000000001fec2c78 (object 0x000000076fd80250, a java.lang.String), which is held by "Thread-5" "Thread-5": waiting to lock monitor 0x000000001be39628 (object 0x000000076fd7ba88, a java.util.concurrent.ConcurrentHashMap), which is held by "Thread-10" Java stack information for the threads listed above: =================================================== "Thread-10": at org.springframework.cloud.context.scope.GenericScope$BeanLifecycleWrapper.getBean(GenericScope.java:380) - waiting to lock <0x000000076fd80250> (a java.lang.String) at org.springframework.cloud.context.scope.GenericScope.get(GenericScope.java:183) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:350) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) at org.springframework.aop.target.SimpleBeanTargetSource.getTarget(SimpleBeanTargetSource.java:35) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:673) at my.project.name.RefreshScopeDeadLock$FakeSampler$$EnhancerBySpringCGLIB$$212b6f8d.doSomething(<generated>) at my.project.name.RefreshScopeDeadLock$InCreationBean.accessFakesampler(RefreshScopeDeadLock.java:99) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleElement.invoke(InitDestroyAnnotationBeanPostProcessor.java:365) at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleMetadata.invokeInitMethods(InitDestroyAnnotationBeanPostProcessor.java:308) at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:135) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:422) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1694) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:579) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:501) at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:317) at org.springframework.beans.factory.support.AbstractBeanFactory$$Lambda$8/556529265.getObject(Unknown Source) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228) - locked <0x000000076fd7ba88> (a java.util.concurrent.ConcurrentHashMap) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:315) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:224) at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1015) at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:339) at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:334) at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1107) at my.project.name.RefreshScopeDeadLock.lambda$0(RefreshScopeDeadLock.java:27) at my.project.name.RefreshScopeDeadLock$$Lambda$57/1367937032.run(Unknown Source) at java.lang.Thread.run(Thread.java:748) "Thread-5": at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:185) - waiting to lock <0x000000076fd7ba88> (a java.util.concurrent.ConcurrentHashMap) at org.springframework.beans.factory.support.AbstractBeanFactory.isTypeMatch(AbstractBeanFactory.java:490) at org.springframework.beans.factory.support.DefaultListableBeanFactory.doGetBeanNamesForType(DefaultListableBeanFactory.java:427) at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanNamesForType(DefaultListableBeanFactory.java:398) at org.springframework.beans.factory.BeanFactoryUtils.beanNamesForTypeIncludingAncestors(BeanFactoryUtils.java:208) at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1276) at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1101) at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1065) at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:815) at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:721) at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:470) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1250) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1099) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:541) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:501) at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$1(AbstractBeanFactory.java:353) at org.springframework.beans.factory.support.AbstractBeanFactory$$Lambda$59/1420933976.getObject(Unknown Source) at org.springframework.cloud.context.scope.GenericScope$BeanLifecycleWrapper.getBean(GenericScope.java:382) - locked <0x000000076fd80250> (a java.lang.String) at org.springframework.cloud.context.scope.GenericScope.get(GenericScope.java:183) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:350) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) at org.springframework.aop.target.SimpleBeanTargetSource.getTarget(SimpleBeanTargetSource.java:35) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:673) at my.project.name.RefreshScopeDeadLock$FakeSampler$$EnhancerBySpringCGLIB$$212b6f8d.doSomething(<generated>) at my.project.name.RefreshScopeDeadLock$AlreadyCreatedBean.accessFakesampler(RefreshScopeDeadLock.java:85) at my.project.name.RefreshScopeDeadLock$$Lambda$56/575935098.run(Unknown Source) at java.lang.Thread.run(Thread.java:748) Found 1 deadlock.
恳请各位提供可行的解决方案。
内容的提问来源于stack exchange,提问作者Shavi Teotia
相关产品推荐
相关产品推荐

