Где обычно «течёт» производительность
В Spring Boot узкие места редко сидят в «магии» фреймворка. Чаще это: блокирующие вызовы в event-loop (если WebFlux смешан с JDBC), раздутый heap из‑за кэшей, медленные SQL без индексов, слишком маленький/большой connection pool и отсутствие таймаутов на исходящих HTTP-клиентах.
Пулы соединений и таймауты
Для HikariCP держите размер пула близким к формуле ~ connections = ((core_count * 2) + effective_spindle_count) для классических БД, но всегда проверяйте метриками. Обязательны:
connectionTimeout,maxLifetime;- query timeout / statement timeout на уровне БД;
- таймауты RestClient/WebClient (connect + read).
spring.datasource.hikari.maximum-pool-size=20
spring.datasource.hikari.connection-timeout=3000
spring.mvc.async.request-timeout=10s
Кэширование
Локальный Caffeine — для горячих справочников. Redis — когда нужен общий кэш между репликами. Всегда продумывайте инвалидацию и TTL, иначе получите stale reads. Для read-heavy API кэш на уровне сервиса часто даёт больший эффект, чем микрооптимизации JSON-сериализации.
JVM и контейнеры
На JDK 21 используйте контейнерные флаги (MaxRAMPercentage), следите за GC (G1 по умолчанию, ZGC — для low-latency сценариев). Virtual threads (Project Loom) хорошо помогают в high-concurrency blocking I/O на Spring MVC, но не заменяют нормальные индексы в БД.
Профилирование вместо догадок
Перед «оптимизацией» измерьте: Micrometer timers, p95/p99 latency, pool usage, GC logs. Async Profiler / JFR показывают hot methods. Нагрузочные тесты (k6, Gatling) на staging с продоподобными данными спасают от сюрпризов после релиза.
Старт и прогрев
Скорость старта важна в Kubernetes (scale-out, rolling update). Spring AOT, CDS/AppCDS и аккуратный exclusion автоконфигурации заметно сокращают cold start — об этом регулярно пишут команда Spring и инженеры платформ на Habr. Для scale-to-zero смотрят в сторону GraalVM native, понимая trade-offs по рефлексии и build time.
Вывод
Оптимизация Spring Boot — это дисциплина измерений: пулы, таймауты, кэш, SQL, JVM в контейнере и профилирование. Начните с SLO и метрик — код «ускорять» нужно только там, где это видно на графиках.
