spring 版本3.1.2
1. spring 并没有缓存 class -> beanDifinition 或者 sington 实例的缓存.
2. 只能先获取所有的beanDifitions [ 含 sington 和 prototype ] + 所有manually registered的 bean
3. getBeanDefinitionNames 这里有锁,性能较差.
原因, 线程阻塞,线程池耗尽, 外部请求耗时都比较少,但是最终返回耗时都比较高.
这种极有可能 1. 某些 io 调用耗时增加(未监控) 2. 线程池满等待 3. tcp 复用等待 4.swap 耗时等待 5.gc 耗时
查看 jstack pid, 发现很多阻塞在 getBean 上,
public String[] getBeanDefinitionNames() { synchronized (this.beanDefinitionMap) { if (this.frozenBeanDefinitionNames != null) { return this.frozenBeanDefinitionNames; } else { return StringUtils.toStringArray(this.beanDefinitionNames); } } }