分析弹簧容器以了解如何优化其启动时间的最佳方法是什么?

我有一个应用程序变得相当大,Spring启动时间约为20秒。对于生产用途来说,这很好,但对于开发来说,这是一个很大的痛苦。

什么是一个好的分析工具或方法,可以准确地为我提供我需要的信息,以弄清楚什么花了这么长时间?也许这是我可以优化的东西?

我的应用程序是一个相当典型的弹簧/休眠Web应用程序。大约有50个数据库表和几百个bean(如200-300...我没有数)。有几种@Configurable豆。大量的组件扫描。我也在使用Spring Security。

我用log4j做了一些原始的分析 - 只是在INFO设置下。以下是一些需要花费一些时间的事情:

  • Info 默认可听 BeanFactory:555 - 预实例化单例 - 2 秒
  • INFO 会话工厂示例:202 - 构建会话工厂 - 2 秒
  • INFO HibernateTransactionManager:415 - Using DataSource [com.mchange.v2.c3p0.ComboPooledDataSource......] 的 Hibernate SessionFactory for HibernateTransactionManager - 7 秒

有几件事最多需要0.5到1秒,但这3件事是最大的。


答案 1

您可以尝试的一个选项是使用默认的懒惰初始化选项来懒惰地初始化 bean。Spring 在初始化期间初始化所有单例作用域 Bean。阅读参考文档懒惰实例化 Bean 部分。

请确保参数化该值,以便在开发期间将其更改为 true,在生产部署期间将其更改为 false。

组件扫描速度慢。请参阅此帖子,了解如何在使用自动布线时禁用此功能。


答案 2

我感到难过的是,到目前为止,所有的答案都集中在如何提高性能上,而实际上都没有帮助你进行分析。我已经使用YourKit在其他分析问题中取得了很好的效果,但无法说明它在Spring启动中的有用性。

我已经成功地将我的弹簧配置拆分为单独的文件,并且只加载特定测试所需的文件。这对我来说特别有效,因为我使用的是Camel,它开始很昂贵,而且我的大多数测试都没有使用。我一直在使用H2,这样我就可以对数据库运行DAO +服务的测试,而无需任何复杂的启动/关闭(尽管需要一段时间才能将所有连接在一起)。但是,我仍然无法启动整个应用程序进行交互式测试。这对我来说也很慢。


推荐