Skip to content

Improve performance of #getBeanNamesForType() while the BeanFactory configuration is not yet frozen [SPR-13610] #18188

Closed
@spring-projects-issues

Description

@spring-projects-issues

Steffen Ryll opened SPR-13610 and commented

We have a pretty large ApplicationContext with about 7600 Beans and startup times have become an issue, now at 5.5 min just for the ApplicationContext. We observed that all the steps in AbstractApplicationContext#refresh before #preInstantiateSingletons() is called take about 90 seconds (excluding the time it takes to load all bean definition XML files). About 81 seconds of that time seems to be spent in the method DefaultListableBeanFactory#getBeanNamesForType.

In order to better understand where time is spent, we've build a wrapper around DefaultListableBeanFactory that measures the execution time of calls to #createBean, #getBeanNamesForType and #applyBeanPostProcessors*Initialization/Instantiation. This is the tooling we used to get the numbers mentioned above.

Closer inspection shows that runtime performance of #getBeanNamesForType depends heavily on the flag #isConfigurationFrozen - as long as it is set to false during AppCtx refresh, each call takes about 10 seconds, when it is set to true, calls typically take only ~100 ms.

A particular issue seems to me, that #getBeanNamesForType is called at least three times for the type BeanDefinitionRegistryPostProcessor, so that's more than 30 seconds in our scenario. I found that this has been implemented as part of #15258, and comments in the code of PostProcessorRegistrationDelegate indicate that calling it three times is "by design". But that seems like a waste of time to me, given that these calls take rather long.

Please let's discuss which optimizations would be feasible here within the boundaries of the involved interface contracts.


Affects: 4.0.7, 4.2.1

Issue Links:

4 votes, 10 watchers

Metadata

Metadata

Assignees

Labels

in: coreIssues in core modules (aop, beans, core, context, expression)status: duplicateA duplicate of another issuetype: enhancementA general enhancement

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions