Ускоряем время запуска Spring Boot: ограничиваем сканирование
Быстрый ответ
Для того, чтобы ускорить инициализацию Spring Boot, включите отложенную инициализацию, установив значение spring.main.lazy-initialization=true
. Избавьтесь от неиспользуемых автоконфигураций, добавив их в исключения через параметр spring.autoconfigure.exclude
. А для ускорения загрузки используйте ключи JVM -Xverify:none
или -noverify
, которые позволяют пропустить процесс верификации классов.
spring:
main:
lazy-initialization: true // Лень – мать прогресса?
autoconfigure:
exclude: // Оставьте в проекте только то, что действительно нужно!
– org.springframework.boot.autoconfigure... // Нет места лишнему!
Применяя отложенную инициализацию, отсекая лишние автоконфигурации и корректируя настройки JVM, вы существенно сократите время старта приложения.
Экономим время и ресурсы
Оптимизация classpath
Сократите classpath до основного набора классов, чтобы ускорить установку приложения. Воспользуйтесь spring-boot-thin-launcher
для создания оптимизированного и легковесного jar файла.
Мониторинг времени загрузки
Для контроля и корректировки времени запуска приложения используйте инструмент JMH (Java Microbenchmark Harness). Он поможет выявить и устранить узкие места.
Оптимизация конфигурационных файлов
Aктуализируйте настройки spring.config.location
для эффективной работы с файлами свойств и создайте профили для определённых типов свойств, чтобы ускорить процесс загрузки.
Анализ инициализации бинов
Для ретроспективного анализа времени инициализации бинов можно использовать LazyInitBeanFactoryPostProcessor
. Это будет особенно полезно в старых версиях Spring.
Настройка системы логирования
Настройка различных уровней логирования в разных пакетах позволяет сфокусироваться на ключевых моментах в процессе отладки и сократить время запуска.
Визуализация
Запуск вашего приложения на Spring Boot можно представить в виде поезда:
🚂 = Приложение Spring Boot
🛤️ = Время запуска
📦 = Автоконфигурации
Если сократить количество автоконфигураций, воспользоваться отложенной загрузкой и корректно распределить конфигурационные файлы между различными профилями, то время запуска приложения существенно сократится:
До оптимизации:
🚂📦📦📦📦📦📦🛤️🛤️🛤️🛤️🛤️🛤️ -> Все тащим за собой, едем неспешно...
После оптимизации:
🚂📦🛤️🛤️🛤️ -> Экспресс-старт отсчитывает обратный отчет: 3...2...1... 🚀
Вывод:
🚂 + 🛤️ = 🏁 Ваше приложение должно стартовать так же быстро, как гончий автомобиль 🏎️!
Дополнительные способы оптимизации и ускорения
Повышение скорости разрешения имен хостов
Оптимизация процесса работы с DNS сервисами позволит облегчить старт и увеличить производительность, как если бы вы ехали по свободной трассе.
Возможности, предоставляемые Spring Boot версии 2.4.0
Spring Boot 2.4.0 предлагает новые методы анализа и оптимизации процесса загрузки.
Подбор JSON-парсера
Рассмотрите возможность использования Gson вместо Jackson для потенциального ускорения обработки JSON.
Ускорение сканирования classpath
Применение spring-context-indexer
позволит сканировать classpath быстрее и ускорить инициализацию бинов.
Безопасная работа с JMX
Если JMX не используется, для улучшения производительности его стоит отключить, установив spring.jmx.enabled=false
.
Полезные материалы
- Production-ready Features – Справочник по оптимизации Spring Boot.
- GitHub – Spring Boot Thin Launcher for Memory Efficiency – Инструмент для снижения ресурсоёмкости и увеличения скорости загрузки приложений.
- Java HotSpot VM Options – Руководство по настройке JVM.
- The Definitive Guide to Spring Boot Lazy Initialization – Гайд по реализации ленивой инициализации в Spring Boot.
- Stack Overflow: Tips to speed up Spring Boot apps – Советы по ускорению Spring Boot от опытных разработчиков.